1import{a as Oh,s as Gh,u as qh,p as Wh,h as Hh}from"./runtime-chunk-DWJBFUZW-C7osRGzE.js";import{I as jh,F as $h,B as so,M as Kh,V as Xh,k as hn,A as ad,n as Qh,K as Zh,W as rd,U as Yh}from"./runtime-chunk-6Z7YLZCH-nwhLNzvi.js";import{n as Jh}from"./runtime-chunk-CVUJ3GMH-z0EVCgfT.js";import"./runtime-chunk-QK72454A-DGGYpcZr.js";import"./runtime-chunk-CE3IVQOC-DhsFL-ZI.js";import{a as em,e as mn}from"./runtime-chunk-NYOF3PNR-D8HXUFWg.js";import{F as U,i as ke,N as c,E as w,f as X,h as na,T as ae,j as mt,k as Ws,l as sd,m as ql,o as io,p as il,q as Wl,t as tm,u as am,O as nl,J as ll,x as Es,s as ie,z as rm,H as id,A as cn,d as xe,I as sm,B as Hl,D as Ta,G as no,K as dt,L as im,M as nd,Q as nm,Z as lm,U as om,X as um,$ as dm,_ as hm,a0 as lo,P as B,a1 as ld,a2 as od,a3 as we,a4 as mm,a5 as ud,a6 as da,a7 as L,a8 as cm,a9 as pm,aa as W,ab as ge,ac as ol,ad as wr,ae as pn,c as re,v as Ie,R as P,af as fm,b as Se,ag as gm,ah as _m,W as dd,w as A,g as Q,y as q,r as Ze,ai as Ae,aj as Zt,ak as qa,al as ym,am as xm,Y as kt,an as Er,ao as Hs,ap as Ja,aq as N,ar as f
vendor: 23,004 bytes, line 1
1s,as as Sr,at as aa,au as vm,av as bm,aw as cr,ax as Tm,ay as jl,az as js,aA as $s,aB as _t,aC as $l,aD as hd,aE as wm,aF as Sm,aG as fn,aH as gn,aI as Ji,aJ as hr,aK as md,V as de,aL as Ma,aM as Xa,aN as Vm,aO as Fa,aP as Mm,aQ as Kl,aR as Cm,aS as Rm,aT as zm,aU as km,aV as Am,aW as ul,aX as Pm,aY as Em,aZ as Nm,e as cd,a_ as We,a$ as J,b0 as pd,b1 as mr,b2 as ha,b3 as Bm,b4 as Ea,n as Ne,b5 as Gi,b6 as Pr,b7 as Fm,b8 as Lm,b9 as Ks,ba as Im,bb as dl,bc as Dm,bd as Um,be as Om,bf as Gm,bg as Ys,bh as qm,bi as Wm,bj as oo,bk as _n,bl as sa,bm as Nr,bn as fd,bo as Ls,bp as Xl,bq as Hm,br as jm,bs as $m,bt as gd,bu as qi,bv as Ca,bw as pr,bx as ra,by as Ql,bz as Km,bA as Xm,bB as Qm,bC as Kt,bD as Zm,bE as Ym,bF as La,bG as Js,bH as Jm,bI as uo,bJ as ec,bK as tc,bL as yn,bM as ac,bN as gs,bO as rc,bP as sc,bQ as ho,bR as ic,bS as Yr,bT as nr,bU as Jr,bV as ir,bW as ts,bX as nc,bY as lc,bZ as oc,b_ as uc,b$ as dc,c0 as hc,c1 as mc,c2 as cc,c3 as pc,c4 as fc,c5 as gc,c6 as _c,c7 as Le,c8 as ft,c9 as fa,ca as Qe,cb as Vr,cc as hl,cd as va,ce as Aa,cf as xn,cg as Br,ch as yc,ci as vn,cj as bn,ck as _s,cl as Ni,cm as _d,cn as xc,co as vc,cp as bc,cq as mo,cr as Tc}from"./runtime-chunk-TN7SLRFX-C7LyGstI.js";import{r as wc}from"./runtime-chunk-GFTBNL2W-Dz-r1c36.js";import{S as Sc,b as Vc,M as co,f as Mc,F as Fr,I as Tn,j as Cc,H as Lr,B as Rc,O as po}from"./runtime-chunk-WW7RRGKX-D4jxJ3mf.js";import{k as zc,l as kc,Q as Ac,Y as fo,m as ni,s as Pc,w as yd,x as wn,z as Zl,B as xd,V as Ec,C as Xs,H as Lt,b as Nc,P as Bc,G as ve,I as fr,J as wa,L as Oe,j as Ee,v as at,e as Bi,N as Sn,O as Fc,W as ml,S as Fi,U as Lc,X as Ic,_ as Dc,a0 as go,a1 as _o,a2 as is,a3 as cl,a4 as pl,T as At,a5 as Cr,a6 as li,a7 as yo,a8 as Vn,a9 as Li,aa as xo,r as gt,K as ne,ab as Uc,ac as Oc,ad as Gc,ae as qc,af as Wc,D as Yl,ag as Hc,ah as lr,ai as Xt,p as Ft,aj as Oa,f as Ve,ak as jc,al as $c,A as Ra,am as Kc,an as Ua,ao as Sa,ap as en,aq as or,ar as Xc,as as Qc,at as Zc,au as Yc,av as vo,aw as bo,a as Jc,ax as vd,ay as ep,az as fl,aA as tp,aB as ap,h as bd,q as Td,Z as wd,aC as To,aD as Sd,aE as Mn,aF as rp,aG as ns,aH as Cn,aI as sp,aJ as ip,aK as np,aL as lp,aM as op,aN as up,aO as dp,aP as hp,aQ as mp,aR as cp,aS as Jl}from"./runtime-updater-QYT2D73O-BtKMVVIm.js";import{u as wo,f as So}from"./runtime-chunk-UIRA2CWJ-BOAtg-Ug.js";import"./index-DRDCutkc.js";var pp=[[.478712,.875764],[-.337956,-.793959],[-.955259,-.028164],[.864527,.325689],[.209342,-.395657],[-.106779,.672585],[.156213,.235113],[-.413644,-.082856],[-.415667,.323909],[.141896,-.93998],[.954932,-.182516],[-.766184,.410799],[-.434912,-.458845],[.415242,-.078724],[.728335,-.491777],[-.058086,-.066401],[.20299,.686837],[-.808362,-.556402],[.507386,-.640839],[-.723494,-.22924],[.48974,.317826],[-.622663,.765301],[-.01064,.929347],[.663146,.647618],[-.096674,-.413835],[.525945,-.321063],[-.122533,.366019],[.195235,-.687983],[-.563203,.098748],[.418563,.561335],[-.378595,.800367],[.826922,.001024],[-.085372,-.766651],[-.92192,.183673],[-.590008,-.721799],[.167751,-.164393],[.032961,-.56253],[.6329,-.107059],[-.46408,.569669],[-.173676,-.958758],[-.242648,-.234303],[-.275362,.157163],[.382295,-.795131],[.562955,.115562],[.190586,.470121],[.770764,-.297576],[.237281,.93105],[-.666642,-.455871],[-.905649,-.298379],[.33952,.157829],[.701438,-.7041],[-.062758,.160346],[-.220674,.957141],[.642692,.432706],[-.77339,-.015272],[-.671467,.24688],[.158051,.062859],[.806009,.527232],[-.05762,-.247071],[.333436,-.51671],[-.550658,-.315773],[-.652078,.589846],[.008818,.530556],[-.210004,.519896]],Vd=L(new gt(1,1,1)).setGroup(Ys),Md=L(.1).setGroup(Ys),Cd=L(2e3).setGroup(Ys),Ii=L(0).setGroup(Ys),Rd=L(new ne(.005,.01,0)).setGroup(Ys),zd=U(([e,t,a,r])=>{let s=r.x,i=r.y,n=a.y.sub(r.z),l=s.mul(i.mul(n).negate().clamp(-60,60).exp()),o=i.mul(e.y).clamp(-60,60).toVar(),u=Se(o.greaterThanEqual(0),c(1),c(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(c(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),fp=U(()=>{let e=Ca.sub(pr).toVar(),t=e.length().max(1e-6);return zd(e,t,pr,Rd)}),gp=(()=>{let e=c(1).sub(Ne(.5,Ii)).add(Ne(1.5,Ii)),t=Ne(.5,Ii),a=c(1).sub(c(1).sub(Om(Md,Cd).mul(e)).mul(c(1).sub(fp().mul(t))));return Gm(Vd,a)})();function Vo(e){let{fog:t,backupFog:a}=e,r=[e,e.scene!==e?e.scene:void 0];if(t!=null&&a!==void 0){for(let s of r)s&&(s.fogNode=gp);Vd.value.copy(a.color),Md.value=a.near,Cd.value=a.far,Ii.value=lr.getModeIndex({mode:e.fogMode}),Rd.value.set(e.fogDensity??lr.getDensity({}),e.fogHeightFalloff??lr.getHeightFalloff({}),e.fogHeightBase??lr.getHeightBase({}))}else if(t===null)for(let s of r)s?.fogNode&&(s.fogNode=null)}var Mo=e=>e,_p=e=>e,Co=e=>e,Rn=(e,t,a)=>J(e.add(.5).mul(t)).add(.5).div(a),Ir=new kt,yp=new gt,xp=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=L(new Ra),this._isOrtho=L(0),this._resolution=L(new ve(1,1)),this._fullResolution=L(new ve(1,1)),this._radiusOfInfluence=L(128),this._radiusInScreenSpace=L(1),this._exponent=L(1),this._aoColor=L(new gt(0,0,0)),this._bias=L(.5),this._frame=L(0),this._fogEnabled=L(0),this._fogNear=L(1),this._fogFar=L(1e3),this._fogMode=L(0),this._fogHeightParams=L(new ne(.005,.01,0)),this._cameraWorldMatrix=L(new Ra);let e=new ke;e.name="SplineHBAO.gbuffer",e.side=is,e.fragmentNode=P(na.mul($l),1),e.lights=!1,e.blending=Ft,e.needsUpdate=!0,this._normalMaterial=e}_ensureTarget(e,t,a,r){return e&&e.width===t&&e.height===a?{target:e,changed:!1}:(e?.dispose(),{target:r(),changed:!0})}_buildHBAOMaterial(e,t){let a=re(this._gBuffer.depthTexture),r=re(this._gBuffer.texture),s=re(t),i=this._projectionMatrixInverse,n=this._isOrtho,l=this._resolution,o=this._fullResolution,u=this._radiusOfInfluence,d=this._radiusInScreenSpace,m=this._exponent,h=this._aoColor,f=this._bias,p=this._frame,_=this._fogEnabled,y=this._fogNear,g=this._fogFar,x=this._fogMode,v=this._fogHeightParams,V=this._cameraWorldMatrix,T=e.reversedDepthBuffer===!0,z=R=>a.sample(R),b=(R,k)=>pd(R,k,i),M=R=>b(R,z(R)),S=U(()=>{let R=Ie().toVar(),k=l,E=o,I=J(R.mul(k)).toVar(),D=E.div(k).toVar(),H=Rn(I,D,E).toVar(),K=z(H).toVar(),O=b(H,K).toVar(),j=ae(r.sample(H).xyz).toVar(),Z=Q(d.div(X(O.z.negate(),c(1),n)),c(5)).toVar(),$=aa(N(da.xy.x).bitAnd(N(127)),N(da.xy.y).bitAnd(N(127))),me=s.load($).xyz.x,ue=Ae(me.add(c(.61803398875).mul(p))).mul(6.283),ce=ha(ue).toVar(),Me=Zt(ue).toVar(),fe=Z.div(5).toVar(),Te=c(0).toVar();for(let bt=0;bt<4;bt++){let Fe=fe.add(1).toVar();for(let ze=0;ze<4;ze++){let[Ke,ye]=pp[4*bt+ze],it=A(ce.mul(Ke).sub(Me.mul(ye)),Me.mul(Ke).add(ce.mul(ye))),ma=_p(I.add(Bm(it.mul(Fe)))).toVar(),Pe=Co(M(Rn(ma,D,E))).toVar();Fe.addAssign(fe);let Wt=Co(Pe.sub(O)).toVar(),la=Mo(Wt.dot(Wt)).toVar(),oa=Ea(la),nt=Mo(j.dot(Wt)).div(Q(oa,c(1e-4))),Tt=la.mul(c(-1).div(u.mul(u))).add(1);Te.addAssign(ie(nt.sub(f),0,1).mul(ie(Tt,0,1)))}}let Be=c(1).div(c(1).sub(f));Te.mulAssign(Be.div(16));let $e=ie(c(1).sub(Te.mul(2)),0,1),Ge=Ma($e,m).toVar(),Ye=T?K.lessThanEqual(0):K.greaterThanEqual(1);Ge.assign(Ye.select(c(1),Ge));let Ue=w(X(h,w(1),Ge)).toVar(),wt=Ze(y,g,O.z.negate()),Yt=V.mul(P(O,1)).xyz,rt=V.mul(P(0,0,0,1)).xyz,yt=Yt.sub(rt).toVar(),It=zd(yt,yt.length().max(1e-6),rt,v),Re=x,st=c(1).sub(Ne(.5,Re)).add(Ne(1.5,Re)),De=Ne(.5,Re),qt=c(1).sub(c(1).sub(wt.mul(st)).mul(c(1).sub(It.mul(De)))).mul(_);return Ue.assign(X(Ue,w(1),qt)),P(Ue,1)}),C=new ke;return C.name="SplineHBAO.hbao",C.colorNode=S(),C.depthTest=!1,C.depthWrite=!1,C.blending=Ft,C.needsUpdate=!0,C}_buildResolveMaterial(){let e=re(this._aoBuffer.texture),t=re(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=U(()=>{let n=Ie().toVar(),l=a,o=r,u=A(c(1).div(l.x),c(1).div(l.y)).toVar(),d=n.sub(u.mul(.5)).toVar(),m=d.add(A(u.x,0)).toVar(),h=d.add(A(0,u.y)).toVar(),f=d.add(u).toVar(),p=t.sample(n).toVar(),_=o.div(l).toVar(),y=M=>t.sample(Rn(M,_,o)),g=J(d.mul(l)).toVar(),x=p.sub(y(g)).abs().toVar(),v=p.sub(y(g.add(A(1,0)))).abs().toVar(),V=p.sub(y(g.add(A(0,1)))).abs().toVar(),T=p.sub(y(g.add(A(1,1)))).abs().toVar(),z=x.min(v).min(V).min(T).toVar(),b=f.toVar();return b.assign(z.equal(V).select(h,b)),b.assign(z.equal(v).select(m,b)),b.assign(z.equal(x).select(d,b)),e.sample(b)}),i=new ke;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Ft,i.needsUpdate=!0,i}render(e,t,a,r,s,i){let n=i.width,l=i.height,o=r.aoFullRes!==!0,u=o?.5:1,d=Math.max(1,Math.round(n*u)),m=Math.max(1,Math.round(l*u)),h=this._hbaoMaterial===null,f=this._ensureTarget(this._gBuffer,n,l,()=>new Ee(n,l,{type:At,depthTexture:new Cr(n,l),minFilter:Ve,magFilter:Ve}));if(this._gBuffer=f.target,h=h||f.changed,o){let C=this._ensureTarget(this._aoBuffer,d,m,()=>new Ee(d,m,{minFilter:Ve,magFilter:Ve,depthBuffer:!1}));this._aoBuffer=C.target,h=h||C.changed}h=h||this._boundBlueNoise!==s;let p=o;(h||p&&this._resolveMaterial===null)&&(this._hbaoMaterial?.dispose(),this._resolveMaterial?.dispose(),this._hbaoMaterial=this._buildHBAOMaterial(e,s),this._resolveMaterial=p?this._buildResolveMaterial():null,this._boundBlueNoise=s);let _=a,y=_.projectionMatrix.elements,g=y[11]===0;if(this._projectionMatrixInverse.value.copy(_.projectionMatrixInverse),this._isOrtho.value=g?1:0,this._resolution.value.set(d,m),this._fullResolution.value.set(n,l),this._radiusOfInfluence.value=r.radius,g){let C=2/y[5];this._radiusInScreenSpace.value=r.radius*(m/C*.5)}else{let C=m*y[5]/2;this._radiusInScreenSpace.value=.5*r.radius*C}this._bias.value=r.bias,this._aoColor.value.setRGB(r.aoColor.r,r.aoColor.g,r.aoColor.b),this._fogEnabled.value=r.fogEnabled?1:0,this._fogNear.value=r.fogNear,this._fogFar.value=r.fogFar,this._fogMode.value=r.fogMode,this._fogHeightParams.value.set(r.fogDensity,r.fogHeightFalloff,r.fogHeightBase),this._cameraWorldMatrix.value.copy(a.matrixWorld),this._frame.value=this._frameIndex,this._frameIndex++;let x=e,v=t,V=v.overrideMaterial,T=x.getRenderTarget(),z=x.getMRT(),b=x.getClearColor(yp),M=x.getClearAlpha(),S=a.layers.mask;a.layers.set(5),v.overrideMaterial=this._normalMaterial,x.setMRT(null),x.setClearColor(0,0),x.setRenderTarget(this._gBuffer),x.render(t,a),v.overrideMaterial=V,a.layers.mask=S,Ir.material=this._hbaoMaterial,Ir.name="SplineHBAO.hbao",x.setRenderTarget(o?this._aoBuffer:i),Ir.render(e),o&&(Ir.material=this._resolveMaterial,Ir.name="SplineHBAO.resolve",x.setRenderTarget(i),Ir.render(e)),x.setRenderTarget(T),x.setMRT(z),x.setClearColor(b,M)}dispose(){this._gBuffer?.dispose(),this._gBuffer=null,this._aoBuffer?.dispose(),this._aoBuffer=null,this._normalMaterial.dispose(),this._hbaoMaterial?.dispose(),this._hbaoMaterial=null,this._resolveMaterial?.dispose(),this._resolveMaterial=null,this._boundBlueNoise=null}},Ga={texture:null,version:0,rotation:new zc,quality:"full"},Wi=new Set;function Is(e){let t=Ga.texture,a=e.lights&&e.category==="physical"&&t!==null&&(Ga.quality==="full"||e.envReflectiveInLow?.()!==!1),r=e.envNode instanceof Qs;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new Qs(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var Ro=new WeakMap;function zo(e,t){let a=null;return{getUV:()=>{if(a===null){let r=Ks.negate().reflect(t);r=Im(e).mix(r,t),r=r.normalize(),a=r.transformDirection(dl)}return a},getTextureLevel:()=>e}}var Qs=class extends wm{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=(function(n){let l=Ro.get(n);return l===void 0&&(l=Sm(n),Ro.set(n,l)),l})(this.sourceTexture),a=e.context,r=t.context(zo(id,na)).mul(fn);a.radiance.addAssign(new gn(r));let s=t.context({getUV:()=>Ji,getTextureLevel:()=>c(1)}).mul(Math.PI).mul(fn);a.iblIrradiance.addAssign(new gn(s));let i=a.lightingModel?.clearcoatRadiance;if(i){let n=t.context(zo(nd,Dm)).mul(fn);i.addAssign(new gn(n))}return null}},gl=class extends Qc{},vp=class extends Rm{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof Qs?null:super.setup(e)}},Hi=e=>e,ko=e=>e,bp=e=>e,Tp=e=>e,_l=.25,wp=256/(2*Math.PI),kd=(e,t,a,r,s)=>{let i=w(0).toVar();return B(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let n=w(0).toVar(),l=c(0).toVar();for(let o=0;o<12;o++){let u=Math.sqrt((o+.5)/12),d=2.399963229728653*o,m=u*Math.cos(d),h=u*Math.sin(d),f=Math.exp(-2.5*u*u),p=bp(Tp(e.sample(A(Hi(t.x).add(a.mul(m)),Hi(t.y).add(a.mul(h)))).level(s)).rgb);n.addAssign(p.mul(f)),l.addAssign(c(f))}i.assign(n.div(l))}),i},Xr=(e,t,a,r)=>{let s=P(t.mul(2).sub(1),c(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Ad=(e,t,a,r)=>{let s=W.reflectionEnvEnabled,i=W.reflectionMissColor,n=a.greaterThan(.05),l=r??Se(n,c(.6),c(1)),o=hr(t.z,t.x).div(2*Math.PI).add(.5),u=md(ie(t.y,c(-1),c(1))).div(Math.PI).add(.5),d=xe(Ls(a.mul(l).mul(_l*wp).add(1)),c(8)),m=e.sample(A(o,u)).level(d).rgb;return Se(s.greaterThan(.5),m,i)},Pd=e=>{let{dials:t,surface:a,camera:r,resources:s}=e,{blur:i,thickness:n,steps:l,stepSize:o,tracingMode:u}=t,{colorMap:d,depthPyramid:m,depthPyramidNode:h,envMap:f}=s,p=e.usePlanar,_=W.reflectionDepthSize,y=W.reflectionDepthLevels,g=($,me)=>m.load($).level(me).r.add(1e-6),x=W.orthographicUniform.greaterThan(.5),v=Se(x,w(0,0,-1),ae(a.originView)).toVar(),V=a.normalV.toVar(),T=Gi(v,V).toVar(),z=ie(i.mul(.1),c(0),c(1)).toVar(),b=W.resolution,M=z.greaterThan(.05),S=e.singleRay?c(1):Se(M,c(.6),c(1)),C=($,me,ue,ce)=>{let Me=ae(fd($,r.worldMatrix)).toVar(),fe=c(1).sub(Ze(c(.85),c(.99),$.z)).toVar(),Te=a.originView.toVar(),Be=Te.z.negate().max(r.near).toVar(),$e=c(Be.mul(10)).toVar();B($.z.greaterThan(1e-5),()=>{let Fe=r.near.negate().sub(Te.z).div($.z);$e.assign(xe($e,Fe.mul(.95).max(1e-4)))});let Ge,Ye=Te.add($.mul($e)).toVar(),Ue=w(a.screenUv,a.fragWindowZ).toVar(),wt=(Fe=>{let ze=r.projectionMatrix.mul(P(Fe,1)).toVar(),Ke=ze.xyz.div(ze.w);return w(Ke.x.mul(.5).add(.5),Ke.y.mul(-.5).add(.5),Ke.z)})(Ye).toVar(),Yt=z.mul(b.y).mul(.075).toVar();if(ce){let Fe=Yt.mul(_.y.div(b.y)).toVar(),ze=xe(c(.8),c(12).div(Fe.max(.001))).toVar();ce.assign(Fe.mul(ze)),Ge=c(1).sub(ze.mul(ze)).max(0).sqrt().toVar()}let rt=wt.sub(Ue).toVar(),yt=Q(rt.xy.length(),c(1e-5)).toVar(),It=c(0).toVar(),Re=w(0).toVar(),st=()=>{let Fe=y.sub(1).toVar(),ze=N(1).toVar(),Ke=N(0).toVar(),ye=(Je,Pt)=>xe(Je,Pt),it=rt,ma=it.div(it.z).toVar(),Pe=w(Ue).toVar(),Wt=A(Se(it.x.greaterThanEqual(0),c(1),c(-1)),Se(it.y.greaterThanEqual(0),c(1),c(-1))).toVar(),la=Wt.mul(1e-5).toVar();Wt.assign(ie(Wt,A(0),A(1)));let oa=Je=>A(Km(h,Je)),nt=(Je,Pt)=>Je.mul(Pt).floor(),Tt=(Je,Pt,za)=>{let Jt=A(1).div(za),Et=Pt.div(za).add(Jt.mul(Wt)).sub(Je.xy).div(it.xy).toVar(),lt=Je.add(it.mul(xe(Et.x,Et.y))).toVar();return lt.xy.addAssign(Se(Et.x.lessThan(Et.y),A(la.x,0),A(0,la.y))),lt},St=oa(ze),Dt=nt(Pe.xy,St);Pe.assign(Tt(Pe,Dt,St)),We(256,()=>{B(ze.lessThan(N(0)).or(Ke.greaterThanEqual(me)),()=>{sa()});let Je=oa(ze).toVar(),Pt=nt(Pe.xy,Je).toVar(),za=g(aa(N(Pt.x),N(Pt.y)),ze).toVar(),Jt=w(Pe).toVar();B(it.z.greaterThan(0),()=>{let Et=za.sub(Pe.z).toVar();B(Et.greaterThan(0),()=>{Jt.assign(Pe.add(ma.mul(Et)))});let lt=nt(Jt.xy,Je).toVar();B(((Na,gr)=>N(Na.x).notEqual(N(gr.x)).or(N(Na.y).notEqual(N(gr.y))))(Pt,lt),()=>{Jt.assign(Tt(Pe,Pt,Je)),ze.assign(ye(Fe,ze.add(N(2))))}).Else(()=>{B(ze.equal(N(1)).and(Et.abs().greaterThan(n)),()=>{Jt.assign(Tt(Pe,Pt,Je)),ze.assign(N(2))})})}).Else(()=>{B(Pe.z.lessThan(za),()=>{Jt.assign(Tt(Pe,Pt,Je)),ze.assign(ye(Fe,ze.add(N(2))))})}),Pe.assign(Jt),ze.subAssign(N(1)),Ke.addAssign(N(1))});let _a=Pe.x.greaterThan(0).and(Pe.x.lessThan(1)).and(Pe.y.greaterThan(0)).and(Pe.y.lessThan(1)).and(Pe.z.greaterThan(0)).and(Pe.z.lessThan(1));B(ze.lessThan(N(0)).and(Ke.lessThan(me)).and(_a),()=>{It.assign(1),Re.assign(Pe);let Je=Pe.xy.sub(Ue.xy).length().div(yt).clamp(0,1),Pt=Je.sub(c(2).div(_.y).div(yt)).max(0),za=w(Ue.add(rt.mul(Pt))).toVar(),Jt=w(Ue.add(rt.mul(Je))).toVar(),Et=w(Jt).toVar();for(let lt=0;lt<4;lt++){Et.assign(X(za,Jt,.5));let Na=Hi(g(aa(ko(Et.xy).mul(_)),N(0)));B(Et.z.sub(Na).greaterThan(0),()=>{Jt.assign(Et)}).Else(()=>{za.assign(Et)})}Re.assign(Et)})},De=()=>{let Fe=Q(o,c(1e-4)),ze=c(Fe).toVar(),Ke=w(Ue).toVar(),ye=w(Ue).toVar(),it=c(-1).toVar();We(256,({i:ma})=>{B(ma.greaterThanEqual(me),()=>{sa()});let Pe=c(ma).mul(ze).div(yt).toVar();B(Pe.greaterThan(1),()=>{sa()}),ye.assign(rt.mul(Pe).add(Ue));let Wt=ye.x.lessThan(0).or(ye.x.greaterThan(1)).or(ye.y.lessThan(0)).or(ye.y.greaterThan(1)).or(ye.z.lessThan(0)).or(ye.z.greaterThan(1));B(Wt,()=>{sa()});let la=g(aa(ye.xy.mul(_)),N(0)).toVar(),oa=ye.z.sub(la).toVar();B(it.lessThanEqual(0).and(oa.greaterThan(0)),()=>{let nt=w(Ke).toVar(),Tt=w(ye).toVar(),St=w(ye).toVar(),Dt=c(oa).toVar();for(let _a=0;_a<4;_a++){St.assign(X(nt,Tt,.5));let Je=Hi(g(aa(ko(St.xy).mul(_)),N(0)));Dt.assign(St.z.sub(Je)),B(Dt.greaterThan(0),()=>{Tt.assign(St)}).Else(()=>{nt.assign(St)})}B(Dt.abs().lessThan(n),()=>{It.assign(1),Re.assign(St),sa()})}),it.assign(oa),Ke.assign(ye),ze.addAssign(Fe.div(2))})};B(fe.greaterThan(0).and(p.not()),()=>{typeof u=="number"?u===1?st():De():B(u.greaterThan(.5),()=>{st()}).Else(()=>{De()})});let qt=Ad(f,Me,z,Ge).toVar(),bt=w(qt).toVar();return B(It.greaterThan(.5),()=>{let Fe=Re.xy.sub(Ue.xy).length().div(yt).clamp(0,1).toVar(),ze=Te.z.negate().max(1e-4).toVar(),Ke=Ye.z.negate().max(1e-4).toVar(),ye=X(c(1).div(ze),c(1).div(Ke),Fe).toVar(),it=X(Te.div(ze),Ye.div(Ke),Fe).div(ye),ma=X(Te,Ye,Fe),Pe=Se(x,ma,it).toVar(),Wt=Pe.sub(Te).length().toVar(),la=r.projectionMatrix.element(1).y.mul(b.y).mul(.5),oa=Se(x,c(1),Pe.z.abs().max(1e-4)),nt=z.mul(S).mul(_l).mul(Wt).mul(la).div(oa),Tt=Q(nt,Yt).toVar(),St=Tt.mul(_.y.div(b.y)).toVar(),Dt=St.toVar(),_a=Tt.toVar();if(ce){let ka=xe(c(.8),c(12).div(St.max(.001))).toVar();ce.assign(St.mul(ka)),Dt.assign(St.mul(c(1).sub(ka.mul(ka)).max(0).sqrt())),_a.assign(Dt.mul(b.y.div(_.y)))}let Je=c(y.sub(1)),Pt=xe(Ls(Dt.add(1)),Je),za=ue?kd(d,Re.xy,_a.mul(.75).div(b.y),Dt.mul(.75),Pt.sub(1).max(0).floor()).toVar():d.sample(Re.xy).level(Pt).rgb.toVar(),Jt=ka=>Ze(c(0),c(.07),ka).mul(Ze(c(0),c(.07),c(1).sub(ka))),Et=Jt(Re.x).mul(Jt(Re.y)),lt=Re.xy.mul(_),Na=g(aa(lt),N(0)),gr=Xr(r.projectionMatrixInverse,Re.x,Re.y,Na).toVar(),an=q(gr.sub(Te),V),ti=Ze(Be.mul(-.05),Be.mul(-.005),an),ms=c(1).div(_.x),Za=c(1).div(_.y),rn=g(aa(lt.sub(A(1,0))),N(0)),ai=g(aa(lt.add(A(1,0))),N(0)),sn=g(aa(lt.sub(A(0,1))),N(0)),nn=g(aa(lt.add(A(0,1))),N(0)),ri=Xr(r.projectionMatrixInverse,Re.x.sub(ms),Re.y,rn),ln=Xr(r.projectionMatrixInverse,Re.x.add(ms),Re.y,ai),on=Xr(r.projectionMatrixInverse,Re.x,Re.y.sub(Za),sn),un=Xr(r.projectionMatrixInverse,Re.x,Re.y.add(Za),nn),ya=ae(_t(ln.sub(ri),un.sub(on))).toVar(),cs=Se(ya.z.lessThan(0),ya.negate(),ya),Nt=Ze(c(.02),c(.12),q(cs,$).negate()),Ut=fe.mul(Et).mul(ti).mul(Nt);bt.assign(X(qt,za,Ut))}),bt};if(e.singleRay)return C(T,l,!0,e.singleRay.footprintOut).toVar();let R=e.noisePixel,k=Ae(c(52.9829189).mul(Ae(R.x.mul(.06711056).add(R.y.mul(.00583715))))).mul(2*Math.PI).toVar(),E=Se(T.y.abs().greaterThan(.99),w(1,0,0),w(0,1,0)),I=ae(_t(E,T)).toVar(),D=_t(T,I).toVar(),H=($,me=4)=>{let ue=z.mul(_l*Math.sqrt(($+.5)/me)),ce=k.add(2.399963229728653*$);return ae(T.mul(ha(ue)).add(I.mul(ha(ce)).add(D.mul(Zt(ce))).mul(Zt(ue)))).toVar()},K=M.and(p.not()),O=Se(K,H(0),T).toVar(),j=w(0).toVar();j.addAssign(C(O,l,!0));let Z=c(1).toVar();return B(K,()=>{j.addAssign(C(H(2),l,!1)),Z.assign(2),B(z.greaterThan(.35),()=>{j.addAssign(C(H(1),l,!1)),j.addAssign(C(H(3),l,!1)),Z.assign(4)})}),j.div(Z).toVar()},Dr=new ve,yl=class extends Nc{constructor(e){super(),this.postprocessingState=Bc.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:L(0),uDPR:{value:1},uResolution:{value:new ve}}},this.sceneTransitionFromTexture=null,this.watermarkTexture=null,this.uiCanvasTexture=null,this.uiOverlayEnabled=!1,this._isUIOverlayEnabled=!1,this._helpersEnabled=!0,this._renderToScreen=!0,this._rt=null,this._effectChain=null,this._effectChainDirty=!1,this.blueNoiseTexture=new fr,this._rebuildCount=0,this._rebuildLogAt=0,this._chainUiTexture=null,this._chainWatermark=null,this._chainTransitionTexture=null,this._chainHdr=!1,this.lastOutputTarget=null,this._renderer=e}get renderToScreen(){return this._renderToScreen}set renderToScreen(e){this._renderToScreen=e}get texture(){return this._rt&&this._rt.texture}get renderTarget(){return this._rt}get isUIOverlayEnabled(){return this._isUIOverlayEnabled}enableUIOverlay(){this._isUIOverlayEnabled=!0}disableUIOverlay(){this._isUIOverlayEnabled=!1}enableHelpers(){this._helpersEnabled=!0}disableHelpers(){this._helpersEnabled=!1}get helpersEnabled(){return this._helpersEnabled}setWatermark(e){this.watermarkTexture=e,this._effectChainDirty=!0}updateBlueNoiseTexture(e){this.blueNoiseTexture.dispose();let t=new fr(e,128,128);t.wrapS=wa,t.wrapT=wa,t.minFilter=Oe,t.magFilter=Oe,t.needsUpdate=!0,this.blueNoiseTexture=t}static _topologyJSON(e){let t=e,a={};for(let r of Object.keys(t)){let s=t[r],i=yl.UNIFORM_BACKED_FIELDS[r];if(i&&s&&typeof s=="object"){let n={...s};for(let l of i)delete n[l];a[r]=n}else a[r]=s}return JSON.stringify(a)}updatePostprocessing(e){this.postprocessingState=e;let t=yl._topologyJSON(e);this._postprocessingJSON!==t&&(this._postprocessingJSON=t,this._effectChainDirty=!0)}_needsEffectChain(){if(this._renderer.temporalAAEnabled||this.uiOverlayEnabled&&this.uiCanvasTexture||this.watermarkTexture||this.sceneTransitionFromTexture)return!0;if(this.postprocessingState.enabled!==!0)return!1;let e=this.postprocessingState;for(let t of Object.keys(e)){let a=e[t];if(a&&typeof a=="object"&&a.enabled===!0)return!0}return!1}render(){let{scene:e,camera:t}=this;if(!e||!t)return;let a=this._renderer;if(a.warmupInFlight)return;let r=!1;if(!this._renderToScreen&&a.getRenderTarget()===null){a.getDrawingBufferSize(Dr);let s=Math.max(1,Math.round(Dr.x)),i=Math.max(1,Math.round(Dr.y));this._rt===null?this._rt=new Ee(s,i,{depthBuffer:!0}):(this._rt.width!==s||this._rt.height!==i)&&(this._rt.dispose(),this._rt=new Ee(s,i,{depthBuffer:!0})),a.setRenderTarget(this._rt),r=!0}this.lastOutputTarget=r?this._rt:a.getRenderTarget();try{this._renderFrame(e,t)}finally{r&&a.setRenderTarget(null)}}_renderFrame(e,t){let a=this._renderer;a.renderStarted=!0,a.normalizeCameraCoordinateSystem(t);let r=this._needsEffectChain(),s=null;this._effectChainDirty?s="postprocessing/watermark":r!==(this._effectChain!==null)?s="chain presence":this._effectChain!==null&&(this._chainUiTexture!==(this.uiOverlayEnabled?this.uiCanvasTexture:null)?s="ui overlay texture":this._chainWatermark!==this.watermarkTexture?s="watermark texture":this.sceneTransitionFromTexture!==null&&this._chainTransitionTexture!==this.sceneTransitionFromTexture?s="transition texture":this._chainHdr!==a.hdrChainActive&&(s="grading pipeline"));let i=s!==null;if(i&&this._effectChain!==null){this._rebuildCount++;let n=Date.now();n-this._rebuildLogAt>1e3&&(this._rebuildLogAt=n,this._rebuildCount=0)}if(i&&(this._effectChain,this._effectChain?.dispose(),this._effectChain=null,this._effectChainDirty=!1,r&&(this._effectChain=a.createEffe
1ctChain(),ge.chainBuilds++,ge.lastChainBuildReason=s??"initial",this._chainUiTexture=this.uiOverlayEnabled?this.uiCanvasTexture:null,this._chainWatermark=this.watermarkTexture,this._chainTransitionTexture=this.sceneTransitionFromTexture,this._chainHdr=a.hdrChainActive)),this._effectChain){this._effectChain.syncValues(this.postprocessingState,a),this._chainTransitionTexture!==null&&this.sceneTransitionFromTexture===null&&(this.sceneTransitionPass.uniforms.mixRatio.value=1);let n=a.temporalAAEnabled?a.taaHistory:null;n&&(a.getDrawingBufferSize(Dr),n.beginJitter(t,Dr.x,Dr.y)),this._effectChain.renderTAAResolve?.(a),this._effectChain.renderBloomPasses?.(a),this._effectChain.renderDoFPasses?.(a),this._effectChain.render(),n?.endJitter()}else a.renderScenePass(e,t);this._helpersEnabled&&(this.sceneHelpers||this.sceneHelpersOnTop)&&a.renderHelperOverlay(this.sceneHelpers,this.sceneHelpersOnTop,t,this._effectChain?this._effectChain.sceneDepthTexture():null)}resize(e,t,a){this._effectChain?.resize()}setViewport(e,t,a,r){e instanceof at?this._renderer.setViewport(e.x,e.y,e.z,e.w):this._renderer.setViewport(e,t,a,r)}setScissor(e,t,a,r){e instanceof at?this._renderer.setScissor(e.x,e.y,e.z,e.w):this._renderer.setScissor(e,t,a,r)}setScissorTest(e){this._renderer.setScissorTest(e)}dispose(){this._effectChain?.dispose(),this._effectChain=null,this._rt?.dispose(),this._rt=null,this.blueNoiseTexture.dispose()}},Ed=yl;Ed.UNIFORM_BACKED_FIELDS={bloom:["intensity","opacity"],chromaticAberration:["offset","opacity"],vignette:["offset","darkness","opacity"],noise:["opacity"],hueSaturation:["hue","saturation","opacity"],brightnessContrast:["brightness","contrast","opacity"],depthOfField:["focusDistance","focalLength","bokehScale","opacity"],pixelation:["granularity","opacity"]};var Ao=(()=>{try{return new URLSearchParams(window.location.search).get("dbgdestroys")==="1"}catch{return!1}})(),Ds=[],Po=6,xl=()=>-1,Eo=!1,No=null;function Bo(e,t,a){Ds.push({t:Math.round(performance.now()),frame:xl(),kind:e,label:t||"(unlabeled)",size:a,stack:(new Error().stack??"").split(` 2`).slice(2,9).join(` 3`)}),Ds.length>32&&Ds.shift()}var Fo=(e,t)=>({start:N(0),end:N(t),type:"int",condition:"<",name:e}),Lo=ie;function vl(e,t){let a=new Ee(e,t,{depthBuffer:!1,type:Xt,format:vd});return a.texture.generateMipmaps=!1,a.texture.minFilter=Oe,a.texture.magFilter=Oe,a}var as=null;function bl(){return as===null&&((as=vl(64,8)).texture.name="SplinePCSSPyramidAtlas"),as.texture}function Io(e,t,a,r,s,i){let n=new ke,l=re(t),o=U(()=>{let u=da,d=u.x,m=N(d).mul(a).toVar(),h=N(u.y).mul(a).toVar(),f=c(1e9).toVar(),p=c(-1e9).toVar();return We(Fo("ly",a),Fo("lx",a),_=>{let{lx:y,ly:g}=_,x=Lo(m.add(y),N(0),N(r)),v=Lo(h.add(g),N(0),N(r)),V=l.load(aa(x,v));f.assign(xe(f,V.x)),p.assign(Q(p,s?V.y:V.x))}),P(f,p,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Ft,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var Us=new Set;function Do(e){let t=e;if(!t.__spePcssPyramid){t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null};for(let a of Us)a.deref()===void 0&&Us.delete(a);Us.add(new WeakRef(t.__spePcssPyramid))}return t.__spePcssPyramid}var zn=new Array(8).fill(null);function Uo(e){return e.__spePcssPyramid?.fresh===!0}function Sp(e){return e.__spePcssPyramid?.slot??-1}var kn=!1,Oo=new ne,ua=e=>e,Va=e=>e,Go=e=>e,Tl=!0,wl=!0,Sl=!0,Vl=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");t==="classic"||t==="0"?(Tl=!1,wl=!1,Sl=!1,Vl=!1):(Tl=e.get("dbgpcsssplit")!=="0",wl=e.get("dbgpcsshw")!=="0",Sl=e.get("dbgpcsshiz")!=="0",Vl=e.get("dbgshadowmask")!=="0")}catch{}var tn=!1,qo=()=>wl&&tn,eo=()=>Sl&&tn,Nd=()=>Vl&&tn,Wo=()=>eo(),Ho=()=>Nd(),Vp=[[0,-.333334],[-.5,.333334],[.5,-.777778],[-.75,-.111112],[.25,.555556],[-.25,-.555556],[.75,.111112],[-.875,.777778],[.125,-.925926],[-.375,-.25926],[.625,.407408],[-.625,-.703704],[.375,-.037038],[-.125,.62963],[.875,-.481482],[-.9375,.185186]],ur=16;function os(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:L(2048),radius:L(1),penumbraSize:L(.5),depthEps:L(1e-4),penumbraFrameScale:L(1),penumbraFrameOffset:L(0),pyramidEnabled:L(0),pyramidSlot:L(0),maskChannel:L(new at(0,0,0,0)),planeNormalMat:L(new en().set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function Bd(e,t){os(e).maskChannel.value.set(t===0?1:0,t===1?1:0,t===2?1:0,t===3?1:0)}function jo(e,t,a){let r=e,s=os(e);s.mapSize.value=r.mapSize?.x??2048,s.radius.value=r.radius??1,s.pe
vendor: 28,122 bytes, line 3
3numbraSize.value=t??r.penumbraSize??.5,r.camera?.isOrthographicCamera&&r.matrix?s.planeNormalMat.value.getNormalMatrix(r.matrix):s.planeNormalMat.value.set(0,0,0,0,0,0,0,0,0);let i=typeof r.camera?.far=="number"&&typeof r.camera?.near=="number"?r.camera.far-r.camera.near:0;s.depthEps.value=i>.001?1.25/i:1e-4;let n=e.__speRangeEnvelope,l=n?n.far-n.near:0;n&&l>.001&&i>.001&&r.camera?(s.penumbraFrameScale.value=i/l,s.penumbraFrameOffset.value=(r.camera.near-n.near)/l):(s.penumbraFrameScale.value=1,s.penumbraFrameOffset.value=0);let o=0;if(a&&a.fresh&&a.slot>=0&&eo()){let u=s.mapSize.value;80/1024+(2*s.radius.value+2)/Math.max(1,u)<=1/8&&(o=1)}return s.pyramidEnabled.value=o,s.pyramidSlot.value=Math.max(0,a?.slot??0),s.pyramidEnabled.value===1}function Fd(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Xa(r).add(Ne(de(r),c(0))).mul(Q(de(r),c(1e-4)));return A(a.x.negate().div(s),a.y.div(s)).toVar()}var Ml=(e,t)=>ie(q(e,t),c(-.05),c(.05));function Cl(e,t,a,r,s,i,n){let l=qo()?Math.max(4,ur>>1):ur,o=Tl?Math.max(4,ur>>1):ur,u=qo(),d=os(t),m=d.mapSize,h=A(m,m),f=d.radius,p=d.penumbraSize,_=re(e),y=z=>_.load(aa(ie(z,A(0),A(1)).mul(h))).x,g=c(1).div(h.x).toVar(),x=c(80).div(g.mul(1024)).toVar(),v=d.depthEps,V=Fd(d,n),T=()=>{let z=c(0).toVar(),b=c(0).toVar();for(let C=0;C<o;C++){let R=Va(Nr(N(C),N(o),s)).mul(g).mul(x),k=y(Va(a.add(R))).toVar();B(k.lessThan(r.add(Ml(V,R)).add(v)),()=>{z.addAssign(k),b.addAssign(1)})}let M=c(0).toVar();B(b.greaterThan(0),()=>{let C=z.div(b).toVar(),R=d.penumbraFrameScale,k=d.penumbraFrameOffset,E=r.sub(C).mul(R).div(C.mul(R).add(k)).toVar();M.assign(ie(E.mul(E).mul(200).mul(p),c(0),c(1)))});let S=c(0).toVar();for(let C=0;C<l;C++){let R=Va(Nr(N(C),N(l),s)).mul(g),k=Va(R.mul(f.mul(2)).add(R.mul(M.mul(x)))),E=ua(r.add(Ml(V,k)));u?S.addAssign(ua(re(e,Va(a.add(k))).compare(E))):S.addAssign(Ne(E,y(Va(a.add(k)))))}i.assign(S.div(l))};if(eo()){let z=re(bl()),b=d.pyramidEnabled,M=d.pyramidSlot,S=c(8),C=c(0).toVar();B(b.greaterThan(.5),()=>{let R=ie(a,A(0),A(1)),k=R.x.mul(S).toVar(),E=R.y.mul(S).toVar(),I=M.mul(S),D=c(1e9).toVar(),H=c(-1e9).toVar();for(let j=-1;j<=1;j++)for(let Z=-1;Z<=1;Z++){let $=ie(k.add(c(Z)),c(0),S.sub(1)),me=ie(E.add(c(j)),c(0),S.sub(1)),ue=Va(A($.add(I),me)),ce=z.load(aa(ue));D.assign(xe(D,ua(ce.x))),H.assign(Q(H,ua(ce.y)))}let K=g.mul(f.mul(2).add(x)),O=xe(we(V).mul(K),c(.05)).toVar();B(D.greaterThanEqual(r.add(v).add(O)),()=>{C.assign(1)}).ElseIf(H.lessThan(r.sub(O)),()=>{C.assign(2)})}),B(C.equal(1),()=>{i.assign(1)}).ElseIf(C.equal(2),()=>{i.assign(0)}).Else(T)}else T()}var Mp=U(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=os(r),i=a.xy.toVar(),n=a.z.toVar(),l=Ji.toVar(),o=W.pcssHalton,u=mr(da.xy.add(o)).mul(6.28318530718).toVar(),d=c(1).toVar();if(Nd()){let m=s.maskChannel,h=W.shadowMaskEnabled,f=W.shadowMaskGBuffer,p=W.shadowMaskTexture,_=c(0).toVar(),y=c(1).toVar();B(h.greaterThan(.5).and(q(m,P(1,1,1,1)).greaterThan(.5)),()=>{let g=Fa,x=W.shadowMaskResolution,v=W.shadowMaskFullResolution,V=cr.z,T=g.mul(x).sub(A(.5,.5)).toVar(),z=J(T).toVar(),b=T.sub(z).toVar(),M=Q(de(V).mul(.02),c(.05)),S=c(0).toVar(),C=c(0).toVar();for(let R=0;R<=1;R++)for(let k=0;k<=1;k++){let E=Va(ie(z.add(A(k,R)),A(0,0),x.sub(A(1,1)))),I=Va(E.add(A(.5,.5)).div(x)),D=Va(J(I.mul(v)).add(A(.5,.5)).div(v)),H=ua(f.sample(D).w),K=ua(q(p.sample(I),m)),O=ua(k===0?c(1).sub(b.x):ua(b.x)),j=ua(R===0?c(1).sub(b.y):ua(b.y)),Z=ua(Ne(de(H.sub(V)),M)),$=ua(O.mul(j).mul(Z)).toVar();S.addAssign($),C.addAssign(K.mul($))}B(S.greaterThan(.001),()=>{_.assign(1),y.assign(C.div(S))})}),B(_.greaterThan(.5),()=>{d.assign(y)}).Else(()=>{Cl(t,r,i,n,u,d,l)})}else Cl(t,r,i,n,u,d,l);return d}),Cp=U(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=os(r),i=a.xy.toVar(),n=a.z.toVar(),l=Fd(s,Ji.toVar()),o=s.mapSize,u=s.radius.mul(c(1).div(o)).toVar(),d=mr(da.xy).mul(6.28318530718).toVar(),m=c(0).toVar();for(let h=0;h<5;h++){let f=Va(Nr(N(h),N(5),d)).mul(u).toVar();m.addAssign(ua(re(t,Va(i.add(f))).compare(n.add(Ml(l,f)))))}return m.mul(.2)}),Rp=U(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=ur,n=os(s),l=n.mapSize,o=n.radius,u=c(1).div(l).toVar(),d=W.pcssHalton,m=mr(da.xy.add(d)).mul(6.28318530718).toVar(),h=o.add(5).toVar(),f=c(0).toVar();for(let p=0;p<i;p++){let _=Va(Nr(N(p),N(i),m)).mul(u).toVar(),y=Go(w(_.x,_.y,ua(_.x).negate()).mul(h)),g=Go(a.add(y));f.addAssign(ua(Xm(t,g).compare(r)))}return f.div(i)});function zp(e,t){let a=t;return a.isPointLight?(ge.pcssHookServes++,zl):a.isSpotLight||a.isDirectionalLight?(ge.pcssHookServes++,Rl):null}var Ld=L(1);function $o(e){Ld.value=e?1:0}var Ko=(e,t)=>e(t),kp=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function Id(e,t){return a=>{let r=(function(n){let l=n,o={};if(l==null)return o;for(let u of kp){let d=l[u];d!==void 0&&(o[u]=d)}return o})(a),s=Ko(e,r),i=Ko(t,r);return U(()=>{let n=c(1).toVar();return B(Ld.greaterThan(.5),()=>{n.assign(s)}).Else(()=>{n.assign(i)}),n})()}}var Rl=Id(Mp,Cp),zl=Id(Rp,Qm),An=new kt,Ap=new gt,Pp=new ve,Ep=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=L(new Ra),this._projInv=L(new Ra),this._lightRows=[];let e=new ke;e.name="SplineShadowMask.gbuffer",e.fragmentNode=P(na,cr.z),e.lights=!1,e.blending=Ft,e.needsUpdate=!0,this._gBufferMaterial=e}_ensureTarget(e,t,a,r){return e&&e.width===t&&e.height===a?{target:e,changed:!1}:(e?.dispose(),{target:r(),changed:!0})}_buildResolveMaterial(e){let t=new ke;t.name="SplineShadowMask.resolve";let a=re(this._gBuffer.depthTexture),r=re(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:L(new Ra),bias:L(0),normalBias:L(0)}));let o=this._lightRows,u=U(()=>{let d=Ie(),m=J(d.mul(A(n,l))).add(A(.5,.5)).div(A(n,l)).toVar(),h=a.sample(m),f=pd(m,h,i).toVar(),p=r.sample(m).toVar(),_=s,y=_.mul(P(f,1)).xyz.toVar(),g=ae(_.mul(P(p.xyz,0)).xyz).toVar(),x=W.pcssHalton,v=mr(da.xy.add(x)).mul(6.28318530718).toVar(),V=[c(1).toVar(),c(1).toVar(),c(1).toVar(),c(1).toVar()];return e.forEach((T,z)=>{let b=o[z],M=y.add(g.mul(b.normalBias)),S=b.matrix.mul(P(M,1)).toVar(),C=S.xyz.div(S.w),R=w(C.x,c(1).sub(C.y),C.z).toVar(),k=R.z.add(b.bias).toVar(),E=R.x.greaterThanEqual(0).and(R.x.lessThanEqual(1)).and(R.y.greaterThanEqual(0)).and(R.y.lessThanEqual(1)).and(k.lessThanEqual(1));B(E,()=>{Cl(T.shadow.map.depthTexture,T.shadow,R.xy,k,v,V[z],g)})}),P(V[0],V[1],V[2],V[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Ft,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize(Pp),n=Math.max(1,Math.round(i.x)),l=Math.max(1,Math.round(i.y)),o=Math.max(1,Math.round(n/2)),u=Math.max(1,Math.round(l/2)),d=!1,m=this._ensureTarget(this._gBuffer,n,l,()=>{let S=new Ee(n,l,{type:At,depthTexture:new Cr(n,l),minFilter:Ve,magFilter:Ve});return S.texture.name="SplineShadowMask.gbuffer",S});this._gBuffer=m.target,d=d||m.changed;let h=this._ensureTarget(this._maskTarget,o,u,()=>{let S=new Ee(o,u,{depthBuffer:!1,minFilter:Ve,magFilter:Ve});return S.texture.name="SplineShadowMask.mask",S});this._maskTarget=h.target,d=d||h.changed;let f=`${this._gBuffer.texture.uuid}:${r.map(S=>S.shadow.map?.depthTexture?.uuid??"none").join(",")}`;(this._resolveMaterial===null||this._resolveKey!==f)&&(this._resolveMaterial?.dispose(),this._resolveMaterial=this._buildResolveMaterial(r),this._resolveKey=f),this._cameraWorld.value.copy(a.matrixWorld),this._projInv.value.copy(a.projectionMatrix).invert(),r.forEach((S,C)=>{S.shadow.updateMatrices?.(S.light);let R=this._lightRows[C];S.shadow.matrix&&R.matrix.value.copy(S.shadow.matrix),R.bias.value=S.shadow.bias??0,R.normalBias.value=S.shadow.normalBias??0});let p=t,_=p.isScene===!0,y=[],g=[];p.traverse(S=>{let C=S;if(C.isMesh===!0&&C.visible!==!1){if((Array.isArray(C.material)?C.material:[C.material]).some(R=>R?.transparent===!0))y.push(C),C.visible=!1;else if(!_){let R=C;g.push({obj:R,material:R.material}),R.material=this._gBufferMaterial}}});let x=p.overrideMaterial,v=e.getRenderTarget(),V=e.getMRT(),T=e.getClearColor(Ap),z=e.getClearAlpha(),b=a.layers,M=b.mask;b.disable(3),p.overrideMaterial=this._gBufferMaterial,e.setMRT(null),e.setClearColor(0,0),e.setRenderTarget(this._gBuffer),e.render(t,a),p.overrideMaterial=x,b.mask=M;for(let S of y)S.visible=!0;for(let S of g)S.obj.material=S.material;return An.material=this._resolveMaterial,An.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),An.render(e),e.setRenderTarget(v),e.setMRT(V),e.setClearColor(T,z),W.shadowMaskTexture.value=this._maskTarget.texture,W.shadowMaskGBuffer.value=this._gBuffer.texture,W.shadowMaskResolution.value.set(o,u),W.shadowMaskFullResolution.value.set(n,l),r.forEach((S,C)=>{Bd(S.shadow,C)}),ge.shadowMaskResolves++,{targetsChanged:d}}dispose(){this._gBuffer?.dispose(),this._gBuffer=null,this._maskTarget?.dispose(),this._maskTarget=null,this._gBufferMaterial.dispose(),this._resolveMaterial?.dispose(),this._resolveMaterial=null,this._resolveKey=""}},Np=e=>e,Bp=e=>e,Pn=new kt,Fp=class{constructor(e){this.cam=e,this._savedSkewX=0,this._savedSkewY=0,this._savedShiftX=0,this._savedShiftY=0,this._jitterActive=!1}setViewOffset(e,t,a,r){this.clearViewOffset();let s=this.cam.projectionMatrix.elements,i=-2*a/e,n=2*r/t;this._savedSkewX=s[8],this._savedSkewY=s[9],this._savedShiftX=s[12],this._savedShiftY=s[13],s[8]+=i*s[11],s[9]+=n*s[11],s[12]+=i*s[15],s[13]+=n*s[15],this.cam.projectionMatrixInverse.copy(this.cam.projectionMatrix).invert(),this._jitterActive=!0}clearViewOffset(){if(!this._jitterActive)return;let e=this.cam.projectionMatrix.elements;e[8]=this._savedSkewX,e[9]=this._savedSkewY,e[12]=this._savedShiftX,e[13]=this._savedShiftY,this.cam.projectionMatrixInverse.copy(this.cam.projectionMatrix).invert(),this._jitterActive=!1}};function ji(e,t){let a=0,r=1,s=e;for(;s>0;)r/=t,a+=r*(s%t),s=Math.floor(s/t);return a}var oi=Array.from({length:16},(e,t)=>[ji(t+1,2),ji(t+1,3)]),Ns="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");(e==="r2"||e==="h64"||e==="white"||e==="half")&&(Ns=e)}catch{}function En(e){return w(e.x.div(4).add(e.y.div(2)).add(e.z.div(4)),e.x.div(2).sub(e.z.div(2)),e.x.div(-4).add(e.y.div(2)).sub(e.z.div(4)))}function Xo(e,t=!0){let a=w(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?ie(a,w(0),w(1)):Q(a,w(0))}var Lp=class extends cd{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=L(new ve(1,1)),this._historyValid=L(0),this._jitterUV=L(new ve(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??Dd(),this._ownsHistory=r===void 0,this._outputTexNode=re(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){ul.setProjectionMatrix(this._history.unjitteredProjection);let t=this.beautyNode.passNode.renderTarget,a=t.texture.width,r=t.texture.height,s=this._history;(s.rtA.width!==a||s.rtA.height!==r)&&(s.resize(a,r),this._rebuildResolveMaterials?.()),this._resolution.value.set(a,r),this._historyValid.value=s.valid?1:0,this._jitterUV.value.copy(s.jitterOffsetUV);let i=s.flip?s.rtB:s.rtA,n=this._resolveMaterials?this._resolveMaterials[s.flip?1:0]:null,l=e.getRenderTarget(),o=e.getMRT();e.setMRT(null),s.valid||(e.setRenderTarget(s.rtA),e.clear(!0,!1,!1),e.setRenderTarget(s.rtB),e.clear(!0,!1,!1)),e.setRenderTarget(i),n&&(Pn.material=n,Pn.name="SplineTAA.resolve",Pn.render(e)),e.setRenderTarget(l),e.setMRT(o),this._outputTexNode.value=i.texture,s.valid=!0,s.flip=!s.flip,ge.taaResolves++,ge.taaJitterIndex=s.jitterIndex,ge.taaHistoryValid=!0,ge.taaResolveSize=`${a}x${r}`}setup(e){let t=e.renderer.reversedDepthBuffer===!0,a=e.renderer.backend?.isWebGLBackend===!0,r=!1,s=!1,i=!1,n=!1,l=!1,o=!1,u=!1,d=!1,m=!1,h=!1;try{let T=new URLSearchParams(window.location.search).get("dbgtaa");r=T==="1",s=T==="zv",i=T==="nc",n=T==="err",l=T==="hist",o=T==="red",u=T==="ns",d=T==="fb90",m=new URLSearchParams(window.location.search).get("dbgjit")==="mark",h=T==="hold"}catch{}let f=this.beautyNode,p=this.velocityNode,_=this.depthNode,y=this._resolution,g=this._historyValid,x=this._jitterUV,v=T=>{let z=f.sample(T);return P(En(z.rgb),z.a)},V=T=>{let z=U(()=>{let M=Ie().toVar();if(m)return P(x.x.mul(400).add(.5),x.y.mul(400).add(.5),c(.5),c(1));let S=M,C=A(c(1).div(y.x),c(1).div(y.y)).toVar(),R=[[-1,1],[0,1],[1,1],[-1,0],[0,0],[1,0],[-1,-1],[0,-1],[1,-1]].map(([nt,Tt])=>M.add(A(C.x.mul(nt),C.y.mul(Tt))).toVar()),k=R,E=c(t?-1e3:1e3).toVar(),I=A(R[4]).toVar();for(let nt=0;nt<9;nt++){let Tt=Np(_.load(aa(R[nt].mul(Bp(y)))).r).toVar(),St=t?Tt.greaterThan(E):Tt.lessThan(E);E.assign(St.select(Tt,E)),I.assign(St.select(R[nt],I))}let D=p.load(aa(I.mul(y))).xy.mul(A(.5,-.5)).toVar();s&&D.assign(A(0,0));let H=M.sub(D).toVar(),K=a?A(H.x,c(1).sub(H.y)).toVar():H,O=v(S).toVar();if(r)return P(D.x.mul(20).add(.5),D.y.mul(20).add(.5),g,c(1));if(o){let nt=new fr(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return nt.needsUpdate=!0,re(nt).sample(M)}if(l){let nt=a?A(M.x,c(1).sub(M.y)):M;return T.sample(nt)}if(n){let nt=a?A(M.x,c(1).sub(M.y)):M,Tt=T.sample(K),St=T.sample(nt),Dt=O.x,_a=Je=>En(Je.rgb).x;return P(_a(Tt).sub(Dt).abs().mul(8),_a(St).sub(Dt).abs().mul(8),c(0),c(1))}let j=K.mul(y).toVar(),Z=J(j.sub(.5)).add(.5).toVar(),$=j.sub(Z).toVar(),me=$.mul($.mul($.mul(-.5).add(1)).add(-.5)).toVar(),ue=$.mul($).mul($.mul(1.5).add(-2.5)).add(1).toVar(),ce=$.mul($.mul($.mul(-1.5).add(2)).add(.5)).toVar(),Me=$.mul($).mul($.mul(.5).add(-.5)).toVar(),fe=ue.add(ce).toVar(),Te=ce.div(fe).toVar(),Be=Z.sub(1).div(y).toVar(),$e=Z.add(2).div(y).toVar(),Ge=Z.add(Te).div(y).toVar(),Ye=P(0).toVar();Ye.addAssign(T.sample(A(Ge.x,Be.y)).mul(fe.x.mul(me.y))),Ye.addAssign(T.sample(A(Be.x,Ge.y)).mul(me.x.mul(fe.y))),Ye.addAssign(T.sample(A(Ge.x,Ge.y)).mul(fe.x.mul(fe.y))),Ye.addAssign(T.sample(A($e.x,Ge.y)).mul(Me.x.mul(fe.y))),Ye.addAssign(T.sample(A(Ge.x,$e.y)).mul(fe.x.mul(Me.y)));let Ue=P(En(Ye.rgb),Ye.a).toVar();if(h)return P(Xo(Ue.rgb).mul(w(1,.55,.55)),Ye.a);let wt=v(k[0]).toVar(),Yt=v(k[1]).toVar(),rt=v(k[2]).toVar(),yt=v(k[3]).toVar(),It=v(k[4]).toVar(),Re=v(k[5]).toVar(),st=v(k[6]).toVar(),De=v(k[7]).toVar(),qt=v(k[8]).toVar(),bt=P(xe(wt,xe(Yt,xe(rt,xe(yt,xe(It,xe(Re,xe(st,xe(De,qt))))))))).toVar(),Fe=P(Q(wt,Q(Yt,Q(rt,Q(yt,Q(It,Q(Re,Q(st,Q(De,qt))))))))).toVar(),ze=P(xe(Yt,xe(yt,xe(It,xe(Re,De))))).toVar(),Ke=P(Q(Yt,Q(yt,Q(It,Q(Re,De))))).toVar();bt.assign(bt.add(ze).mul(.5)),Fe.assign(Fe.add(Ke).mul(.5));let ye=Fe.r.sub(bt.r).mul(.25).mul(.5).toVar(),it=O.gb.toVar();u||(bt.y.assign(it.x.sub(ye)),bt.z.assign(it.y.sub(ye)),Fe.y.assign(it.x.add(ye)),Fe.z.assign(it.y.add(ye)));let ma=P(i?Ue:ie(Ue,bt,Fe)).toVar(),Pe=d||i?c(.9):c(.9).mul(g),Wt=P(X(O,ma,Pe)).toVar(),la=W.tapAngle,oa=ud(M.mul(y).add(A(la.mul(127.1),la.mul(311.7)))).sub(.5).mul(1/255);return P(Xo(Wt.rgb,!this._hdr).add(w(oa)),Wt.a)}),b=new ke;return b.name="SplineTAA.resolve",b.colorNode=z(),b.depthTest=!1,b.depthWrite=!1,b.blending=Ft,b.needsUpdate=!0,b};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[V(re(this._history.rtB.texture)),V(re(this._history.rtA.texture))]},this._rebuildResolveMaterials(),this._outputTexNode}dispose(){this._ownsHistory&&this._history.dispose(),this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose(),this._resolveMaterials=null),ul.setProjectionMatrix(null)}};function Dd(){let e=!1;try{let h=new URLSearchParams(window.location.search).get("dbgfp16");e=h==="1"||h==="hist"||h==="st"}catch{}let t=!1,a=()=>e||t,r=(h,f,p)=>{let _=new Ee(h,f,{minFilter:Ve,magFilter:Ve,depthBuffer:!1});return a()?_.texture.type=At:dd()&&(_.texture.internalFormat="rgba8unorm-srgb"),_.texture.name=p,_},s=r(1,1,"SplineTAA.A"),i=r(1,1,"SplineTAA.B"),n=null,l=!1,o=0,u=0,d=0,m=0;return{rtA:s,rtB:i,flip:!1,valid:!1,jitterIndex:0,unjitteredProjection:new Ra,jitterOffsetUV:new ve(0,0),beginJitter(h,f,p){if(l)return;let _,y;if(l=!0,(n===null||n.cam!==h)&&(n?.clearViewOffset(),n=new Fp(h)),this.unjitteredProjection.copy(h.projectionMatrix),W.unjitteredProjection.value.copy(h.projectionMatrix),Ns==="r2"){let g=++this.jitterIndex;_=(.5+.7548776662466927*g)%1,y=(.5+.5698402909980532*g)%1}else if(Ns==="white")this.jitterIndex++,_=Math.random(),y=Math.random();else if(Ns==="h64")_=ji(this.jitterIndex%64+1,2),y=ji(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if(Ns==="half"){let[g,x]=oi[this.jitterIndex];_=.5+.5*(g-.5),y=.5+.5*(x-.5),this.jitterIndex=(this.jitterIndex+1)%oi.length}else[_,y]=oi[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%oi.length;o=f,u=p,d=_-.5,m=y-.5,W.cameraJitterPx.value.set(2*d,2*m),n.setViewOffset(f,p,d,m),this.jitterOffsetUV.set(-(_-.5)/f,-(y-.5)/p),ge.taaJitterIndex=this.jitterIndex,ge.taaJitterApplies++},suspendJitter(){l&&n?.clearViewOffset()},resumeJitter(){l&&n!==null&&n.setViewOffset(o,u,d,m)},endJitter(){l=!1,this.jitterOffsetUV.set(0,0),n?.clearViewOffset()},resize(h,f){this.rtA.dispose(),this.rtB.dispose(),this.rtA=r(h,f,"SplineTAA.A"),this.rtB=r(h,f,"SplineTAA.B"),this.valid=!1},setHdr(h){if(t===h)return;let f=a();t=h,a()!==f&&this.resize(this.rtA.width,this.rtA.height)},dispose(){this.rtA.dispose(),this.rtB.dispose(),this.valid=!1,l=!1,n?.clearViewOffset(),n=null}}}var Nn,Ip=class{constructor(){this._frames=0}get frames(){return this._frames}get stalled(){return this._frames>=3}update(e,t){this._frames=e>0&&!t?this._frames+1:0}},Ur=new kt,Dp=new ve,Up=class extends cd{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=qm.FRAME,this._renderTargetEdges=new Ee(1,1,{depthBuffer:!1,type:At}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new Ee(1,1,{depthBuffer:!1,type:At}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new Ee(1,1,{depthBuffer:!1,type:At}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=fl("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new Lt,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Ve,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=fl("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new Lt,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=Oe,this._searchTexture.minFilter=Oe,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=L(new ve),this._areaTextureUniform=re(this._areaTexture),this._searchTextureUniform=re(this._searchTexture),this._edgesTextureUniform=re(this._renderTargetEdges.texture),this._weightsTextureUniform=re(this._renderTargetWeights.texture),this._materialEdges=new ke,this._materialEdges.name="SMAANode.edges",this._materialWeights=new ke,this._materialWeights.name="SMAANode.weights",this._materialBlend=new ke,this._materialBlend.name="SMAANode.blend",this._textureNode=Wm(this,this._renderTargetBlend.texture)}getTextureNode(){return this._textureNode}setSize(e,t){this._invSize.value.set(1/e,1/t),this._renderTargetEdges.setSize(e,t),this._renderTargetWeights.setSize(e,t),this._renderTargetBlend.setSize(e,t)}updateBefore(e){let{renderer:t}=e;Nn=oo.resetRendererState(t,Nn);let a=t.getDrawingBufferSize(Dp);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),Ur.material=this._materialEdges,Ur.render(t),t.setRenderTarget(this._renderTargetWeights),Ur.material=this._materialWeights,Ur.render(t),t.setRenderTarget(this._renderTargetBlend),Ur.material=this._materialBlend,Ur.render(t),oo.restoreRendererState(t,Nn)}setup(e){let t=A(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||Ie(),s=U(()=>{let y=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(-1,0,0,-1))),g=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(1,0,0,1))),x=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(-2,0,0,-2)));return mt("vec4","vOffset0").assign(y),mt("vec4","vOffset1").assign(g),mt("vec4","vOffset2").assign(x),_n}),i=U(()=>{let y=mt("vec4","vOffset0"),g=mt("vec4","vOffset1"),x=mt("vec4","vOffset2"),v=A(.1,.1),V=P().toVar(),T=this.textureNode.sample(r).rgb.toVar(),z=this.textureNode.sample(y.xy).rgb.toVar(),b=de(T.sub(z));V.x=Q(b.r,b.g,b.b);let M=this.textureNode.sample(y.zw).rgb.toVar();b=de(T.sub(M)),V.y=Q(b.r,b.g,b.b);let S=Ne(v,V.xy).toVar();q(S,A(1,1)).equal(0).discard();let C=this.textureNode.sample(g.xy).rgb.toVar();b=de(T.sub(C)),V.z=Q(b.r,b.g,b.b);let R=this.textureNode.sample(g.zw).rgb.toVar();b=de(T.sub(R)),V.w=Q(b.r,b.g,b.b);let k=Q(V.x,V.y,V.z,V.w).toVar(),E=this.textureNode.sample(x.xy).rgb.toVar();b=de(T.sub(E)),V.z=Q(b.r,b.g,b.b);let I=this.textureNode.sample(x.zw).rgb.toVar();return b=de(T.sub(I)),V.w=Q(b.r,b.g,b.b),k=Q(k,V.z,V.w),S.xy.mulAssign(A(Ne(c(.5).mul(k),V.xy))),P(S,0,0)}),n=U(([y,g,x,v])=>{let V=A(g).toVar();return V.r=x.add(V.r.mul(v)),c(255).mul(y.sample(V)).r}),l=U(([y,g,x,v,V])=>{let T=c(16).mul(c(4).mul(A(x,v)).round()).add(g);return T=t.mul(T).add(c(.5).mul(t)),T.y.addAssign(c(a).mul(V)),y.sample(T).rg}),o=U(([y,g,x,v])=>{let V=A(0,1).toVar(),T=A(x).toVar();return We({start:N(0),end:N(8),type:"int",condition:"<"},()=>{V.assign(y.sample(T).rg),T.subAssign(A(2,0).mul(this._invSize)),B(T.x.lessThanEqual(v).or(V.g.lessThanEqual(c(.8281)).or(V.r.notEqual(c(0)))),()=>{sa()})}),T.x.addAssign(c(.25).mul(this._invSize.x)),T.x.addAssign(this._invSize.x),T.x.addAssign(c(2).mul(this._invSize.x)),T.x.subAssign(this._invSize.x.mul(n(g,V,0,.5))),T.x}),u=U(([y,g,x,v])=>{let V=A(0,1).toVar(),T=A(x).toVar();return We({start:N(0),end:N(8),type:"int",condition:"<"},()=>{V.assign(y.sample(T).rg),T.addAssign(A(2,0).mul(this._invSize)),B(T.x.greaterThanEqual(v).or(V.g.lessThanEqual(c(.8281)).or(V.r.notEqual(c(0)))),()=>{sa()})}),T.x.subAssign(c(.25).mul(this._invSize.x)),T.x.subAssign(this._invSize.x),T.x.subAssign(c(2).mul(this._invSize.x)),T.x.addAssign(this._invSize.x.mul(n(g,V,.5,.5))),T.x}),d=U(([y,g,x,v])=>{let V=A(1,0).toVar(),T=A(x).toVar();return We({start:N(0),end:N(8),type:"int",condition:"<"},()=>{V.assign(y.sample(T).rg),T.addAssign(A(0,-2).mul(this._invSize)),B(T.y.lessThanEqual(v).or(V.r.lessThanEqual(c(.8281)).or(V.g.notEqual(c(0)))),()=>{sa()})}),T.y.addAssign(c(.25).mul(this._invSize.y)),T.y.addAssign(this._invSize.y),T.y.addAssign(c(2).mul(this._invSize.y)),T.y.subAssign(this._invSize.y.mul(n(g,V.gr,0,.5))),T.y}),m=U(([y,g,x,v])=>{let V=A(1,0).toVar(),T=A(x).toVar();return We({start:N(0),end:N(8),type:"int",condition:"<"},()=>{V.assign(y.sample(T).rg),T.subAssign(A(0,-2).mul(this._invSize)),B(T.y.greaterThanEqual(v).or(V.r.lessThanEqual(c(.8281)).or(V.g.notEqual(c(0)))),()=>{sa()})}),T.y.subAssign(c(.25).mul(this._invSize.y)),T.y.subAssign(this._invSize.y),T.y.subAssign(c(2).mul(this._invSize.y)),T.y.addAssign(this._invSize.y.mul(n(g,V.gr,.5,.5))),T.y}),h=U(()=>{let y=r.xy.div(this._invSize),g=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(-.25,-.125,1.25,-.125))).toVar(),x=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(-.125,-.25,-.125,1.25))).toVar(),v=P(g.xz,x.yw).add(P(-2,2,-2,2).mul(P(this._invSize.xx,this._invSize.yy)).mul(c(8))).toVar();return mt("vec2","vPixcoord").assign(y),mt("vec4","vOffset0").assign(g),mt("vec4","vOffset1").assign(x),mt("vec4","vOffset2").assign(v),_n}),f=U(()=>{let y=mt("vec2","vPixcoord"),g=mt("vec4","vOffset0"),x=mt("vec4","vOffset1"),v=mt("vec4","vOffset2"),V=P(0,0,0,0).toVar(),T=P(0,0,0,0).toVar(),z=this._edgesTextureUniform.sample(r).rg.toVar();return B(z.g.greaterThan(c(0)),()=>{let b=A().toVar(),M=A().toVar();M.x=o(this._edgesTextureUniform,this._searchTextureUniform,g.xy,v.x),M.y=x.y,b.x=M.x;let S=this._edgesTextureUniform.sample(M).r.toVar(),C=A().toVar();C.x=u(this._edgesTextureUniform,this._searchTextureUniform,g.zw,v.y),C.y=x.y,b.y=C.x,b=b.div(this._invSize.x).sub(y.x);let R=Ea(de(b)),k=this._edgesTextureUniform.sample(C.add(A(1,0).mul(this._invSize))).r.toVar();V.r=k,V.rg=l(this._areaTextureUniform,R,S,k,c(T.y))}),B(z.r.greaterThan(c(0)),()=>{let b=A().toVar(),M=A().toVar();M.y=d(this._edgesTextureUniform,this._searchTextureUniform,x.xy,v.z),M.x=g.x,b.x=M.y;let S=this._edgesTextureUniform.sample(M).g.toVar(),C=A().toVar();C.y=m(this._edgesTextureUniform,this._searchTextureUniform,x.zw,v.w),C.x=g.x,b.y=C.y,b=b.div(this._invSize.y).sub(y.y);let R=Ea(de(b)),k=this._edgesTextureUniform.sample(C.add(A(0,1).mul(this._invSize))).g.toVar();V.ba=l(this._areaTextureUniform,R,S,k,c(T.x))}),V}),p=U(()=>{let y=P(r.xy,r.xy).add(P(this._invSize.xy,this._invSize.xy).mul(P(1,0,0,1)));return mt("vec4","vOffset1").assign(y),_n}),_=U(()=>{let y=mt("vec4","vOffset1"),g=P().toVar(),x=P().toVar();return x.xz=this._weightsTextureUniform.sample(r).xz,x.y=this._weightsTextureUniform.sample(y.zw).g,x.w=this._weightsTextureUniform.sample(y.xy).a,B(q(x,P(1)).lessThan(1e-5),()=>{g.assign(this.textureNode.sample(r))}).Else(()=>{let v=A().toVar();v.x=x.a.greaterThan(x.b).select(x.a,x.b.negate()),v.y=x.g.greaterThan(x.r).select(x.g,x.r.negate()),B(de(v.x).greaterThan(de(v.y)),()=>{v.y.assign(0)}).Else(()=>{v.x.assign(0)});let V=this.textureNode.sample(r).toVar(),T=A(r).toVar();T.addAssign(Xa(v).mul(this._invSize));let z=this.textureNode.sample(T).toVar(),b=de(v.x).greaterThan(de(v.y)).select(de(v.x),de(v.y)).toVar(),M=X(V,z,b);g.assign(M)}),g});return this._materialEdges.vertexNode=s().context(e.getSharedContext()),this._materialEdges.fragmentNode=i().context(e.getSharedContext()),this._materialEdges.needsUpdate=!0,this._materialWeights.vertexNode=h().context(e.getSharedContext()),this._materialWeights.fragmentNode=f().context(e.getSharedContext()),this._materialWeights.needsUpdate=!0,this._materialBlend.vertexNode=p().context(e.getSharedContext()),this._materialBlend.fragmentNode=_().context(e.getSharedContext()),this._materialBlend.needsUpdate=!0,this._textureNode}dispose(){this._renderTargetEdges.dispose(),this._renderTargetWeights.dispose(),this._renderTargetBlend.dispose(),this._areaTexture.dispose(),this._searchTexture.dispose(),this._materialEdges.dispose(),this._materialWeights.dispose(),this._materialBlend.dispose()}_getAreaTexture(){return""}_getSearchTexture(){return""}},Bn=new ve,Qo=new gt,Op=class{constructor(){this._rt=null,this._texNode=null,this._smaaNode=null,this._material=null,this._quad=null,this._depthTexNode=null,this._seedMaterial=null,this._seedQuad=null}_ensureTarget(e,t,a){if(this._rt===null||this._rt.width!==e||this._rt.height!==t){this._rt?.dispose();let s=new Ee(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});s.texture.name="SplineHelperOverlay.color",this._rt=s}if(this._texNode===null){this._texNode=re(this._rt.texture),this._smaaNode=(r=this._texNode,new Up(Em(r)));let s=new ke;s.name="SplineHelperOverlayComposite",s.fragmentNode=this._smaaNode,s.transparent=!0,s.blending=Zc,s.blendEquation=Yc,s.blendSrc=vo,s.blendDst=bo,s.blendSrcAlpha=vo,s.blendDstAlpha=bo,s.depthTest=!1,s.depthWrite=!1,this._material=s,this._quad=new kt(s);let i=new ke;i.name="SplineHelperOverlayDepthSeed",this._depthTexNode=re(a),i.depthNode=this._depthTexNode.x,i.fragmentNode=P(0),i.colorWrite=!1,i.depthTest=!1,i.depthWrite=!0,this._seedMaterial=i,this._seedQuad=new kt(i)}else this._texNode.value!==this._rt.texture&&(this._texNode.value=this._rt.texture),this._depthTexNode.value!==a&&(this._depthTexNode.value=a);var r;return this._rt}render(e,t,a,r,s){e.getDrawingBufferSize(Bn);let i=this._ensureTarget(Bn.x,Bn.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(Qo);let o=e.getClearAlpha();if(e.autoClear=!1,e.setRenderTarget(i),e.setClearColor(0,0),e.clear(!0,!0,!1),this._seedQuad.render(e),t&&e.render(t,r),e.clear(!1,!0,!1),a&&e.render(a,r),e.setRenderTarget(n),e.setClearColor(Qo,o),Nm()){let u=e.toneMapping,d=e.outputColorSpace;
3e.toneMapping=Fi,e.outputColorSpace=Jc.workingColorSpace,this._quad.render(e),e.toneMapping=u,e.outputColorSpace=d}else this._quad.render(e);e.autoClear=l}dispose(){this._rt?.dispose(),this._rt=null,this._smaaNode?.dispose(),this._material?.dispose(),this._seedMaterial?.dispose()}},Zo=new WeakMap,Fn=new Set,Ln=0,Yo=new WeakMap,ui=new Set,ys=0;function Jo(e){let t=e.parent?.selectedTexture;return t&&t.isTexture===!0?t:null}function di(e){let t=e.src.array,a=e.attr.array;for(let r=0,s=Math.min(t.length,a.length);r<s;r++)a[r]=t[r];e.attr.needsUpdate=!0}var eu=new WeakMap;function Ud(e,t,a,r){let s=e.num(0),i=e.num(1),n=e.num(.5),l=e.num(2),o=e.num(1e-6),u=d=>e.sub(i,d);switch(t){case 0:return a;case 1:return e.min(e.add(a,r),i);case 3:return e.mul(e.add(a,r),n);case 4:{let d=e.max(u(e.div(u(a),e.max(r,o))),s);return e.mix(r,d,e.step(o,r))}case 5:{let d=e.min(e.div(a,e.max(u(r),o)),i);return e.mix(d,r,e.step(i,r))}case 6:return e.min(a,r);case 7:return e.abs(e.sub(a,r));case 8:return e.sub(e.add(a,r),e.mul(l,e.mul(a,r)));case 9:return e.max(a,r);case 10:return e.mul(a,r);case 11:{let d=e.min(e.div(a,e.max(r,o)),i);return e.mix(i,d,e.step(o,r))}case 12:return u(e.abs(e.sub(u(a),r)));case 14:{let d=e.mul(l,e.mul(a,r)),m=u(e.mul(l,e.mul(u(a),u(r))));return e.mix(d,m,e.step(n,a))}case 15:{let d=e.min(e.div(e.mul(a,a),e.max(u(r),o)),i);return e.mix(d,r,e.step(i,r))}case 16:return u(e.mul(u(a),u(r)));case 17:{let d=e.mul(l,r),m=e.add(e.mul(a,d),e.mul(e.mul(a,a),u(d))),h=e.add(e.mul(e.sqrt(e.max(a,s)),e.sub(d,i)),e.mul(e.mul(l,a),u(r)));return e.mix(m,h,e.step(n,r))}case 18:return e.max(e.sub(e.add(a,r),i),s);default:return r}}var Od={num:e=>c(e),add:(e,t)=>e.add(t),sub:(e,t)=>e.sub(t),mul:(e,t)=>e.mul(t),div:(e,t)=>e.div(t),min:(e,t)=>xe(e,t),max:(e,t)=>Q(e,t),abs:e=>de(e),sqrt:e=>Ea(e),step:(e,t)=>Ne(e,t),mix:(e,t,a)=>X(e,t,a)},Gp=Od;function _r(e,t,a,r,s){if(a===0)return e;if(a===2)return X(e,t,xe(s,r));let i=Ud(Od,a,e,t);return X(e,i,r)}function In(e,t,a,r){if(a===0)return e;if(a===2)return Q(e,xe(t,r));let s=Ud(Gp,a,e,t);return X(e,s,r)}var Dn=null;function Un(){return Dn===null&&(Dn=Hs({output:Pm,velocity:ul})),Dn}var Gd=U(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return Se(s,t.div(a).oneMinus().clamp().pow(r),c(1))}),tu=class extends zm{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Gd({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},au=class extends km{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(Am(r)),l=this.getSpotAttenuation(e,n),o=Gd({lightDistance:s.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}),u=this.colorNode.mul(l).mul(o),d=r;if(d.colorNode?(a=this.getLightCoord(e),t=d.colorNode(a)):d.map&&(a=this.getLightCoord(e),t=re(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let m=a.mul(2).sub(1).abs().lessThan(1).all();u=Se(m,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},qd=null,qp=new ne,xs=new ne,Wp=new gt,Hp=new gt,jp=new gt,ru=new ne,su=new ne,$p=new ve,Kp=new ne(1,0,0),Xp=new ne(0,1,0),Qp=new ne(0,0,1),er=new ne,yr=new ne,hi=new ne,xr=new ne,On=new Ra,iu=new ne,mi=new ne,Or=new Xc,Wa=new at,vs=new at,Zp=new ve,Gr=new ve,Ha=new ne,ci=new ne,bs=new ne,Gn=new ne,qr=new ne,ja=[],Wd=!1,Hd=!1,jd=!1,kl="full",$d="g16",Kd=!1,Al=!1,Pl=!1,Rr="default",Xd=!1,Qd=!0,Zd=!0,Yd=!0,Jd=!0,eh=!0,th=Oc;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(t!==null)if(t==="off"||t==="0"||t==="false"||t==="no")eh=!1;else{let s=Number.parseInt(t,10);Number.isFinite(s)&&s>1&&(th=s)}Wd=e.get("dbgao")==="0",Hd=e.get("dbgshadow")==="0",jd=e.get("dbgfp16")==="1",Kd=e.get("dbgsky")==="0",Al=e.get("dbgssr")==="0",Pl=e.get("dbgibl")==="0";let a=e.get("pbrcolor");a==="0"?Rr="off":(a==="linear"||a==="aces"||a==="agx"||a==="neutral")&&(Rr=a),Xd=e.get("dbgplanar")==="0",Qd=e.get("dbgplanarpyr")!=="0",Zd=e.get("dbgssrpyr")!=="0",Yd=e.get("dbgssrhalf")!=="0",Jd=e.get("dbgssrresolve")!=="0";let r=e.get("dbgprefilter");r==="0"?kl="off":r==="base"?kl="base":r==="k4"&&($d="k4")}catch{}function Yp(){return typeof requestAnimationFrame!="function"||typeof document<"u"&&document.hidden===!0?Promise.resolve():new Promise(e=>{let t=!1,a=()=>{t||(t=!0,clearTimeout(r),e())},r=setTimeout(a,250);requestAnimationFrame(a)})}var El=class extends cm{constructor(e={}){var t;super({canvas:e.canvas,alpha:e.alpha??!0,antialias:e.antialias??!1,forceWebGL:e.forceWebGL??!1,powerPreference:e.powerPreference,trackTimestamp:e.trackTimestamp??globalThis.__SPLINE_TRACK_TIMESTAMP__===!0,stencil:!1,requiredLimits:e.requiredLimits,canvasColorSpace:"display-p3",outputBufferType:jd?At:Bi,asyncCompilation:e.asyncCompilation===!0||e.asyncCompilation==="load"}
3),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new ve,this.dummyCamera=new Sn,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this._shadowSyncPromotions=-1,this._lightShadowStateDirty=!1,this._lightShadowSignatures=new WeakMap,this._shadowMapIds=new WeakMap,this._shadowMapIdSeq=0,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=zp,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new Ip,this._stallWarned=!1,this._asyncCompilationMode=!1,this._asyncLoadWarmupsInFlight=0,this.sceneBundlesEnabled=!1,this.sceneBundlesForceRerecord=!1,this._appliedWidth=-1,this._appliedHeight=-1,this._appliedRatio=-1,this._bundleStates=new WeakMap,this._skySystem=null,this._skyFeatureWarned=!1,this.skyAnimationAllowed=!1,this.skyEnvironmentNeeded=!0,this._bundledPages=new Set,this._bundleValveArmed=!1,this._destroyedSubmitErrors=0,this._destroyedSubmitLastFrame=-10,this._warmupTarget=null,this.renderStarted=!1,this._warmupInFlight=!1,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._grabWarmupTarget=null,this._warnedHelperIncompat=new WeakSet,this._maskLights=[],this._maskBlocked=!1,this.suppressShadowMask=!1,this._grabTargetEpoch=0,this._retiredGrabTargets=[],this._retiredGpuBuffers=[],this._bundleEpochDirty=!1,this._encodeMaterials={},this._transmissionChain=[],this._reflectionColorChain=[],this._reflectionDepthChain=[],this._reflectionPassesKey="",this._reflectionResolveMarchKey="",this._planarChain=[],this._frameSerial=0,this._asyncCompilationMode=e.asyncCompilation??!1,this._updateCompilationBurst(),Ao&&(function(){if(!Eo){if(Eo=!0,xl=()=>W.frameIndex.value,typeof GPUBuffer<"u"){let a=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Bo("buffer",this.label,this.size),a.call(this)}}if(typeof GPUTexture<"u"){let a=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Bo("texture",this.label,`${this.width}x${this.height}`),a.call(this)}}console.info("[spline/webgpu] ?dbgdestroys=1 â GPU resource destroy logging armed; reproduce the error and read the [dbgdestroys] dumps")}})(),this.pipeline=new Ed(this),this.library.addLight(vp,gl),this.shadowMap.enabled=!0,this.shadowMap.type=Fc,t=this.backend?.isWebGPUBackend===!0,tn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=ml,this.toneMapping=Fi,(function(a){let r=a.library;r.addLight(tu,Lc),r.addLight(au,Ic),r.addLight(pm,Dc),r.lightNodes.delete(go),r.lightNodes.delete(_o),r.addLight(tu,go),r.addLight(au,_o)})(this),this.sceneBundlesEnabled=e.sceneBundles===!0||e.sceneBundles==="rerecord",this.sceneBundlesForceRerecord=e.sceneBundles==="rerecord",this.auxiliary=e.auxiliary===!0,this.domElement.removeAttribute?.("data-engine")}get lastFrameIncomplete(){return!!(this._warmupInFlight||this._compilationHasWork&&!this._gaugesStalled)||(this._skippedAsyncDraws??0)!==0&&!this._skipStalls.stalled}get _gaugesStalled(){return this._gaugeChangedAt>0&&performance.now()-this._gaugeChangedAt>El._GAUGE_STALL_MS}_trackGaugeStall(){let e=this._asyncCompilationGauges,t=e!==void 0&&(e.queued>0||e.pipelines>0),a=t?`${e.queued}/${e.pipelines}`:"";return t?a!==this._gaugeSnapshot?(this._gaugeSnapshot=a,void(this._gaugeChangedAt=performance.now())):void(this._gaugesStalled&&!this._gaugeStallWarned&&(this._gaugeStallWarned=!0,console.warn(`[spline/webgpu] async pipeline driver stalled (${a} in flight, no movement for ${El._GAUGE_STALL_MS}ms) â treating frames as final so screenshots, thumbnails and the on-demand render loop keep working.`))):(this._gaugeSnapshot="",void(this._gaugeChangedAt=0))}_trackStalledSkips(e){let t=this._compilationHasWork&&!this._gaugesStalled;this._skipStalls.update(e,t),ge.stalledSkipFrames=this._skipStalls.frames,this._skipStalls.stalled&&!this._stallWarned&&(this._stallWarned=!0,console.warn(`[spline/webgpu] ${e} draw(s) are permanently skipped â their render pipelines never became ready (look for "pipeline creation failed" above). Those objects will not appear; the frame is treated as final so screenshots, thumbnails and the on-demand render loop keep working.`))}get _asyncCompilationGauges(){return this.info.asyncCompilation}get _compilationHasWork(){let e=this._asyncCompilationGauges;return e!==void 0&&(e.queued>0||e.pipelines>0)}get asyncCompilationEnabled(){return this._asyncCompilation===!0}get taaHistory(){return this._taaHistory||(this._taaHistory=Dd()),this._taaHistory}
3async init(){await super.init();let e=this.backend.gl;if(e&&"drawingBufferColorSpace"in e)try{e.drawingBufferColorSpace="display-p3"}catch(t){console.warn(t)}return this.backend.device?.lost?.then(t=>{ge.deviceLost=`${t?.reason??"unknown"}: ${t?.message??""}`.trim()}),this}setSize(e,t,a=!0){if(this._appliedWidth!==e||this._appliedHeight!==t||this._appliedRatio!==this.getPixelRatio()){this._appliedWidth=e,this._appliedHeight=t,this._appliedRatio=this.getPixelRatio();let r=this.viewportWidth!==e||this.viewportHeight!==t;this.viewportWidth=e,this.viewportHeight=t,super.setSize(e,t,a),r&&this.pipeline.resize(e,t,a)}return this}setPixelRatio(e=1){return this.getPixelRatio()!==e&&super.setPixelRatio(e),this}get hdTransmission(){return W.transmissionLod.value===1}set hdTransmission(e){W.transmissionLod.value=e===!0?1:2}renderScenePass(e,t){this.render(e,t)}_renderObjects(e,t,a,r,s=null){let i=this,n=s===null&&a.overrideMaterial===null;for(let l=0,o=e.length;l<o;l++){let{object:u,geometry:d,material:m,group:h,clippingContext:f}=e[l];n&&Gh(m)?this._renderWithDepthPrepass(u,a,t,d,m,h,r,f):i._currentRenderObjectFunction(u,a,t,d,m,h,r,f,s)}}_renderWithDepthPrepass(e,t,a,r,s,i,n,l){let o=this,u=(m,h)=>o._handleObjectFunction(e,m,t,a,n,i,l,h),d=i;e.onBeforeRender(this,t,a,r,s,d),s.side===is&&s.forceSinglePass===!1?(u(s.getDepthPrepassTwin(cl),null),s.side=cl,u(s,"backSide"),u(s.getDepthPrepassTwin(pl),null),s.side=pl,u
3(s,null),s.side=is,ge.depthPrepassDraws+=2):(u(s.getDepthPrepassTwin(s.side),null),u(s,null),ge.depthPrepassDraws++),e.onAfterRender(this,t,a,r,s,d)}get skySystem(){return this._skySystem}get skyAnimationActive(){return this._skySystem?.animationActive===!0}*_liveBundledPages(){for(let e of this._bundledPages){let t=e.deref();t===void 0?this._bundledPages.delete(e):yield t}}_armBundleValve(){if(this._bundleValveArmed)return;let e=this.backend.device;typeof e?.addEventListener=="function"&&(this._bundleValveArmed=!0,e.addEventListener("uncapturederror",t=>{if(!this.sceneBundlesEnabled||!(t?.error?.message??"").toLowerCase().includes("destroyed"))return;let a=W.frameIndex.value,r=(a-this._destroyedSubmitLastFrame+16)%16;if(this._destroyedSubmitErrors=r<=2?this._destroyedSubmitErrors+1:1,this._destroyedSubmitLastFrame=a,!(this._destroyedSubmitErrors<4)){this.sceneBundlesEnabled=!1,ge.bundleDisabled=!0;for(let s of this._liveBundledPages()){let i=this._bundleStates.get(s);i&&(i.disabled=!0),s.isBundleGroup=!1}this._bundledPages.clear()}}))}_updateSceneBundle(e,t){if(this.backend.beginBundle===void 0)return;let a=this._bundleStates.get(e);if(a===void 0){let m={signature:-1,rebuilds:0,resourceRebuilds:0,checks:0,disabled:!1,camHash:0,prevCamHash:0,epoch:0,lastEpoch:0,bufferIds:new WeakMap,bufferIdSeq:0,watched:new WeakSet,onResourceDispose:()=>{m.epoch++}};a=m,this._bundleStates.set(e,a),this._bundledPages.add(new WeakRef(e)),this._armBundleValve()}let r=e;if(a.disabled)return;{let m=t.matrixWorld.elements,h=t.projectionMatrix.elements,f=-2128831035;for(let p=0;p<16;p++)f^=1e4*m[p]|0,f=Math.imul(f,16777619),f^=1e4*h[p]|0,f=Math.imul(f,16777619);a.camHash=f}let s=-2128831035,i=m=>{s^=0|m,s=Math.imul(s,16777619)};i(this._grabTargetEpoch),i(e.fog!==null?1:0);let n=a,l=m=>{let h=m;!h||typeof h.addEventListener!="function"||n.watched.has(h)||(n.watched.add(h),h.addEventListener("dispose",n.onResourceDispose))},o=m=>{if(!m)return 0;let h=n.bufferIds.get(m);return h===void 0&&(h=++n.bufferIdSeq,n.bufferIds.set(m,h)),h},u=m=>{l(m),i(m.id),i(m.version),i(m.transparent===!0?1:0),typeof m.assetsLoaded=="function"&&i(m.assetsLoaded()?1:0)},d=!1;if(e.traverse(m=>{let h=m;if(h.isMesh===!0||h.isLine===!0||h.isPoints===!0||h.isSprite===!0){let f=h;f.isDecalObject===!0&&typeof f.updateDecal=="function"&&f.updateDecal()&&(d=!0),h.frustumCulled&&(h.frustumCulled=!1),i(h.id),i(h.visible?1:0),i(h.layers.mask),i(h.renderOrder);let p=h.geometry;l(p),i(p.id),i(p.drawRange.start),i(p.drawRange.count===1/0?-1:p.drawRange.count),i(o(p.index)),i(o(p.attributes.position)),i(p.instanceCount??-1),i(h.count===void 0?-1:h.count);let _=h.material;if(Array.isArray(_))for(let y of _)u(y);else _&&u(_)}else m.isLight===!0?(i(m.id),i(m.visible?1:0),i(m.castShadow?1:0)):(i(m.id),i(m.visible?1:0))}),i(a.epoch),a.checks++,ge.bundleChecks=a.checks,a.checks%600==0){let m=this._bundleDebug;ge.bundleIncompleteRecords=m?.incompleteRecords??0,ge.bundleRecords=m?.records??0,ge.bundleReplays=m?.replays??0,a.prevCamHash=a.camHash}if(r.isBundleGroup!==!0)return r.isBundleGroup=!0,r.static=!0,typeof r.version!="number"&&(r.version=0),void(a.signature=s);if(this.sceneBundlesForceRerecord)return r.version=(r.version??0)+1,void(a.signature=s);if(s!==a.signature){if(a.signature=s,r.version=(r.version??0)+1,a.epoch!==a.lastEpoch)return a.lastEpoch=a.epoch,a.resourceRebuilds++,void(ge.bundleResourceRebuilds=a.resourceRebuilds);if(d)return a.lastEpoch=a.epoch,a.resourceRebuilds++,void(ge.bundleResourceRebuilds=a.resourceRebuilds);a.rebuilds++,ge.bundleRebuilds=a.rebuilds,a.checks>30&&a.rebuilds/a.checks>.1&&(a.disabled=!0,r.isBundleGroup=!1,ge.bundleDisabled=!0)}}_ensureWarmupTarget(){if(this._warmupTarget===null){let e=new Ee(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=Bi,e.textures[1].name="velocity",e.textures[1].type=At;let t=new Cr(2,2);t.isRenderTargetTexture=!0,e.depthTexture=t,this._warmupTarget=e}return this._warmupTarget}get warmupInFlight(){return this._warmupInFlight}setRenderTarget(e,t=0,a=0){this._warmupInFlight?this._warmupPendingTarget=[e,t,a]:super.setRenderTarget(e,t,a)}setMRT(e){return this._warmupInFlight?(this._warmupPendingMRT=[e],this):(super.setMRT(e),this)}async compileSceneAsync(e,t){if(!t)return;{let s=e instanceof li?e.activePage:e;$o(yo.isSoft(s?.data?.shadow)),s&&Vo(s)}if(this._asyncCompilationMode!==!1)return this._asyncCompilationMode==="load"&&(this._setThreeAsyncCompilation(!0),this._updateCompilationBurst()),this._compileSceneAsyncBackgroun
3d(e,t);if(this.renderStarted||this._warmupInFlight)return;let a=this.getRenderTarget(),r=this.getMRT();this._warmupInFlight=!0,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._updateCompilationBurst();try{this.normalizeCameraCoordinateSystem(t),this.temporalAAEnabled&&(super.setRenderTarget(this._ensureWarmupTarget()),super.setMRT(Un())),await this.compileAsync(e,t)}catch(s){console.warn("[spline/webgpu] pipeline warm-up failed:",s)}finally{let s=this._warmupPendingTarget,i=this._warmupPendingMRT;this._warmupInFlight=!1,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._updateCompilationBurst(),s!==null?super.setRenderTarget(s[0],s[1],s[2]):super.setRenderTarget(a),i!==null?super.setMRT(i[0]):super.setMRT(r)}}async _compileSceneAsyncBackground(e,t){this._asyncLoadWarmupsInFlight++,this._updateCompilationBurst();try{await this.init(),this.normalizeCameraCoordinateSystem(t);let a,r=this.getRenderTarget(),s=this.getMRT();try{this.temporalAAEnabled&&(super.setRenderTarget(this._ensureWarmupTarget()),super.setMRT(Un())),a=this.compileAsync(e,t)}finally{super.setRenderTarget(r),super.setMRT(s)}let i=this._warmupGrabContext(e,t);await a,await i}catch(a){console.warn("[spline/webgpu] pipeline warm-up failed:",a)}finally{this._asyncLoadWarmupsInFlight--,this._updateCompilationBurst(),this._maybeCloseAsyncLoadWindow()}}_disposeWarmupTargets(){this._warmupTarget?.depthTexture?.dispose(),this._warmupTarget?.dispose(),this._warmupTarget=null,this._grabWarmupTarget?.depthTexture?.dispose(),this._grabWarmupTarget?.dispose(),this._grabWarmupTarget=null}_warmupGrabContext(e,t){let a=e instanceof li?e:e.scene;if(a.needsTransmission?.()!==!0&&a.needsReflection?.()!==!0)return null;if(this._grabWarmupTarget===null){let i=new Ee(2,2);i.texture.type=Bi;let n=new Cr(2,2);n.isRenderTargetTexture=!0,i.depthTexture=n,this._grabWarmupTarget=i}let r=this.getRenderTarget(),s=this.getMRT();try{return super.setRenderTarget(this._grabWarmupTarget),super.setMRT(null),this.compileAsync(e,t)}finally{super.setRenderTarget(r),super.setMRT(s)}}_setThreeAsyncCompilation(e){this.setAsyncCompilation(e)}_updateCompilationBurst(){let e=this._warmupInFlight||this._asyncLoadWarmupsInFlight>0||this._asyncCompilationMode==="load"&&this.asyncCompilationEnabled;this.setCompilationBurst(e),ge.compilationBurst=e}_maybeCloseAsyncLoadWindow(){this._asyncCompilationMode==="load"&&(!this.asyncCompilationEnabled||this._asyncLoadWarmupsInFlight>0||this._frameSerial!==0&&((this._skippedAsyncDraws??0)>0&&!this._skipStalls.stalled||this._compilationHasWork||(this._setThreeAsyncCompilation(!1),this._updateCompilationBurst())))}normalizeCameraCoordinateSystem(e){let t=e;(t.coordinateSystem!==this.coordinateSystem||t.perspCamera!==void 0&&t.perspCamera.coordinateSystem!==this.coordinateSystem||t.orthoCamera!==void 0&&t.orthoCamera.coordinateSystem!==this.coordinateSystem)&&(t.coordinateSystem=this.coordinateSystem,t.perspCamera!==void 0&&(t.perspCamera.coordinateSystem=this.coordinateSystem),t.orthoCamera!==void 0&&(t.orthoCamera.coordinateSystem=this.coordinateSystem),e.updateProjectionMatrix?.())}_prepareHelpers(e,t,a){e.traverse(r=>{let s=r;if(r.isPoints===!0){let l=(function(o){if(Array.isArray(o.material)||o.parent===null||o.geometry.getAttribute("position")===void 0)return null;let u=o.material;return u.isNodeMaterial===!0?null:u.isPointsMaterial===!0?(function(d,m){if(m.size<=1)return null;let h=Yo.get(d);return h&&(h.epoch!==ys||h.srcMaterial!==m||h.geometry!==d.geometry||h.position.src!==d.geometry.getAttribute("position")||h.map!==m.map||h.selectedMap!==Jo(d))&&(h.sprite.removeFromParent(),h.material.dispose(),h=void 0),h||(h=(function(f,p){let _=f.geometry,y=_.getAttribute("position"),g=_.getAttribute("aSelection"),x=_.getAttribute("aVisibility"),v=p.map,V=Jo(f),T=new Vn(y.array,3);T.setUsage(Li);let z={src:y,attr:T,version:y.version},b=[],M=H=>{let K=new Vn(new Float32Array(H.count),1);K.setUsage(Li);let O={src:H,attr:K,version:H.version};return di(O),b.push(O),O},S=g?M(g):null,C=x?M(x):null,R=new ol;R.name=`SplinePointsTwin(${p.name||p.type})`,R.positionNode=wr(z.attr,"vec3"),R.size=p.size,R.sizeAttenuation=p.sizeAttenuation,R.transparent=p.transparent,R.depthTest=p.depthTest,R.depthWrite=p.depthWrite,R.blending=p.blending,R.fog=!1;let k=S?wr(S.attr,"float"):null,E=C?wr(C.attr,"float"):null;R.colorNode=U(()=>{E!==null?pn(E.lessThan(.5)):k!==null&&pn(k.greaterThan(.5));let H=v!==null?re(v,Ie()):P(1);return(k!==null&&v!==null&&V!==null?X(H,re(V,Ie()),k):H).mul(P(fm,1))})();let I=new xo(R);I.name=`SplinePointsTwin(${f.name||f.type})`,I.frustumCulled=!1,I.raycast=()=>{};let D={sprite:I,material:R,srcMaterial:p,geometry:_,map:v,selectedMap:V,position:z,mirrors:b,epoch:ys};return ui.add(new WeakRef(D)),D})(d,m),Yo.set(d,h)),h.sprite.parent!==d.parent&&d.parent.add(h.sprite),(function(f,p){let{sprite:_,position:y,srcMaterial:g}
3=p;y.version!==y.src.version&&(p.position.attr.needsUpdate=!0,y.version=y.src.version);for(let v of p.mirrors)v.version!==v.src.version&&(di(v),v.version=v.src.version);let x=Math.max(0,Math.min(p.geometry.drawRange.count,y.src.count));_.count=x,p.material.size=g.size,p.material.opacity=g.opacity,p.material.color.copy(g.color),_.layers.mask=f.layers.mask,_.renderOrder=f.renderOrder})(d,h),h.sprite})(o,u):(function(d,m){if(m.isShaderMaterial!==!0)return!1;let h=m.uniforms,f=h?.pointSize?.value,p=h?.color?.value;return typeof f=="number"&&f>1&&Array.isArray(p)&&p.length>=3&&d.geometry.getAttribute("hover")!==void 0&&d.geometry.getAttribute("selected")!==void 0})(o,u)?(function(d,m){let h=eu.get(d);return h&&(h.epoch!==ys||h.srcMaterial!==m||h.geometry!==d.geometry||!(function(f,p){let _=[[f.position,"position"],[f.hover,"hover"],[f.selected,"selected"]];for(let[y,g]of _){let x=p.getAttribute(g);if(x===void 0)return!1;if(y.src!==x){if(x.count!==y.attr.count)return!1;y.src=x,y.version=-1}}return!0})(h,d.geometry))&&(h.sprite.removeFromParent(),h.material.dispose(),h=void 0),h||(h=(function(f,p){let _=f.geometry,y=p.uniforms,g=(k,E)=>{let I=new Vn(new Float32Array(k.count*E),E);I.setUsage(Li);let D={src:k,attr:I,version:k.version};return di(D),D},x=g(_.getAttribute("position"),3),v=g(_.getAttribute("hover"),1),V=g(_.getAttribute("selected"),1),T=L(y.pointSize.value),z=L(new gt().fromArray(y.color.value)),b=new ol;b.name=`SplinePointsTwin(${p.name||p.type})`,b.positionNode=wr(x.attr,"vec3");let M=wr(v.attr,"float"),S=wr(V.attr,"float");b.sizeNode=T.add(M.mul(4)),b.sizeAttenuation=!1,b.transparent=p.transparent,b.depthTest=p.depthTest,b.depthWrite=p.depthWrite,b.blending=p.blending,b.fog=!1,b.colorNode=U(()=>{let k=we(Ie().mul(2).sub(1)).toVar();pn(k.greaterThan(1));let E=Se(S.equal(1),w(.22,.9,.7),z.add(M.mul(.25)));return P(Se(k.greaterThan(.75),w(1),E),1)})();let C=new xo(b);C.name=`SplinePointsTwin(${f.name||f.type})`,C.frustumCulled=!1,C.raycast=()=>{};let R={sprite:C,material:b,srcMaterial:p,geometry:_,pointSize:T,color:z,position:x,hover:v,selected:V,epoch:ys};return ui.add(new WeakRef(R)),R})(d,m),eu.set(d,h)),h.sprite.parent!==d.parent&&d.parent.add(h.sprite),(function(f,p){for(let g of[p.position,p.hover,p.selected])g.version!==g.src.version&&(di(g),g.version=g.src.version);let _=p.srcMaterial.uniforms;p.pointSize.value=_.pointSize.value,p.color.value.fromArray(_.color.value);let y=Math.max(0,Math.min(p.geometry.drawRange.count,p.position.src.count));p.sprite.count=y,p.material.opacity=p.srcMaterial.opacity,p.sprite.layers.mask=f.layers.mask,p.sprite.renderOrder=f.renderOrder})(d,h),h.sprite})(o,u):null})(r);if(l!==null)return l.visible=s.visible,void(s.visible&&(t.push(s),s.visible=!1))}let i=!1,n=Array.isArray(s.material)?s.material:s.material?[s.material]:[];for(let l of n){let o=l;if(o.isShaderMaterial===!0&&o.isNodeMaterial!==!0){i=!0,`${o.type}`;break}}if(i&&!Array.isArray(s.material)){let l=(function(o){return o.isLineMaterial===!0?(function(u){let d=Zo.get(u);if(!d||d.epoch!==Ln){let _=new gm;_.name=`SplineHelperTwin(${u.name||u.type})`,_.worldUnits=!1,d={twin:_,epoch:Ln},Zo.set(u,d),Fn.add(new WeakRef(_))}let m=d.twin,h=u;m.color.copy(h.color),m.linewidth=h.linewidth,m.opacity=h.opacity,m.transparent=h.transparent,m.depthTest=h.depthTest,m.depthWrite=h.depthWrite,m.side=h.side;let f=h.dashed===!0;if(m.dashed!==f&&(m.dashed=f,m.needsUpdate=!0),f){let _=m;_.dashScale=h.dashScale??1,_.dashSize=h.dashSize??1,_.gapSize=h.gapSize??1}let p=h.vertexColors===!0||h.vertexColors===2;return m.vertexColors!==p&&(m.vertexColors=p,m.needsUpdate=!0),m})(o):null})(s.material);if(l)return a.push({object:s,original:s.material}),void(s.material=l)}!i&&s.geometry?.isInstancedBufferGeometry===!0&&!Number.isFinite(s.geometry.instanceCount??0)&&(i=!0),i&&s.visible&&(this._warnedHelperIncompat.has(r)||this._warnedHelperIncompat.add(r),t.push(s),s.visible=!1)})}renderHelperOverlay(e,t,a,r){let s=[],i=[];if(e&&this._prepareHelpers(e,s,i),t&&this._prepareHelpers(t,s,i),r)this._helperOverlay??(this._helperOverlay=new Op),this._helperOverlay.render(this,e,t,a,r),ge.helperOverlayMode="smaa";else{let n=this.autoClear;this.autoClear=!1,e&&this.render(e,a),t&&(this.clearDepth(),this.render(t,a)),this.autoClear=n,ge.helperOverlayMode="direct"}for(let n of i)n.object.material=n.original;for(let n of s)n.visible=!0}
vendor: 4,888 bytes, line 3
3createEffectChain(){return(function(e){let t=e.pipeline,a=t.postprocessingState,r=a.enabled===!0,s=_m(t.scene,t.camera),i=e.hdrChainActive;try{let S=new URLSearchParams(window.location.search).get("dbgfp16");(S==="scene"||S==="st")&&(i=!0)}catch{}let n=s.getTextureNode(),l=n,o=null;if(e.temporalAAEnabled){s.setMRT(Un()),o=(function(S,C,R,k,E=!1){return new Lp(S,C,R,k,E)})(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=At;try{if(new URLSearchParams(window.location.search).get("dbgvel")==="1"){let S=s.getTextureNode("velocity");l=P(S.x.mul(20).add(.5),S.y.mul(20).add(.5),c(.5),c(1))}}catch{}}i?s.getTexture("output").type=At:dd()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(S,C)=>typeof S=="number"&&Number.isFinite(S)?S:C,d={bloomIntensity:L(1),caOffset:L(new ve(0,0)),caAspect:L(1),vignetteOffset:L(0),vignetteDarkness:L(0),hueVector:L(new ne(1,0,0)),saturationFactor:L(0),brightness:L(0),bcContrastScale:L(1),dofFocusDistance:L(0),dofFocalLength:L(0),dofBokehScale:L(1),dofCameraNear:L(50),dofCameraFar:L(1e4),dofOrtho:L(0),pixelCells:L(new ve(1,1)),bloomOpacity:L(1),caOpacity:L(1),vignetteOpacity:L(1),noiseOpacity:L(1),hueSaturationOpacity:L(1),brightnessContrastOpacity:L(1),dofOpacity:L(1)},m=(S,C)=>{d.bloomIntensity.value=u(S.bloom.intensity,1),d.bloomOpacity.value=u(S.bloom.opacity,1),d.caOffset.value.set(u(S.chromaticAberration.offset?.[0],10),u(S.chromaticAberration.offset?.[1],10)),d.caOpacity.value=u(S.chromaticAberration.opacity,1),d.vignetteOffset.value=u(S.vignette.offset,.5),d.vignetteDarkness.value=u(S.vignette.darkness,.5),d.vignetteOpacity.value=u(S.vignette.opacity,1),d.noiseOpacity.value=u(S.noise.opacity,1),d.hueVector.value.fromArray((function(O){let j=Math.sin(O),Z=Math.cos(O);return[(2*Z+1)/3,(-Math.sqrt(3)*j-Z+1)/3,(Math.sqrt(3)*j-Z+1)/3]})(u(S.hueSaturation.hue,0))),d.saturationFactor.value=(function(O){return O>0?1-1/(1.001-O):-O})(u(S.hueSaturation.saturation,0)),d.hueSaturationOpacity.value=u(S.hueSaturation.opacity,1),d.brightness.value=u(S.brightnessContrast.brightness,0);let R=Math.min(u(S.brightnessContrast.contrast,0),.9999);d.bcContrastScale.value=R>0?1/(1-R):1+R,d.brightnessContrastOpacity.value=u(S.brightnessContrast.opacity,1);let k=t.camera,E=k?.isPerspectiveCamera===!0,I=em(u(S.depthOfField.focusDistance,mn.focusDistance),u(S.depthOfField.focalLength,mn.focalLength),E);d.dofFocusDistance.value=I.focusDistance,d.dofFocalLength.value=I.focusRange,d.dofBokehScale.value=u(S.depthOfField.bokehScale,mn.bokehScale),d.dofOpacity.value=u(S.depthOfField.opacity,1),d.dofCameraNear.value=u(k?.near,50),d.dofCameraFar.value=u(k?.far,1e4),d.dofOrtho.value=E?0:1;let D=C.resolution.x?C.resolution:new ve(C.viewportWidth*C.getPixelRatio(),C.viewportHeight*C.getPixelRatio());d.caAspect.value=D.y>0?D.x/D.y:1;let H=Math.floor(u(S.pixelation.granularity,30));H%2>0&&(H+=1);let K=H>0;d.pixelCells.value.set(K?D.x/H:D.x,K?D.y/H:D.y)};m(a,e);let h=l,f=h.rgb,p=h.a,_=r&&a.pixelation.enabled,y=d.pixelCells,g=S=>S.mul(y).floor().add(.5).div(y),x=o?o.outputTextureNode:n;if(_){let S=x.sample(g(Ie()));f=X(f,S.rgb,1),p=X(p,S.a,1)}if(r&&a.chromaticAberration.enabled){let S=a.chromaticAberration,C=d.caOffset.mul(.001).mul(A(1,d.caAspect)),R=D=>_?g(D):D,k=x.sample(R(Ie().add(C))),E=x.sample(R(Ie().sub(C))),I=Q(Q(k.a,E.a),p);f=_r(f,w(k.r,f.g,E.b),S.blendFunction,d.caOpacity,I),p=In(p,I,S.blendFunction,d.caOpacity)}let v=null;if(r&&a.depthOfField.enabled){let S=wo("depthOfField");if(S){let C=a.depthOfField;v=S(P(f,p),x,s.getTextureNode("depth"),{focusDistance:d.dofFocusDistance,focusRange:d.dofFocalLength,bokehScale:d.dofBokehScale,cameraNear:d.dofCameraNear,cameraFar:d.dofCameraFar,orthographic:d.dofOrtho},{halfFloat:i,inputUv:_?g:void 0});let R=v;f=_r(f,R.rgb,C.blendFunction,d.dofOpacity,R.a),p=In(p,R.a,C.blendFunction,d.dofOpacity)}else So("depthOfField","webgpu")}let V=null;if(r&&a.bloom.enabled){let S=wo("bloom");if(S){let C=a.bloom;V=S(o?o.outputTextureNode:n,{kernelSize:Uc(C.kernelSize),blurScale:u(C.blurScale,1),luminanceThreshold:u(C.luminanceThreshold,.9),luminanceSmoothing:u(C.luminanceSmoothing,.025)});let R=ie(V.mul(d.bloomIntensity),0,1);f=_r(f,R.rgb,C.blendFunction,d.bloomOpacity,R.a),p=In(p,R.a,C.blendFunction,d.bloomOpacity)}else So("bloom","webgpu")}if(r&&a.hueSaturation.enabled){let S=a.hueSaturation,C=d.hueVector,R=w(q(f,C),q(f,C.zxy),q(f,C.yzx)),k=R.r.add(R.g).add(R.b).div(3);f=_r(f,R.add(w(k).sub(R).mul(d.saturationFactor)).min(1),S.blendFunction,d.hueSaturationOpacity,p)}if(r&&a.brightnessContrast.enabled){let S=a.brightnessContrast,C=f.add(w(d.brightness));C=C.sub(.5).mul(d.bcContrastScale).add(.5),f=_r(f,C.min(1),S.blendFunction,d.brightnessContrastOpacity,p)}if(r&&a.vignette.enabled){let S=a.vignette,C=we(Ie().sub(.5)).mul(d.vignetteDarkness.add(d.vignetteOffset)),R=Ze(d.vignetteOffset.mul(.799),c(.8),C
3).oneMinus();f=_r(f,f.mul(R),S.blendFunction,d.vignetteOpacity,p)}if(r&&a.noise.enabled){let S=a.noise,C=Ae(Zt(qa(q(Ie().mul(ym),A(12.9898,78.233)),Math.PI)).mul(43758.5453));f=_r(f,w(C),S.blendFunction,d.noiseOpacity,p)}r&&(i?f=f.max(0):(f=ie(f,0,1),p=ie(p,0,1)));let T=P(f,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let S=re(t.uiCanvasTexture,Ie().flipY()),C=X(T.rgb,S.rgb,S.a),R=ie(T.a.add(S.a),0,1);T=P(C,R)}let z=t.sceneTransitionFromTexture;if(z){let S=re(z,Ie()),C=t.sceneTransitionPass.uniforms.mixRatio;T=X(S,T,C)}let b=t.watermarkTexture;if(b){let S=b.image,C=S?.width||128,R=S?.height||32,k=new ve(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),E=12*e.getPixelRatio(),I=.5*C*e.getPixelRatio(),D=.5*R*e.getPixelRatio(),H=A((k.x-I-E)/k.x,E/k.y),K=A(I/k.x,D/k.y),O=Ie().flipY().sub(H).div(K),j=O.x.greaterThanEqual(0).and(O.x.lessThanEqual(1)).and(O.y.greaterThanEqual(0)).and(O.y.lessThanEqual(1)),Z=ie(O,0,1),$=re(b,Z),me=$.a.mul(j.select(c(1),c(0)));T=P(X(T.rgb,$.rgb,me),ie(T.a.add(me),0,1))}let M=new xm(e,T);return{syncValues:m,render(){s.scene=t.scene,s.camera=t.camera,M.render()},renderTAAResolve:o?S=>{s.scene=t.scene,s.camera=t.camera,o.renderResolve(S)}:null,renderBloomPasses:V?S=>{s.scene=t.scene,s.camera=t.camera,V.renderBloom(S)}:null,renderDoFPasses:v?S=>{s.scene=t.scene,s.camera=t.camera,v.renderDoF(S)}:null,resize(){},sceneDepthTexture:()=>s.renderTarget?.depthTexture??null,dispose(){o?.dispose(),V?.dispose(),v?.dispose(),s.dispose(),M.dispose()}}})(this)}renderSplineSceneWithDummyCamera(e,t,a=1){this.dummyCamera.updateCameraState(t.dataPatched),this.dummyCamera.matrix.copy(t.matrixWorld);let r=t.height,s=t.width,i=this.viewportWidth/this.viewportHeight;s<r?s=r*i:r=s/i,this.dummyCamera.setViewplaneSize(s,r);for(let n=0;n<a;n++)this.renderSplineScene(e,this.dummyCamera)}renderSplineScene(e,t,{sceneHelpers:a=this.sceneHelpers,sceneHelpersOnTop:r=this.sceneHelpersOnTop}={}){if(this._warmupInFlight)return;this._maybeCloseAsyncLoadWindow(),this._frameSerial++,this._disposeRetiredGrabTargets(),(co()?.drainRetired()??0)+(so()?.drainRetired()??0)>0&&this._retireBundleRecords(),Ao&&(function(g){if(g==null||g===No)return;let x=g;typeof x.addEventListener=="function"&&(No=g,x.addEventListener("uncapturederror",v=>{let V=v?.error?.message??"";!V.toLowerCase().includes("destroyed")||Po<=0||(Po--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${xl()} (t=${Math.round(performance.now())}ms): 4${V.slice(0,400)} 5â last ${Ds.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,Ds.map(T=>({...T}))))}))})(this.backend.device);let s=this._skippedAsyncDraws??0;ge.skippedAsyncDraws=s,this._skippedAsyncDraws=0,this._trackStalledSkips(s),this._trackGaugeStall(),Jh(this);let i=e instanceof li?e.activePage:e,n=i.visible;i.visible=!0;let l=i.scene;if(Vo(i),this.renderStarted=!0,eh&&e instanceof li){let g=e.updateInstanceGroups(i,th);ge.instancingGroups=g.instancingGroups,ge.instancedDrawsSaved=g.instancedDrawsSaved,ge.instancingRegroups=g.instancingRegroups,ge.instancingParks=g.instancingParks,ge.instancingIneligible=g.instancingIneligible}this.sceneBundlesEnabled&&this._bundleEpochDirty&&(this._bundleEpochDirty=!1,this._updateSceneBundle(i,t)),this.normalizeCameraCoordinateSystem(t),this._applyCIOffscreenTargetIfRequested(),this.setClearColor(i.bgColor,i.bgColor.a),this.clearAlphaOverride!==void 0&&this.setClearAlpha(this.clearAlphaOverride);let o=Kd?null:i.skyState;if(o?.enabled===!0){if(this.skyEnvironmentNeeded=!this.auxiliary&&(!Al&&(l.needsReflectionDirty||l.needsReflection())||!Pl&&o.lighting===!0),this._skySystem===null){let g=qd;g===null?this._skyFeatureWarned||(this._skyFeatureWarned=!0,console.warn("[spline] scene uses the atmospheric sky, but the sky feature is compiled out of this build")):this._skySystem=g(this)}this._skySystem?.update(i,t)}else this._skySystem?.attached&&this._skySystem.detach();if(!this.auxiliary){let g=null,x=0;!Pl&&o?.enabled===!0&&this._skySystem&&(g=this._skySystem.iblTexture??null,x=this._skySystem.iblRotationY??0),(function(v){if(Ga.quality===v)return!1;
5Ga.quality=v;for(let V of Wi)Is(V)})(o?.lightingQuality==="low"?"low":"full"),(function(v){if(Ga.texture===v)return!1;Ga.texture=v,Ga.version++;for(let V of Wi)Is(V)})(g),Ga.rotation.set(0,-x,0),i.environmentIntensity=o?.enabled===!0?o.lightingIntensity??1:1}{let g=Rr==="off"?null:i.gradingState,x=Rr!=="default"&&Rr!=="off",v=x||g?.pipeline==="linear",V=x?Rr==="linear"?"none":Rr:g?.toneMapping??"aces";this.toneMapping=v?V==="aces"?Gc:V==="agx"?qc:V==="neutral"?Wc:Fi:Fi,this.toneMappingExposure=v?g?.exposure??1:1,this.outputColorSpace=v?Yl:ml,this.hdrChainActive=v,this.temporalAAEnabled&&this.taaHistory.setHdr(v)}W.pixelRatio.value=this.getPixelRatio(),this.resolution.x!==0&&this.resolution.y!==0?W.resolution.value.set(this.resolution.x,this.resolution.y):W.resolution.value.set(this.viewportWidth*this.getPixelRatio(),this.viewportHeight*this.getPixelRatio());let u=(W.frameIndex.value+1)%16;W.frameIndex.value=u;let d=Vp[u];W.pcssHalton.value.set(d[0],d[1]),W.tapAngle.value=Math.random()*Math.PI*2,W.tapAngle2.value=Math.random()*Math.PI*2,this._syncLightState(i),this.sceneBundlesEnabled&&this._lightShadowStateDirty&&(this._lightShadowStateDirty=!1,this._updateSceneBundle(i,t)),W.unjitteredProjection.value.copy(t.projectionMatrix);let m=this.temporalAAEnabled?this.taaHistory:null;if(m){let g=this.getDrawingBufferSize(Gr);m.beginJitter(t,g.x,g.y)}this._renderShadowMaskPass(i,t),W.orthographicUniform.value=t.projectionMatrix.elements[11]===0?1:0;let h=l.shapeBlendIntances.length>0?jh():null;if(h!==null)for(let g of l.shapeBlendIntances)h(g).update(g,this,t);let f=l.hairInstances.length>0?Sc():null;if(f!==null)for(let g of l.hairInstances)f(g).update(g,this);l.needsTransmission()&&this._renderTransmissionPass(i,t),l.needsNormal()&&this._renderNormalPass(i,t,l.normalPassNeeds()),i.overrideMaterial=l.wireframeState?Hc:null,t.layers.enable(3),t.layers.enable(8),t.layers.enable(4);let p=i.data.ao,_=p.occlusion&&!Wd&&!0;if(W.aoEnabled.value=_,W.aoEnabledUniform.value=_?1:0,_){let g=this,x=g._skippedAsyncDraws??0;this._renderAOPass(i,t,p),(g._skippedAsyncDraws??0)>x&&(W.aoEnabledUniform.value=0)}if(!Al&&l.needsReflection()?(this._renderReflectionPass(i,t),Xd?W.reflectionPlanarEnabled.value=0:this._renderPlanarReflectionPass(i,t),this._renderReflectionResolvePass(i,t)):W.reflectionResolveEnabled.value=0,this.sceneBundlesEnabled&&this._updateSceneBundle(i,t),this.pipeline.isUIOverlayEnabled&&i.uiCanvas?.enabled&&i.uiCanvas.texture&&i.uiCanvas.texture.image.width>0){let g=this.getPixelRatio();(i.uiCanvas.width!==this.viewportWidth||i.uiCanvas.height!==this.viewportHeight||i.uiCanvas.dpr!==g)&&i.uiCanvas.applySize({width:this.viewportWidth,height:this.viewportHeight},g),i.uiCanvas.render(this),this.pipeline.uiCanvasTexture=i.uiCanvas.texture,this.pipeline.uiOverlayEnabled=!0}else this.pipeline.uiOverlayEnabled=!1;this.pipeline.sceneHelpers=a,this.pipeline.sceneHelpersOnTop=r,this.pipeline.scene=i,this.pipeline.camera=t;let y=qh(i.postprocessing);if(this.pipeline.postprocessingState!==y&&this.pipeline.updatePostprocessing(y),this.pipeline.render(),m?.endJitter(),this._skySystem?.endFrame?.(),ge.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates){let g=(this._skippedAsyncDraws??0)>0&&!this._skipStalls.stalled,x=this.info.asyncCompilation?.promotions??0,v=x!==this._shadowSyncPromotions;this._shadowSyncPromotions=x,l.shadowsDirty=this._shadowMapMissingAtSync||this._warmupInFlight||g||v}t instanceof Sn&&t.copyHistory(),i.visible=n}_fitDirectionalShadowRange(e,t,a){if(a===0)return;let r=e.shadow.camera,s=e.shadow;s.__speRangeEnvelope||(s.__speRangeEnvelope={near:r.near,far:r.far});let i=s.__speRangeEnvelope.near,n=e.data?.depth??s.__speRangeEnvelope.far;if(s.__speRangeEnvelope.far=n,bs.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),Gn.setFromMatrixPosition(e.target.matrixWorld)):Gn.set(0,0,0),qr.subVectors(Gn,bs),qr.lengthSq()<1e-10)return;qr.normalize();let l=1/0,o=-1/0;for(let h=0;h<a;h++){let f=4*h,p=(t[f]-bs.x)*qr.x+(t[f+1]-bs.y)*qr.y+(t[f+2]-bs.z)*qr.z,_=t[f+3];p-_<l&&(l=p-_),p+_>o&&(o=p+_)}let u=Math.max(10,.05*(o-l)),d=25*Math.floor((l-u)/25),m=25*Math.ceil((o+u)/25);
5d=Math.max(d,i),m=Math.min(m,n),m-d>=1&&(r.near!==d||r.far!==m)&&(r.near=d,r.far=m,r.updateProjectionMatrix())}_gatherShadowBounds(e){let t=0;return e.traverseVisible(a=>{let r=a;if(r.castShadow!==!0&&r.receiveShadow!==!0)return;if(r.isHairSystem===!0){let o=r.shadowBoundsRadius??0;if(o>0){r.getShadowBoundsCenter?r.getShadowBoundsCenter(Ha):Ha.setFromMatrixPosition(r.matrixWorld);let u=4*t;ja[u]=Ha.x,ja[u+1]=Ha.y,ja[u+2]=Ha.z,ja[u+3]=o,t++}return}if(r.isMesh!==!0||!r.geometry||r.isInstanceGroup===!0)return;let s=r.geometry.boundingSphere;s===null&&(r.geometry.computeBoundingSphere(),s=r.geometry.boundingSphere);let i=r;if(i.isInstancedMesh===!0&&(i.boundingSphere===null&&i.computeBoundingSphere(),s=i.boundingSphere??s),!s||!Number.isFinite(s.radius)||s.radius<=0)return;Ha.copy(s.center).applyMatrix4(r.matrixWorld),ci.setFromMatrixScale(r.matrixWorld);let n=s.radius*Math.max(Math.abs(ci.x),Math.abs(ci.y),Math.abs(ci.z)),l=4*t;ja[l]=Ha.x,ja[l+1]=Ha.y,ja[l+2]=Ha.z,ja[l+3]=n,t++}),t}_syncLightState(e){let t=yo.isSoft(e.data.shadow);$o(t),ge.shadowTypeSoft=t,(function(m){switch(m){case"low":ur=8;break;case"high":ur=32;break;default:ur=16}})(e.data.shadow?.softShadowQuality),t&&Wo()&&(kn||(this.initTexture?.(bl()),kn=!0));let a=-1;ge.pcssLights=0,ge.pcssPyramidActive=0,this._maskLights.length=0,this._maskBlocked=!1,ge.nodeResurrections=this._nodes?._spResurrections??0;let r=!1,s=W.toonLightData.array,i=0,n=this.manageShadowUpdates,l=e.scene.shadowsDirty||this.forceShadowUpdates;this._shadowMapMissingAtSync=!1;let o=-2128831035,u=m=>{o^=0|m,o=Math.imul(o,16777619)};e.traverseVisible(m=>{let h=m;if(Wh(h)&&(e.scene.shadowsDirty=!0),n&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.shadow&&(h.shadow.autoUpdate=l,l&&h.castShadow===!0&&h.shadow.map==null&&(this._shadowMapMissingAtSync=!0)),Hd&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&(h.castShadow=!1),(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&(u(m.id),u(h.castShadow===!0?1:0),u(this._shadowMapId(h.shadow?.map))),h.isPointLight&&h.castShadow&&h.shadow&&((function(f){f.filterNode!==void 0&&f.filterNode!==null?f.filterNode!==zl&&ge.pcssForeignFilter++:(f.filterNode=zl,ge.pcssInstalled++)})(h.shadow),jo(h.shadow),ge.pcssLights++),(h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&h.shadow){h.isDirectionalLight&&(a<0&&(a=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(h,ja,a)),(function(_){_.filterNode!==void 0&&_.filterNode!==null?_.filterNode!==Rl&&ge.pcssForeignFilter++:(Object.defineProperty(_,"penumbraSize",{get:()=>h.data?.penumbraSize??.5,configurable:!0}),_.filterNode=Rl,ge.pcssInstalled++)})(h.shadow);let f,p=!n||l||h.shadow.needsUpdate===!0;if(t&&Wo()&&(p?(function(_){let y=_;y.__spePcssPyramid&&(y.__spePcssPyramid.fresh=!1)})(h.shadow):Uo(h.shadow)||(function(_,y){let g=y,x=g.map?.depthTexture??null;if(x==null)return!1;let v=Do(y);if((function(M){let S=Do(M);if(S.slot>=0)return S.slot;for(let C=0;C<8;C++){let R=zn[C];if(R===null||R.deref()===void 0)return zn[C]=new WeakRef(M),S.slot=C,C}return-1})(y)<0)return!1;let V=Math.max(1,Math.round(g.mapSize?.x??2048)),T=8*v.slot,z=`${x.uuid}:${V}`;v.passKey!==z&&(v.toMid?.material?.dispose(),v.toSmall?.material?.dispose(),v.mid===null&&(v.mid=vl(64,64),v.mid.texture.name="SplinePCSSPyramidMid"),v.small===null&&(v.small=vl(8,8),v.small.texture.name="SplinePCSSPyramidSmall"),v.toMid=new kt(Io(`SplinePCSSPyramidToMid${V}`,x,Math.ceil(V/64),V-1,!1)),v.toSmall=new kt(Io("SplinePCSSPyramidToSmall",v.mid.texture,8,63,!0)),v.passKey=z),bl();let b=_.getRenderTarget();_.setRenderTarget(v.mid),v.toMid.render(_),_.setRenderTarget(v.small),v.toSmall.render(_),_.setRenderTarget(b),Oo.set(T,0,0),_.copyTextureToTexture(v.small.texture,as.texture,null,Oo),v.fresh=!0,ge.pcssPyramidBuilds++})(this,h.shadow),f={slot:Sp(h.shadow),fresh:Uo(h.shadow)}),t&&Ho()&&(Bd(h.shadow,-1),this._maskLights.push({light:h,shadow:h.shadow}),(p||h.shadow.map==null)&&(this._maskBlocked=!0)),jo(h.shadow,h.data?.penumbraSize??.5,f)&&ge.pcssPyramidActive++,!r){r=!0;let _=h.shadow;ge.pcssRadius0=_.radius??-1,ge.pcssPenumbra0=_.penumbraSize??-1}ge.pcssLights++}if(!(i>=Mm)){if(h.isPointLight||h.isSpotLight)xs.setFromMatrixPosition(h.matrixWorld),s[i].set(xs.x,xs.y,xs.z,0),i++;else if(h.isDirectionalLight&&h.target){h.target.updateMatrixWorld();let f=xs;f.setFromMatrixPosition(h.matrixWorld),f.sub(qp.setFromMatrixPosition(h.target.matrixWorld)).normalize(),s[i].set(f.x,f.y,f.z,1),i++}}}),W.toonLightCount.value=i;let d=this._lightShadowSignatures.get(e);this._lightShadowSignatures.set(e,o),this._lightShadowStateDirty=d!==void 0&&d!==o}_shadowMapId(e){if(e==null)return 0;let t=this._shadowMapIds.get(e);return t===void 0&&(t=++this._shadowMapIdSeq,this._shadowMapIds.set(e,t)),t}
5_renderShadowMaskPass(e,t){let a=0;if(Ho()&&!this.suppressShadowMask&&this.manageShadowUpdates&&!this._maskBlocked&&this._maskLights.length>=1&&this._maskLights.length<=4&&this._maskLights.every(r=>r.shadow.map?.depthTexture!=null)){this._shadowMask??(this._shadowMask=new Ep);let{targetsChanged:r}=this._shadowMask.render(this,e,t,this._maskLights);r&&this._grabTargetEpoch++,a=this._maskLights.length}W.shadowMaskEnabled.value=a>0?1:0,ge.shadowMaskActive=a}retireRenderTarget(e){e&&this._retiredGrabTargets.push(e),this._grabTargetEpoch++}_disposeRetiredGrabTargets(){if(this._retiredGrabTargets.length>0){for(let e of this._retiredGrabTargets)e.dispose();this._retiredGrabTargets.length=0}if(this._retiredGpuBuffers.length>0){for(let e of this._retiredGpuBuffers)try{e.destroy()}catch{}this._retiredGpuBuffers.length=0}}_retireBundleRecords(){for(let e of this._liveBundledPages())this._bundleStates.get(e)?.onResourceDispose();this._bundleEpochDirty=!0}_deferGpuBufferDestruction(){let e=this.backend,t=this._retiredGpuBuffers;e.destroyUniformBuffer=r=>{let s=e.get(r);s?.buffer&&t.push(s.buffer),e.delete(r),this._retireBundleRecords()};let a=e.attributeUtils;if(a){let r=a._getBufferAttribute.bind(a);a.destroyAttribute=s=>{let i=e.get(r(s));i?.buffer&&t.push(i.buffer),e.delete(s),this._retireBundleRecords()}}}_reallocGrabTarget(e,t,a,r){return e&&e.width===t&&e.height===a?e:(this.retireRenderTarget(e),r())}_withShadowUpdatesSuspended(e,t){let a=[];e.traverse(r=>{let s=r;if(s.isLight&&s.shadow){if(s.shadow.map==null)return;a.push({shadow:s.shadow,auto:s.shadow.autoUpdate,needs:s.shadow.needsUpdate}),s.shadow.autoUpdate=!1,s.shadow.needsUpdate=!1}});try{t()}finally{for(let r of a)r.shadow.autoUpdate=r.auto,r.shadow.needsUpdate=r.needs}}_renderPrepass(e,t){this._withShadowUpdatesSuspended(e,()=>{this.render(e,t)})}_renderAOPass(e,t,a){let r=this.getDrawingBufferSize(Gr),s=Math.max(1,Math.round(r.x)),i=Math.max(1,Math.round(r.y));this._aoRenderTarget=this._reallocGrabTarget(this._aoRenderTarget,s,i,()=>new Ee(s,i,{depthBuffer:!1})),W.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new xp);let n=e;this._hbao.render(this,e,t,{radius:a.radius,bias:a.bias??.5,aoFullRes:a.aoFullRes===!0,aoColor:n.aoColor??{r:0,g:0,b:0},fogEnabled:(n.fog??null)!==null,fogNear:n.backupFog?.near??1,fogFar:n.backupFog?.far??1e3,fogMode:lr.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??lr.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??lr.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??lr.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Gr),i=Math.max(1,Math.round(s.x)),n=Math.max(1,Math.round(s.y));this._normalTarget!==void 0&&this._normalTargetFlavor!==r&&(this.retireRenderTarget(this._normalTarget),this._normalTarget=void 0),this._normalTargetFlavor=r,this._normalTarget=this._reallocGrabTarget(this._normalTarget,i,n,()=>{let f=new Ee(i,n,{count:r==="both"?2:1,type:r==="normals"?At:Xt,depthTexture:new Cr(i,n)});r==="both"&&(f.textures[0].name="g0",f.textures[1].name="g1",f.textures[1].type=At);for(let p of f.textures)p.minFilter=Oe,p.magFilter=Oe;return f});let l=this._encodeMaterials[r];if(l===void 0){this._depthContrastUniform??(this._depthContrastUniform=L(1));let f=new ke;f.name=`SplineNormalPassEncode_${r}`;let p=Er("randomColor","vec3"),_=()=>{let g=ae(Ji),x=Kl.sub(.5).mul(this._depthContrastUniform).add(.5),v=X(X(p,g,.2),w(x),.4);return P(v,p.x)},y=()=>{let g=ae(na),x=Se(Cm,g,g.negate());return P(x,p.x)};f.fragmentNode=r==="both"?Hs({g0:_(),g1:y()}):r==="normals"?y():_(),f.lights=!1,f.blending=Ft,f.needsUpdate=!0,this._encodeMaterials[r]=f,l=f}this._depthContrastUniform.value=t instanceof Sn?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(Wp),m=this.getClearAlpha();t.layers.enable(8),t.layers.disable(0),t.layers.disable(3),e.overrideMaterial=l,this.setClearColor(0,0),this.setRenderTarget(this._normalTarget),this._renderPrepass(e,t),this.setRenderTarget(u),this.setClearColor(d,m),e.overrideMaterial=o,t.layers.enable(0),t.layers.enable(3);let h=this._normalTarget.textures;W.normalRenderTarget.value=r==="normals"?Ja:h[0],W.normalRenderTargetDepth.value=this._normalTarget.depthTexture,W.normalViewRenderTarget.value=r==="both"?h[1]:r==="normals"?h[0]:Ja}blitTextureToTarget(e,t){let a=this._uiBlitPass;if(!a){let i=re(Ja),n=new ke;n.name="SplineUICanvasBlit",n.fragmentNode=i.sample(Ie()),n.lights=!1,n.blending=Ft,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,a={quad:new kt(n),input:i},this._uiBlitPass=a}let r=this.getRenderTarget(),s=this.getMRT();a.input.value=e,this.setMRT(null),this.setRenderTarget(t),this.clear(),a.quad.render(this),this.setRenderTarget(r),this.setMRT(s)}
vendor: 5,750 bytes, line 5
5_getPrefilterPass(e){this._prefilterPasses||(this._prefilterPasses=[]);let t=this._prefilterPasses[e];if(t)return t;let a=re(Ja),r=L(new ve(1,0)),s=new ke;s.name="SplineTransmissionPrefilter";let i=Ie(),n=r,l=u=>a.sample(i.add(n.mul(u))).rgb,o=l(0).mul(.40262).add(l(1.182408).mul(.29869)).add(l(-1.182408).mul(.29869));return s.fragmentNode=P(o,1),s.lights=!1,s.blending=Ft,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new kt(s),input:a,step:r},this._prefilterPasses[e]=t,t}_getDownsamplePass(e){this._downsamplePasses||(this._downsamplePasses=[]);let t=this._downsamplePasses[e];return t||(t=this._buildDownsamplePassEntry($d,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=re(Ja),r=L(new ve(1,1)),s=new ke;s.name=t;let i=Ie(),n=r,l=(u,d)=>a.sample(i.add(A(u,d).mul(n))).rgb,o=null;if(e==="k4")for(let u=-1;u<=1;u++)for(let d=-1;d<=1;d++){let m=(d===0?2:1)*(u===0?2:1)/16,h=l(d,u).mul(m);o=o?o.add(h):h}else{let u=[-1.5,-.5,.5,1.5],d=[.1665,.3335,.3335,.1665];for(let m=0;m<4;m++)for(let h=0;h<4;h++){let f=d[h]*d[m],p=l(u[h],u[m]).mul(f);o=o?o.add(p):p}}return s.fragmentNode=P(o,1),s.lights=!1,s.blending=Ft,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new kt(s),input:a,step:r}}_getPlanarDownsamplePass(e){this._planarDownsamplePasses||(this._planarDownsamplePasses=[]);let t=this._planarDownsamplePasses[e];return t||(t=this._buildDownsamplePassEntry("g16","SplinePlanarDownsample"),this._planarDownsamplePasses[e]=t,t)}_batchedMipCopies(e){let t=this.backend,a=t?.device;if(!a||typeof t?.get!="function"){for(let i of e)this.copyTextureToTexture(i.src,i.dst,null,null,0,i.dstLevel);return}let r=a.createCommandEncoder({label:"SplineCascadeMipCopies"}),s=0;for(let i of e){let n=t.get(i.src)?.texture,l=t.get(i.dst)?.texture;n&&l?(r.copyTextureToTexture({texture:n,mipLevel:0,origin:{x:0,y:0,z:0}},{texture:l,mipLevel:i.dstLevel,origin:{x:0,y:0,z:0}},{width:i.width,height:i.height,depthOrArrayLayers:1}),s++):this.copyTextureToTexture(i.src,i.dst,null,null,0,i.dstLevel)}s>0&&a.queue.submit([r.finish()])}_getReflectionDownsamplePass(e){this._reflectionDownsamplePasses||(this._reflectionDownsamplePasses=[]);let t=this._reflectionDownsamplePasses[e];return t||(t=this._buildDownsamplePassEntry("g16","SplineReflectionDownsample"),this._reflectionDownsamplePasses[e]=t,t)}_renderTransmissionPass(e,t){let a=this.getDrawingBufferSize(Gr),r=this.hdTransmission?1:2,s=Math.max(1,Math.round(a.x/r)),i=Math.max(1,Math.round(a.y/r)),n=this.backend?.isWebGPUBackend===!0?kl:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let d=new Ee(s,i,{depthBuffer:!0}),m=d.texture;return n==="off"?(m.generateMipmaps=!0,m.minFilter=Oa):(m.generateMipmaps=!1,m.minFilter=Ve),m.magFilter=Ve,d});let l=[];e.traverse(d=>{let m=d;if(!(m.isMesh||m.isLine||m.isPoints||m.isSprite))return;let h=m.layers;h&&8&h.mask&&h.mask!==8&&(l.push({layers:h,mask:h.mask}),h.mask=8)});let o=this.getRenderTarget();t.layers.disable(3),this.setRenderTarget(this._transmissionTarget),this._renderPrepass(e,t),this.setRenderTarget(o),t.layers.enable(3);for(let d of l)d.layers.mask=d.mask;let u=this._transmissionTarget.texture;if(n!=="off"){let d=(_,y)=>{let g=new Ee(_,y,{depthBuffer:!1});return g.texture.generateMipmaps=!1,g.texture.minFilter=Ve,g.texture.magFilter=Ve,g};this._transmissionBlurTmp=this._reallocGrabTarget(this._transmissionBlurTmp,s,i,()=>d(s,i));let m=Math.floor(Math.log2(Math.max(s,i)))+1,h=this._transmissionBlurTarget;this._transmissionBlurTarget=this._reallocGrabTarget(this._transmissionBlurTarget,s,i,()=>{let _=new Ee(s,i,{depthBuffer:!1}),y=_.texture;return y.minFilter=Oa,y.magFilter=Ve,n==="base"?y.generateMipmaps=!0:(y.generateMipmaps=!1,y.mipmaps=Array.from({length:m},(g,x)=>({width:Math.max(1,s>>x),height:Math.max(1,i>>x)}))),_}),n==="full"&&this._transmissionBlurTarget!==h&&this.initTexture(this._transmissionBlurTarget.texture);let f=this._getPrefilterPass(0);f.input.value=this._transmissionTarget.texture,f.step.value.set(1/s,0),this.setRenderTarget(this._transmissionBlurTmp),f.quad.render(this);let p=this._getPrefilterPass(1);if(p.input.value=this._transmissionBlurTmp.texture,p.step.value.set(0,1/i),n==="base")this.setRenderTarget(this._transmissionBlurTarget),p.quad.render(this);else{for(let _=0;_<m;_++)this._transmissionChain[_]=this._reallocGrabTarget(this._transmissionChain[_],Math.max(1,s>>_),Math.max(1,i>>_),()=>d(Math.max(1,s>>_),Math.max(1,i>>_)));for(let _=m;_<this._transmissionChain.length;_++)this._transmissionChain[_]?.dispose(),this._transmissionChain[_]=void 0;this._transmissionChain.length=m,this.setRenderTarget(this._transmissionChain[0]),p.quad.render(this);for(let _=1;_<m;_++){let y=this._transmissionChain[_-1],g=this._getDownsamplePass(_-1);g.input.value=y.texture,g.step.value.set(1/y.width,1/y.height),this.setRenderTarget(this._transmissionChain[_]),g.quad.render(this)}for(let _=0;_<m;_++)this.copyTextureToTexture(this._transmissionChain[_].texture,this._transmissionBlurTarget.texture,null,null,0,_)}this.setRenderTarget(o),u=this._transmissionBlurTarget.texture}W.transmissionRenderTarget.value=u,W.transmissionActualSize.value.set(s,i),W.aspectRatio.value=a.x>=a.y?W.aspectRatio.value.set(a.y/a.x,1):W.aspectRatio.value.set(1,a.x/a.y)}_buildReflectionDepthPasses(e,t,a){if(this._reflectionDepthPasses)for(let s of this._reflectionDepthPasses)s?.quad.material?.dispose();let r=[];{let s=new ke;s.name="SplineReflectionDepthBlit";let i=re(this._reflectionTarget.depthTexture);s.fragmentNode=P(w(i.sample(Ie())),1),s.lights=!1,s.blending=Ft,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,r.push({quad:new kt(s)})}for(let s=1;s<a;s++){let i=Math.max(1,e>>s-1),n=Math.max(1,t>>s-1),l=new ke;
vendor: 4,137 bytes, line 5
5l.name=`SplineReflectionDepthMin${s}`;let o=re(this._reflectionDepthChain[s-1].texture),u=da,d=N(u.x).mul(2),m=N(u.y).mul(2),h=(g,x)=>o.load(aa(d.add(g),m.add(x))).x,f=(g,x)=>xe(g,x),p=f(f(h(0,0),h(1,0)),f(h(1,1),h(0,1))),_=!!(1&i),y=!!(1&n);_&&(p=f(p,f(h(2,0),h(2,1)))),y&&(p=f(p,f(h(0,2),h(1,2)))),_&&y&&(p=f(p,h(2,2))),l.fragmentNode=P(w(p),1),l.lights=!1,l.blending=Ft,l.depthTest=!1,l.depthWrite=!1,l.needsUpdate=!0,r.push({quad:new kt(l)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Gr),r=1/0,s=0,i=0;e.traverse(T=>{let z=T;if(!(z.isMesh&&16&z.layers.mask))return;let b=this._reflectiveMeshCoverage(z,t,a.y),M=Array.isArray(z.material)?z.material:[z.material];for(let S of M){if(!S?.layers)continue;let C=jc(S);!C||(r=Math.min(r,C.min*b.scale),s=Math.max(s,C.max*b.scale),C.max*b.scale>.45&&(i=Math.max(i,b.diameterPx)))}});let n=1;if(Yd&&r!==1/0)for(r>=6?n=4:r>=2&&(n=2);n>1&&i>0&&i/n<128;)n>>=1;let l=Math.max(1,Math.round(a.x/n)),o=Math.max(1,Math.round(a.y/n)),u=Math.floor(Math.log2(Math.max(l,o)))+1,d=this.backend?.isWebGPUBackend===!0&&Zd;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let T=new Ee(l,o,{depthTexture:new Cr(l,o)});return d?(T.texture.generateMipmaps=!1,T.texture.minFilter=Ve):(T.texture.generateMipmaps=!0,T.texture.minFilter=Oa),T.texture.magFilter=Ve,T});let m=(T,z)=>{let b=new Ee(T,z,{depthBuffer:!1,type:Xt,format:or});return b.texture.generateMipmaps=!1,b.texture.minFilter=Oe,b.texture.magFilter=Oe,b},h=this._reflectionDepthPyramid;this._reflectionDepthPyramid=this._reallocGrabTarget(this._reflectionDepthPyramid,l,o,()=>{let T=m(l,o);return T.texture.mipmaps=Array.from({length:u},(z,b)=>({width:Math.max(1,l>>b),height:Math.max(1,o>>b)})),T}),this._reflectionDepthPyramid!==h&&this.initTexture(this._reflectionDepthPyramid.texture);for(let T=0;T<u;T++)this._reflectionDepthChain[T]=this._reallocGrabTarget(this._reflectionDepthChain[T],Math.max(1,l>>T),Math.max(1,o>>T),()=>m(Math.max(1,l>>T),Math.max(1,o>>T)));for(let T=u;T<this._reflectionDepthChain.length;T++)this._reflectionDepthChain[T]?.dispose(),this._reflectionDepthChain[T]=void 0;this._reflectionDepthChain.length=u;let f=this.auxiliary||this._skySystem?.attached!==!0?null:this._skySystem.environmentTexture??null,p=W.reflectionEnvMap,_=f??fs;!this.auxiliary&&p.value!==_&&(p.value=_,this._grabTargetEpoch++),W.reflectionEnvEnabled.value=f!==null?1:0;let y=this.getClearColor(Hp);W.reflectionMissColor.value.set(y.r,y.g,y.b);let g=[];e.traverse(T=>{let z=T;if(!(z.isMesh||z.isLine||z.isPoints||z.isSprite))return;let b=z.layers;b&&16&b.mask&&b.mask!==16&&(g.push({layers:b,mask:b.mask}),b.mask=16)});let x=this.getRenderTarget();t.layers.disable(4),this.setRenderTarget(this._reflectionTarget),this._renderPrepass(e,t),t.layers.enable(4);for(let T of g)T.layers.mask=T.mask;this._reflectionPassesKey!==`${l}x${o}`&&(this._buildReflectionDepthPasses(l,o,u),this._reflectionPassesKey=`${l}x${o}`);let v=this._reflectionDepthPasses;for(let T=0;T<u;T++)this.setRenderTarget(this._reflectionDepthChain[T]),v[T].quad.render(this);this._batchedMipCopies(Array.from({length:u},(T,z)=>({src:this._reflectionDepthChain[z].texture,dst:this._reflectionDepthPyramid.texture,dstLevel:z,width:Math.max(1,l>>z),height:Math.max(1,o>>z)})));let V=this._reflectionTarget.texture;if(d){let T=this._reflectionColorPyramid;this._reflectionColorPyramid=this._reallocGrabTarget(this._reflectionColorPyramid,l,o,()=>{let M=new Ee(l,o,{depthBuffer:!1}),S=M.texture;return S.minFilter=Oa,S.magFilter=Ve,S.generateMipmaps=!1,S.mipmaps=Array.from({length:u},(C,R)=>({width:Math.max(1,l>>R),height:Math.max(1,o>>R)})),M}),this._reflectionColorPyramid!==T&&this.initTexture(this._reflectionColorPyramid.texture);let z=s>0?u:1,b=(M,S)=>{let C=new Ee(M,S,{depthBuffer:!1});return C.texture.generateMipmaps=!1,C.texture.minFilter=Ve,C.texture.magFilter=Ve,C};for(let M=1;M<z;M++)this._reflectionColorChain[M]=this._reallocGrabTarget(this._reflectionColorChain[M],Math.max(1,l>>M),Math.max(1,o>>M),()=>b(Math.max(1,l>>M),Math.max(1,o>>M)));for(let M=z;M<this._reflectionColorChain.length;
vendor: 6,320 bytes, line 5
5M++)this._reflectionColorChain[M]?.dispose(),this._reflectionColorChain[M]=void 0;this._reflectionColorChain.length=z;for(let M=1;M<z;M++){let S=M===1?this._reflectionTarget:this._reflectionColorChain[M-1],C=this._getReflectionDownsamplePass(M-1);C.input.value=S.texture,C.step.value.set(1/S.width,1/S.height),this.setRenderTarget(this._reflectionColorChain[M]),C.quad.render(this)}this._batchedMipCopies([{src:this._reflectionTarget.texture,dst:this._reflectionColorPyramid.texture,dstLevel:0,width:l,height:o},...Array.from({length:z-1},(M,S)=>({src:this._reflectionColorChain[S+1].texture,dst:this._reflectionColorPyramid.texture,dstLevel:S+1,width:Math.max(1,l>>S+1),height:Math.max(1,o>>S+1)}))]),V=this._reflectionColorPyramid.texture}this.setRenderTarget(x),W.reflectionRenderTarget.value=V,W.reflectionDepthPyramid.value=this._reflectionDepthPyramid.texture,W.reflectionDepthSize.value.set(l,o),W.reflectionDepthLevels.value=u,this._reflectionGrabInfo={div:n,w:l,h:o,minBlur:r,maxBlur:s}}_reflectiveMeshCoverage(e,t,a){let r=e.geometry;if(!r)return{diameterPx:a,scale:1};r.boundingSphere===null&&r.computeBoundingSphere();let s=r.boundingSphere;if(!s)return{diameterPx:a,scale:1};let i=e.matrixWorld.elements,n=Math.sqrt(Math.max(i[0]*i[0]+i[1]*i[1]+i[2]*i[2],i[4]*i[4]+i[5]*i[5]+i[6]*i[6],i[8]*i[8]+i[9]*i[9]+i[10]*i[10])),l=s.radius*n;ru.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;t.isPerspectiveCamera===!0&&(su.setFromMatrixPosition(t.matrixWorld),u=Math.max(ru.distanceTo(su),t.near??.1));let d=2*l*o/u;return{diameterPx:d,scale:Math.min(1,d/(.66*a))}}_renderReflectionResolvePass(e,t){let a=this._reflectionGrabInfo,r=this.backend?.isWebGPUBackend===!0&&Jd&&a!==void 0&&a.maxBlur>.45;if(r){let V=!0;e.traverse(T=>{let z=T;if(!(z.isMesh&&16&z.layers.mask))return;let b=Array.isArray(z.material)?z.material:[z.material],M=null;for(let S of b)if(S?.layers&&(M=$c(S),M!==null))break;M!=="variable"?M!==null?(z.userData.__srMode=M.blur>.45?1+M.tracingMode:0,z.userData.__srBlur=M.blur*this._reflectiveMeshCoverage(z,t,this.getDrawingBufferSize($p).y).scale,z.userData.__srThickness=M.thickness,z.userData.__srStepSize=M.stepSize,z.userData.__srSteps=M.steps):z.userData.__srMode=0:V=!1}),r=V}let s=r?a.w:4,i=r?a.h:4,n=(V,T)=>()=>{let z=new Ee(V,T,{type:At,depthBuffer:!1});return z.texture.generateMipmaps=!1,z.texture.minFilter=Ve,z.texture.magFilter=Ve,z};if(this._reflectionResolveTarget=this._reallocGrabTarget(this._reflectionResolveTarget,s,i,n(s,i)),W.reflectionResolveTarget.value=this._reflectionResolveTarget.texture,!r)return void(W.reflectionResolveEnabled.value=0);let{w:l,h:o}=a;if(this._reflectionGBufferTarget=this._reallocGrabTarget(this._reflectionGBufferTarget,l,o,()=>{let V=new Ee(l,o,{count:2,type:At,depthTexture:new Cr(l,o)});for(let T of V.textures)T.generateMipmaps=!1,T.minFilter=Oe,T.magFilter=Oe;return V.textures[0].name="g0",V.textures[1].name="g1",V}),this._reflectionResolveMarchTarget=this._reallocGrabTarget(this._reflectionResolveMarchTarget,l,o,n(l,o)),this._reflectionResolveBlurTmp=this._reallocGrabTarget(this._reflectionResolveBlurTmp,l,o,n(l,o)),!this._reflectionGBufferMaterial){let V=new ke;V.name="SplineReflectionGBuffer";let T=Sr("__splinePlanarMirror","float"),z=W.reflectionPlanarEnabled.greaterThan(.5),b=Sr("__srMode","float"),M=Se(T.greaterThan(.5).and(z),c(0),b);V.fragmentNode=Hs({g0:P(ae(na),M),g1:P(Sr("__srBlur","float"),Sr("__srThickness","float"),Sr("__srStepSize","float"),Sr("__srSteps","float"))}),V.lights=!1,V.blending=Ft,V.needsUpdate=!0,this._reflectionGBufferMaterial=V}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,m=this.getRenderTarget(),h=this.getClearColor(jp),f=this.getClearAlpha(),p=t.layers.mask;e.overrideMaterial=this._reflectionGBufferMaterial,t.layers.mask=16,this.setClearColor(0,0),this.setRenderTarget(this._reflectionGBufferTarget),this._renderPrepass(e,t),e.overrideMaterial=d,t.layers.mask=p,this.setClearColor(h,f);let _=W.reflectionRenderTarget.value,y=W.reflectionEnvMap.value,g=this._reflectionGBufferTarget,x=`${l}x${o}|${g.textures[0].uuid}|${_.uuid}|${this._reflectionDepthPyramid.texture.uuid}|${y.uuid}|${this._reflectionResolveMarchTarget.texture.uuid}|${this._reflectionResolveBlurTmp.texture.uuid}`;x!==this._reflectionResolveMarchKey&&(this._buildReflectionResolveMarch(_,y,l,o),this._reflectionResolveMarchKey=x);let v=this._reflectionResolveMarch;v.proj.value.copy(t.projectionMatrix),v.projInv.value.copy(t.projectionMatrix).invert(),v.camWorld.value.copy(t.matrixWorld),v.near.value=t.near??.1,this.setRenderTarget(this._reflectionResolveMarchTarget),v.quad.render(this),this.setRenderTarget(this._reflectionResolveBlurTmp),this._reflectionResolveBlur.h.render(this),this.setRenderTarget(this._reflectionResolveTarget),this._reflectionResolveBlur.v.render(this),this.setRenderTarget(m),W.reflectionResolveEnabled.value=1,(this._skippedAsyncDraws??0)>u&&(W.reflectionResolveEnabled.value=0)}_buildReflectionResolveMarch(e,t,a,r){this._reflectionResolveMarch&&this._reflectionResolveMarch.quad.material.dispose(),this._reflectionResolveBlur&&(this._reflectionResolveBlur.h.material.dispose(),this._reflectionResolveBlur.v.material.dispose());let s=L(new Ra),i=L(new Ra),n=L(new Ra),l=L(.1),o=this._reflectionGBufferTarget,u=re(o.textures[0]),d=re(o.textures[1]),m=re(o.depthTexture),h=re(e),f=re(this._reflectionDepthPyramid.texture),p=re(t),_=new ke;_.name="SplineReflectionResolve";let y=U(()=>{let V=da,T=aa(N(V.x),N(V.y)),z=Ie(),b=u.load(T).toVar(),M=m.sample(z).toVar(),S=P(0).toVar(),C=c(0).toVar();return B(b.w.greaterThan(.5),()=>{let R=d.load(T).toVar(),k=Xr(i,z.x,z.y,M),E=Pd({dials:{blur:R.x,thickness:R.y,stepSize:R.z,steps:N(R.w),tracingMode:b.w.sub(1)},surface:{originView:k,normalV:ae(b.xyz),screenUv:z,fragWindowZ:M},camera:{projectionMatrix:s,projectionMatrixInverse:i,worldMatrix:n,near:l},resources:{colorMap:h,depthPyramid:f,depthPyramidNode:f,envMap:p},usePlanar:vm(!1),noisePixel:A(T),singleRay:{footprintOut:C}});S.assign(P(E,C.add(1)))}),S});_.fragmentNode=y(),_.lights=!1,_.blending=Ft,_.depthTest=!1,_.depthWrite=!1,_.needsUpdate=!0,this._reflectionResolveMarch={quad:new kt(_),proj:s,projInv:i,camWorld:n,near:l};let g=re(this._reflectionResolveMarchTarget.texture),x=re(this._reflectionResolveBlurTmp.texture),v=V=>{let T=new ke;
vendor: 6,360 bytes, line 5
5T.name=`SplineReflectionResolveBlur${V.toUpperCase()}`;let z=V==="x"?g:x,b=V==="x"?1/a:1/r,M=U(()=>{let S=Ie(),C=g.sample(S).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),R=P(0).toVar(),k=0;for(let E=-6;E<=6;E++){let I=Math.exp(E/3*-.5*(E/3));k+=I;let D=V==="x"?A(C.mul(E/6*b),0):A(0,C.mul(E/6*b)),H=z.sample(S.add(D)).toVar(),K=V==="x"?H.w.min(1):H.w;R.addAssign(P(H.rgb,K).mul(I))}return R.div(k)});return T.fragmentNode=M(),T.lights=!1,T.blending=Ft,T.depthTest=!1,T.depthWrite=!1,T.needsUpdate=!0,new kt(T)};this._reflectionResolveBlur={h:v("x"),v:v("y")}}_renderPlanarReflectionPass(e,t){let a=null;if(e.traverse(p=>{let _=p;if(!(_.isMesh&&16&_.layers.mask&&(_.userData.__splinePlanarMirror=0,(Array.isArray(_.material)?_.material:[_.material]).some(R=>R?.layers&&Kc(R)))))return;let y=_.geometry;if(!y)return;y.boundingBox===null&&y.computeBoundingBox();let g,x,v=y.boundingBox,V=v.max.x-v.min.x,T=v.max.y-v.min.y,z=v.max.z-v.min.z,b=_.matrixWorld.elements,M=Math.hypot(b[0],b[1],b[2]),S=Math.hypot(b[4],b[5],b[6]),C=Math.hypot(b[8],b[9],b[10]);V<=T&&V<=z?(g=Kp,x=T*S*(z*C)):T<=V&&T<=z?(g=Xp,x=V*M*(z*C)):(g=Qp,x=V*M*(T*S)),(!a||x>a.area)&&(a={mesh:_,normalAxis:g,area:x})}),!a)return void(W.reflectionPlanarEnabled.value=0);let r=a.mesh,s=a.mesh.matrixWorld;if(er.copy(a.normalAxis).transformDirection(s),yr.setFromMatrixPosition(s),hi.setFromMatrixPosition(t.matrixWorld),xr.subVectors(yr,hi),xr.dot(er)>0&&er.negate(),xr.dot(er)>0)return void(W.reflectionPlanarEnabled.value=0);r.userData.__splinePlanarMirror=1,(!this._planarVirtualCamera||this._planarVirtualCamera.type!==t.type)&&(this._planarVirtualCamera=t.clone());let i=this._planarVirtualCamera;if(xr.subVectors(yr,hi),xr.reflect(er).negate(),xr.add(yr),On.extractRotation(t.matrixWorld),iu.set(0,0,-1).applyMatrix4(On).add(hi),mi.subVectors(yr,iu),mi.reflect(er).negate(),mi.add(yr),i.position.copy(xr),i.up.set(0,1,0).applyMatrix4(On),i.up.reflect(er),i.lookAt(mi),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),t.isPerspectiveCamera===!0){Or.setFromNormalAndCoplanarPoint(er,yr),Or.applyMatrix4(i.matrixWorldInverse),Wa.set(Or.normal.x,Or.normal.y,Or.normal.z,Or.constant);let p=i.projectionMatrix.elements;vs.x=(Math.sign(Wa.x)+p[8])/p[0],vs.y=(Math.sign(Wa.y)+p[9])/p[5],vs.z=-1,vs.w=(1+p[10])/p[14],Wa.multiplyScalar(1/Wa.dot(vs)),p[2]=Wa.x,p[6]=Wa.y,p[10]=Wa.z,p[14]=Wa.w}let n=this.getDrawingBufferSize(Zp),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=this.backend?.isWebGPUBackend===!0&&Qd;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let p=new Ee(l,o);return u?(p.texture.generateMipmaps=!1,p.texture.minFilter=Ve):(p.texture.generateMipmaps=!0,p.texture.minFilter=Oa),p.texture.magFilter=Ve,p});let d=[];e.traverse(p=>{let _=p;if(!(_.isMesh||_.isLine||_.isPoints||_.isSprite))return;let y=_.layers;y&&16&y.mask&&y.mask!==16&&(d.push({layers:y,mask:y.mask}),y.mask=16)}),i.layers.mask=-17&t.layers.mask;let m=this.getRenderTarget();this.setRenderTarget(this._planarTarget),this._renderPrepass(e,i),this.setRenderTarget(m);for(let p of d)p.layers.mask=p.mask;let h=this._planarTarget.texture;if(u){let p=Math.floor(Math.log2(Math.max(l,o)))+1,_=this._planarPyramid;this._planarPyramid=this._reallocGrabTarget(this._planarPyramid,l,o,()=>{let g=new Ee(l,o,{depthBuffer:!1}),x=g.texture;return x.minFilter=Oa,x.magFilter=Ve,x.generateMipmaps=!1,x.mipmaps=Array.from({length:p},(v,V)=>({width:Math.max(1,l>>V),height:Math.max(1,o>>V)})),g}),this._planarPyramid!==_&&this.initTexture(this._planarPyramid.texture);let y=(g,x)=>{let v=new Ee(g,x,{depthBuffer:!1});return v.texture.generateMipmaps=!1,v.texture.minFilter=Ve,v.texture.magFilter=Ve,v};for(let g=1;g<p;g++)this._planarChain[g]=this._reallocGrabTarget(this._planarChain[g],Math.max(1,l>>g),Math.max(1,o>>g),()=>y(Math.max(1,l>>g),Math.max(1,o>>g)));for(let g=p;g<this._planarChain.length;g++)this._planarChain[g]?.dispose(),this._planarChain[g]=void 0;this._planarChain.length=p;for(let g=1;g<p;g++){let x=g===1?this._planarTarget:this._planarChain[g-1],v=this._getPlanarDownsamplePass(g-1);v.input.value=x.texture,v.step.value.set(1/x.width,1/x.height),this.setRenderTarget(this._planarChain[g]),v.quad.render(this)}this.setRenderTarget(m),this._batchedMipCopies([{src:this._planarTarget.texture,dst:this._planarPyramid.texture,dstLevel:0,width:l,height:o},...Array.from({length:p-1},(g,x)=>({src:this._planarChain[x+1].texture,dst:this._planarPyramid.texture,dstLevel:x+1,width:Math.max(1,l>>x+1),height:Math.max(1,o>>x+1)}))]),h=this._planarPyramid.texture}let f=W.reflectionPlanarTarget;f.value!==h&&(f.value=h,this._grabTargetEpoch++),W.reflectionPlanarEnabled.value=1}renderFromSceneForSceneTransitionPass(e,t,a){let r=this.getDrawingBufferSize(Gr),s=Math.max(1,Math.round(r.x)),i=Math.max(1,Math.round(r.y));this._transitionCaptureTarget=this._reallocGrabTarget(this._transitionCaptureTarget,s,i,()=>new Ee(s,i,{depthBuffer:!0}));let n=this.getRenderTarget();this.setRenderTarget(this._transitionCaptureTarget);try{this.renderSplineScene(e,t)}finally{this.setRenderTarget(n)}this.pipeline.sceneTransitionFromTexture=this._transitionCaptureTarget.texture,this.sceneTransitionDuration=a,this.sceneTransitionTimeRemaining=a;let l=this.pipeline.sceneTransitionPass.uniforms;l.uDPR.value=this.getPixelRatio(),l.uResolution.value.set(r.x,r.y).divideScalar(this.getPixelRatio())}async captureFrame(e,{includeHelpers:t=!1,settleFrames:a=0}={}){if(this.xr?.isPresenting===!0)return null;let r=this._frameSerial,s=this.getRenderTarget(),i=this.pipeline.renderToScreen,n=this.pipeline.helpersEnabled,l=this.suppressShadowMask;this.suppressShadowMask=!0,t||this.pipeline.disableHelpers(),this.pipeline.renderToScreen=!1,this.setRenderTarget(null);try{for(let y=0;y<a;y++)e(),await Yp();e()}finally{this.suppressShadowMask=l,this.pipeline.renderToScreen=i,this.setRenderTarget(s),n&&this.pipeline.enableHelpers()}if(this._frameSerial===r||this.lastFrameIncomplete)return null;let o=this.pipeline.lastOutputTarget;if(!o||!this.backend.get(o.textures[0])?.textureDescriptorGPU)return null;let u=o.width,d=o.height,m=this,h=new Uint8Array(u*d*4),f=4*u,p=256*Math.ceil(f/256),_=Math.max(1,Math.min(d,Math.floor((1<<20)/p)));for(let y=0;y<d;y+=_){let g=Math.min(_,d-y),x=await m.readRenderTargetPixelsAsync(o,0,y,u,g);
5if(p===f)h.set(x.subarray(0,g*f),y*f);else for(let v=0;v<g;v++){let V=v*p;h.set(x.subarray(V,V+f),(y+v)*f)}}return{pixels:h,width:u,height:d}}_applyCIOffscreenTargetIfRequested(){if(globalThis.__SPLINE_RENDER_OFFSCREEN__!==!0)return;let e=Math.max(1,Math.round(this.viewportWidth*this.getPixelRatio())),t=Math.max(1,Math.round(this.viewportHeight*this.getPixelRatio()));this._ciOffscreenTarget?(this._ciOffscreenTarget.width!==e||this._ciOffscreenTarget.height!==t)&&(this._ciOffscreenTarget.dispose(),this._ciOffscreenTarget=new Ee(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new Ee(e,t,{depthBuffer:!0}),globalThis.__splineReadOffscreenPixels=async()=>{let a=this._ciOffscreenTarget,r=await this.readRenderTargetPixelsAsync(a,0,0,a.width,a.height);return{width:a.width,height:a.height,pixels:Array.from(r)}}),this.getRenderTarget()===null&&this.setRenderTarget(this._ciOffscreenTarget)}dispose(){this._disposeRetiredGrabTargets(),this._disposeWarmupTargets(),co()?.drainRetired(),so()?.drainRetired(),this._skySystem?.dispose(),this._skySystem=null,this._hbao?.dispose(),this._hbao=void 0,this._shadowMask?.dispose(),this._shadowMask=void 0,(function(){for(let e of Us){let t=e.deref();t!==void 0&&(t.mid?.dispose(),t.mid=null,t.small?.dispose(),t.small=null,t.toMid?.material?.dispose(),t.toSmall?.material?.dispose(),t.toMid=null,t.toSmall=null,t.passKey="",t.fresh=!1,t.slot=-1)}Us.clear(),zn.fill(null),as?.dispose(),as=null,kn=!1})(),this._aoRenderTarget?.dispose(),this._aoRenderTarget=void 0,this._normalTarget?.dispose(),this._normalTarget=void 0,this._ciOffscreenTarget?.dispose(),this._ciOffscreenTarget=void 0,this._transitionCaptureTarget?.dispose(),this._transitionCaptureTarget=void 0,this._transmissionTarget?.dispose(),this._transmissionTarget=void 0,this._transmissionBlurTmp?.dispose(),this._transmissionBlurTmp=void 0,this._transmissionBlurTarget?.dispose(),this._transmissionBlurTarget=void 0;for(let e of this._transmissionChain)e?.dispose();this._transmissionChain.length=0,this._reflectionTarget?.depthTexture?.dispose(),this._reflectionTarget?.dispose(),this._reflectionTarget=void 0,this._reflectionColorPyramid?.dispose(),this._reflectionColorPyramid=void 0;for(let e of this._reflectionColorChain)e?.dispose();if(this._reflectionColorChain.length=0,this._reflectionDownsamplePasses){for(let e of this._reflectionDownsamplePasses)e?.quad.material?.dispose();this._reflectionDownsamplePasses=void 0}this._planarTarget?.dispose(),this._planarTarget=void 0,this._planarPyramid?.dispose(),this._planarPyramid=void 0;for(let e of this._planarChain)e?.dispose();if(this._planarChain.length=0,this._planarDownsamplePasses){for(let e of this._planarDownsamplePasses)e?.quad.material?.dispose();this._planarDownsamplePasses=void 0}this._reflectionDepthPyramid?.dispose(),this._reflectionDepthPyramid=void 0;for(let e of this._reflectionDepthChain)e?.dispose();if(this._reflectionDepthChain.length=0,this._reflectionDepthPasses){for(let e of this._reflectionDepthPasses)e?.quad.material?.dispose();this._reflectionDepthPasses=void 0}if(this._reflectionPassesKey="",this._reflectionGBufferTarget?.depthTexture?.dispose(),this._reflectionGBufferTarget?.dispose(),this._reflectionGBufferTarget=void 0,this._reflectionResolveMarchTarget?.dispose(),this._reflectionResolveMarchTarget=void 0,this._reflectionResolveBlurTmp?.dispose(),this._reflectionResolveBlurTmp=void 0,this._reflectionResolveTarget?.dispose(),this._reflectionResolveTarget=void 0,this._reflectionGBufferMaterial?.dispose(),this._reflectionGBufferMaterial=void 0,this._reflectionResolveMarch&&(this._reflectionResolveMarch.quad.material.dispose(),this._reflectionResolveMarch=void 0),this._reflectionResolveBlur&&(this._reflectionResolveBlur.h.material.dispose(),this._reflectionResolveBlur.v.material.dispose(),this._reflectionResolveBlur=void 0),this._reflectionResolveMarchKey="",this._reflectionGrabInfo=void 0,this._prefilterPasses){for(let e of this._prefilterPasses)e?.quad.material?.dispose();this._prefilterPasses=void 0}if(this._downsamplePasses){for(let e of this._downsamplePasses)e?.quad.material?.dispose();this._downsamplePasses=void 0}this._uiBlitPass&&(this._uiBlitPass.quad.material.dispose(),this._uiBlitPass=void 0),this._helperOverlay?.dispose(),this._helperOverlay=void 0,(function(){for(let e of Fn)e.deref()?.dis
5pose();Fn.clear(),Ln++})(),(function(){for(let e of ui){let t=e.deref();t!==void 0&&(t.sprite.removeFromParent(),t.material.dispose())}ui.clear(),ys++})(),this._taaHistory?.dispose(),this._taaHistory=void 0;for(let e of Object.values(this._encodeMaterials))e?.dispose();this._encodeMaterials={},this._bundledPages.clear(),this.pipeline.dispose(),this.dummyCamera.dispose(),super.dispose(),this._disposeRetiredGrabTargets(),W.transmissionRenderTarget.value=Ja,W.normalRenderTarget.value=Ja,W.aoRenderTarget.value=Ja,W.reflectionRenderTarget.value=fs,W.reflectionDepthPyramid.value=fs,W.reflectionEnvMap.value=fs,W.reflectionPlanarTarget.value=fs,W.reflectionPlanarEnabled.value=0,W.reflectionResolveTarget.value=bm,W.reflectionResolveEnabled.value=0}},ah=El;ah._GAUGE_STALL_MS=3e3;var Nl=(e,t)=>e.element(t);function ls(e){let t=e;return t!=null&&t.isInstancedMesh===!0&&t.instanceMatrix!=null&&t.instanceMatrix.isInstancedBufferAttribute===!0}var nu=new WeakMap;function $i(e){return Xl.mul((function(t){let a=t.spInstanceMatrixNode;if(a!==void 0)return a;let r=t.object,s=r.instanceMatrix,i=Math.max(r.count??1,1);if(s.isStorageInstancedBufferAttribute===!0)return Nl(Hm(s,"mat4",i),Kt);if(16*i*4<=t.getUniformBufferLimit())return Nl(jm(s.array,"mat4",i),Kt);let n=nu.get(s);n===void 0&&(n=new tp(s.array,16,1),nu.set(s,n));let l=s.usage===Li?$m:wr;return gd(l(n,"vec4",16,0),l(n,"vec4",16,4),l(n,"vec4",16,8),l(n,"vec4",16,12))})(e))}var ga=U(e=>ls(e.object)?jl:Ws).once()().toVar("speObjectPosition"),to=U(e=>e.material?.shapeBlendObjectNormal||(ls(e.object)?e.geometry.hasAttribute("normal")?Tm:w(0,1,0):sd)).once()().toVar("speObjectNormal"),Jp=(U(e=>ls(e.object)?$i(e):Xl).once()(),U(e=>{if(!ls(e.object))return Zm;let t=$i(e),a=r=>Nl(t,r).xyz;return w(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Ki=(U(e=>ls(e.object)?Pr($i(e)).inverse().transpose():Fm).once()(),U(e=>ls(e.object)?$i(e).inverse():Lm).once()(),new WeakMap);function rh(e){if(Ki.has(e))return;let t={own:e.value,render:e.value};Ki.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:a=>{t.render=a,t.own=a}})}function lu(e){let t=Ki.get(e);return t!==void 0?t.own:e.value}function sh(e,t){let a=Ki.get(e);a!==void 0?a.render=t:e.value=t}var ef=class{constructor(e){this.layerId=e,this.uniforms={},this.byName=new Map,this.liveValues=new Map}set(e,t,a){return this.byName.set(e,t),this.uniforms[`f${this.layerId}_${e}`]=t,a!==void 0&&this.liveValues.set(e,a),this}has(e){return this.byName.has(e)}names(){return[...this.byName.keys()]}get(e){let t=this.byName.get(e);if(t===void 0)throw new Error(`TSLLayerParams: unknown param "${e}" (layer f${this.layerId})`);return t}getFloat(e){return this.get(e)}getInt(e){return this.get(e)}getBool(e){return this.get(e)}getVec2(e){return this.get(e)}getVec3(e){return this.get(e)}getVec4(e){return this.get(e)}getColor(e){return this.get(e)}getValue(e){if(this.liveValues.has(e))return this.liveValues.get(e);let t=this.byName.get(e);return t===void 0?void 0:lu(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return t===void 0?void 0:lu(t)}setValue(e,t){let a=this.byName.get(e);a===void 0||t===void 0||(this.liveValues.has(e)&&this.liveValues.set(e,t),a.value=t)}};function Qa(e,t,a){let r=c(e).toVar(),s=c(X(r.div(ie(r.add(t.accumAlpha),c(1e-5),c(1))),r,a)).toVar();return t.accumAlpha.addAssign(dt(t.accumAlpha).mul(r).mul(dt(a))),s}function ei(e,t){let a=c(e).toVar(),r=c(a.div(ie(a.add(t.accumAlpha),c(1e-5),c(1)))).toVar();return t.accumAlpha.addAssign(dt(t.accumAlpha).mul(a)),r}var v_=0,b_=1,T_=2,w_=3,tf=U(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=w(1).toVar();return B(s.equal(N(0)),()=>{i.assign(X(t,a,r))}).ElseIf(s.equal(N(1)),()=>{i.assign(X(t,t.mul(a),r))}).ElseIf(s.equal(N(2)),()=>{i.assign(X(t,dt(dt(t).mul(dt(a))),r))}).ElseIf(s.equal(N(3)),()=>{let n=Ne(t,w(.5)),l=X(dt(dt(t).mul(dt(a)).mul(2)),t.mul(a).mul(2),n);i.assign(X(t,l,r).clamp(0,1))}),i});function qn(e,t,a,r){return tf({a:e,b:t,alpha:a,mode:r})}var ao=new Map,ou=new Set,af=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:w(1,0,0),calpha:ei(r,a)}};function Qt(e,t){ao.set(e,t)}function rf(e){let t=ao.get(e);return t!==void 0?t:(ou.has(e)||(ou.add(e),console.warn(`[spe] Material layer type "${e}" is not available in this runtime build (no WebGPU port, or compiled out) â rendering flat red.`)),af)}function S_(e){return ao.has(e)}var{diffuseContribution:ih,specularColorBlended:uu}=Hl,sf=U(e=>
5{let t=na.dot(e.lightDirection),a=A(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return X(w(.7),w(1),Ze(c(.7).sub(r.x),c(.7).add(r.x),a.x))}),nf=U(e=>{let t=e.lightDirection.add(Ks).normalize(),a=na.dot(t).clamp(),r=Ks.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=Es.mul(s.oneMinus()).add(s),n=c(.25),l=ll.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(ll));return i.mul(n).mul(l)});function nh(e){let t=W.aoRenderTarget.sample(Fa).rgb,a=W.aoEnabledUniform;return e!==null&&(a=a.mul(Se(e,c(1),c(0)))),X(w(1),t,a)}var du,lf=(du=class extends nl{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=sf({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Ta.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(nf({lightDirection:t})))}},class extends du{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=nh(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(dt(s)))}}),of=class extends Vm{constructor(){super(...arguments),this.envIrradianceActive=!1}direct(e,t){let a=e;if(a.lightNode?.light?.userData?.splineDiffuseOnly===!0){if(this.envIrradianceActive)return;let r=na.dot(a.lightDirection).clamp().mul(a.lightColor),s=Hl.BRDF_Lambert({diffuseColor:ih});return void a.reflectedLight.directDiffuse.addAssign(r.mul(s))}super.direct(e,t)}},uf=e=>e,hu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function Wr(e,t){return t==="x"?e.x:t==="y"?e.y:e.z}function Ts(e,t){return Um(e,w(t,1)).div(2).add(.5).xy}function df(e,t,a){let r=c(e.div(ie(e.add(t.accumAlpha),c(1e-5),c(1)))).toVar();return t.accumAlpha.addAssign(dt(t.accumAlpha).mul(e).mul(dt(a))),r}function Os(e){let t=e.getValue("projection")??0,a=e.getValue("axis")??0,r=a>=0&&a<=2?a:0,s=e.getValue("projectionAxis")??-1,i=s>=0&&s<=2?s:1,n=e.get("mat"),l=e.getVec2("size");if(t===1){let o=ga,u=r===0?o.zy:r===1?o.xz:o.xy,d=A(u.add(1).div(2)).toVar();return{uvs:[A(Ts(n,d.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(t===2){let o=w(ae(ga)).toVar(),{a:u,b:d,pole:m}=hu[i],h=c(hr(Wr(o,u),Wr(o,d)).div(6.283).add(.5)).toVar(),f=c(md(Wr(o,m)).div(3.1415).add(.5)).toVar(),p=A(h,f).toVar();return{uvs:[A(Ts(n,p.mul(2).sub(1))).toVar()],weights:null}}if(t===3){let o=w(ae(ga)).toVar(),{a:u,b:d,pole:m}=hu[i],h=c(hr(Wr(o,u),Wr(o,d)).div(6.283).add(.5)).toVar(),f=c(Wr(ga,m).div(l.y.mul(.5))).toVar(),p=c(f.div(2).add(.5)).toVar(),_=A(h,p).toVar();return{uvs:[A(Ts(n,_.mul(2).sub(1))).toVar()],weights:null}}if(t===4){let o=e.getFloat("blending"),u=w(ga).toVar(),d=A(u.xy.add(1).div(2)).toVar(),m=A(u.zy.add(1).div(2)).toVar(),h=A(u.xz.add(1).div(2)).toVar();for(let y of[d,m,h])y.assign(Ts(n,uf(y.mul(2).sub(1).div(l.mul(.5)))));let f=c(dt(o).mul(125).add(3)).toVar(),p=w(to).toVar(),_=w(de(ae(p))).toVar();return _.assign(Ma(_,w(f))),_.divAssign(q(_,w(1))),{uvs:[d,m,h],weights:_}}return{uvs:[A(Ts(n,Ie().mul(2).sub(1))).toVar()],weights:null}}var mu=(e,t,a)=>{let r,s=e.getValue("projection")??0,i=e.getValue("axis")??0,n=i>=0&&i<=2?i:0,l=e.getValue("side")??0,o=e.get("texture"),u=e.getFloat("crop"),{uvs:d,weights:m}=Os(e),h=[...d],f=null;if(s===1){if(r=o.sample(d[0]),l!==2){let x=n===0?w(1,0,0):n===1?w(0,1,0):w(0,0,1),v=q(to,x);f=Ne(c(0),l===1?v.mul(-1):v)}}else if(s===2||s===3)r=(function(x,v){if(x.value.minFilter===Oe&&x.value.magFilter===Oe)return x.sample(v);let V=A(js(v)).toVar(),T=A($s(v)).toVar();return V.x.subAssign(J(V.x.add(.5))),T.x.subAssign(J(T.x.add(.5))),x.sample(v).grad(V,T)})(o,d[0]);else if(s===4){let x=m,v=o.sample(d[0]),V=o.sample(d[1]),T=o.sample(d[2]);r=v.mul(x.z).add(V.mul(x.x)).add(T.mul(x.y))}else r=o.sample(d[0]);let p=e.has("loaded")?e.getFloat("loaded"):c(1),_=P(X(P(0,0,0,1),r,p)).toVar(),y=w(_.rgb).toVar(),g=c(t.alpha.mul(_.a)).toVar();return f!==null&&g.mulAssign(f),(function(x,v,V){B(x.greaterThan(.5),()=>{for(let T of V)B(T.x.lessThan(0).or(T.x.greaterThan(1)).or(T.y.lessThan(0)).or(T.y.greaterThan(1)),()=>{v.assign(0)})})})(u,g,h),g.mulAssign(t.mask),{color:y,calpha:df(g,a,t.isMask)}};function pi(e,t,a){let r=A(t).toVar(),s=A(js(r)).toVar(),i=A($s(r)).toVar(),n=d=>a.mul(Wl(e.sample(d).rgb)),l=c(n(r)).toVar(),o=c(n(r.add(s)).sub(l)).toVar(),u=c(n(r.add(i)).sub(l)).toVar();return A(o,u)}function fi(e,t,a){let r=w(js(e)).toVar(),s=w($s(e)).toVar(),i=w(ae(t)).toVar(),n=w(ae(_t(s,i))).toVar(),l=w(ae(_t(i,r))).toVar(),o=c(q(r,n).mul($l)).toVar(),u=w(Xa(o).mul(a.x.mul(n).add(a.y.mul(l)))
vendor: 9,877 bytes, line 5
5).toVar();return ae(de(o).mul(i).sub(u))}function Wn(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):c(1),i=o=>{let u=r.sample(o),d=t==="luminance"?Wl(u.rgb):u[t];return c(d).toVar()},{uvs:n,weights:l}=Os(e);if(l!==null){let o=i(n[0]),u=i(n[1]),d=i(n[2]);a=o.mul(l.z).add(u.mul(l.x)).add(d.mul(l.y))}else a=i(n[0]);return X(c(1),a,s)}Qt("texture",mu),Qt("video",mu);var hf=od,cu=We,gi=.1666667,mf=U(e=>{let t=e.c,a=Zt(q(t,w(17,59.4,15))).mul(4096),r=Ae(a.mul(512)),s=a.mul(.125),i=Ae(s.mul(512)),n=s.mul(.125),l=Ae(n.mul(512));return w(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function _i(e){return mf({c:e})}var cf=U(e=>{let t=e.p,a=J(t.add(q(t,w(.3333333)))).toVar(),r=t.sub(a).add(q(a,w(gi))).toVar(),s=Ne(w(0),r.sub(r.yzx)).toVar(),i=s.mul(dt(s.zxy)).toVar(),n=dt(s.zxy.mul(dt(s))).toVar(),l=r.sub(i).add(gi).toVar(),o=r.sub(n).add(2*gi).toVar(),u=r.sub(1).add(3*gi).toVar(),d=P(q(r,r),q(l,l),q(o,o),q(u,u)).toVar();d.assign(P(.6).sub(d).max(0));let m=P(q(_i(a),r),q(_i(a.add(i)),l),q(_i(a.add(n)),o),q(_i(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),m.mulAssign(d),q(m,P(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function dr(e){return cf({p:e})}var pf=U(e=>{let t=e.m,a=Pr(w(-.37,.36,.85),w(-.14,-.93,.34),w(.92,.01,.4)),r=Pr(w(-.55,-.39,.74),w(.33,-.91,-.24),w(.77,.12,.63)),s=Pr(w(-.71,.52,-.47),w(-.08,-.72,-.68),w(-.7,-.45,.56));return dr(t.mul(a)).mul(.5333333).add(dr(t.mul(2).mul(r)).mul(.2666667)).add(dr(t.mul(4).mul(s)).mul(.1333333)).add(dr(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),ff=U(e=>{let t=e.x;return qa(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function zr(e){return ff({x:e})}var gf=U(e=>qi(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Bl(e){return gf({r:e})}var _f=U(e=>{let t=e.v,a=A(1/6,1/3),r=P(0,.5,1,2),s=J(t.add(q(t,a.yyy))).toVar(),i=t.sub(s).add(q(s,a.xxx)).toVar(),n=Ne(i.yzx,i.xyz).toVar(),l=dt(n).toVar(),o=xe(n.xyz,l.zxy).toVar(),u=Q(n.xyz,l.zxy).toVar(),d=i.sub(o).add(a.xxx.mul(1)).toVar(),m=i.sub(u).add(a.xxx.mul(2)).toVar(),h=i.sub(1).add(a.xxx.mul(3)).toVar();s.assign(qa(s,289));let f=zr(zr(zr(s.z.add(P(0,o.z,u.z,1))).add(s.y).add(P(0,o.y,u.y,1))).add(s.x).add(P(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),_=f.sub(J(f.mul(p.z).mul(p.z)).mul(49)).toVar(),y=J(_.mul(p.z)).toVar(),g=J(_.sub(y.mul(7))).toVar(),x=y.mul(p.x).add(p.yyyy).toVar(),v=g.mul(p.x).add(p.yyyy).toVar(),V=qi(1,de(x)).sub(de(v)).toVar(),T=P(x.xy,v.xy).toVar(),z=P(x.zw,v.zw).toVar(),b=J(T).mul(2).add(1).toVar(),M=J(z).mul(2).add(1).toVar(),S=Ne(V,P(0)).negate().toVar(),C=T.xzyw.add(b.xzyw.mul(S.xxyy)).toVar(),R=z.xzyw.add(M.xzyw.mul(S.zzww)).toVar(),k=w(C.xy,V.x).toVar(),E=w(C.zw,V.y).toVar(),I=w(R.xy,V.z).toVar(),D=w(R.zw,V.w).toVar(),H=Bl(P(q(k,k),q(E,E),q(I,I),q(D,D))).toVar();k.mulAssign(H.x),E.mulAssign(H.y),I.mulAssign(H.z),D.mulAssign(H.w);let K=Q(qi(.6,P(q(i,i),q(d,d),q(m,m),q(h,h))),0).toVar();return K.mulAssign(K),q(K.mul(K),P(q(k,i),q(E,d),q(I,m),q(D,h))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function rs(e){return _f({v:e})}var yf=U(e=>{let t=e.x;return t.sub(J(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),xf=U(e=>{let t=e.x;return yf({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function yi(e){return xf({x:e})}var vf=U(e=>{let t=e.p,a=J(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(qi(3,r.mul(2))));let s=a.xxyy.add(P(0,1,0,1)).toVar(),i=yi(s.xyxy).toVar(),n=yi(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=yi(n).toVar(),o=yi(n.add(1)).toVar(),u=Ae(l.mul(1/41)).toVar(),d=Ae(o.mul(1/41)).toVar().mul(r.z).add(u.mul(dt(r.z))).toVar(),m=d.yw.mul(r.x).add(d.xz.mul(dt(r.x))).toVar();return m.y.mul(r.y).add(m.x.mul(dt(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),bf=U(e=>{let t=w(e.x).toVar(),a=c(0).toVar(),r=c(.5).toVar(),s=w(100).toVar();return We(5,()=>{a.addAssign(r.mul((function(i){return vf({p:i})})(t))),t.assign(t.mul(2).add(s)),r.mulAssign(.5)}),a}).setLayout({name:"spe_fbm",type:"float",inputs:[{name:"x",type:"vec3"}]}),Tf=U(e=>{let t=e.t;return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"spe_fade",type:"vec3",inputs:[{name:"t",type:"vec3"}]}),wf=U(e=>{let t=e.P,a=J(t).toVar(),r=a.add(w(1)).toVar();a.assign(qa(a,289)),r.assign(qa(r,289));let s=Ae(t).toVar(),i=s.sub(w(1)).toVar(),n=P(a.x,r.x,a.x,r.x).toVar(),l=P(a.yy,r.yy).toVar(),o=P(a.zzzz).toVar(),u=P(r.zzzz).toVar(),d=zr(zr(n).add(l)).toVar(),m=zr(d.add(o)).toVar(),h=zr(d.add(u)).toVar(),f=m.div(7).toVar(),p=Ae(J(f).div(7)).sub(.5).toVar();f.assign(Ae(f));let _=P(.5).sub(de(f)).sub(de(p)).toVar(),y=Ne(_,P(0)).toVar();f.subAssign(y.mul(Ne(0,f).sub(.5))),p.subAssign(y.mul(Ne(0,p).sub(.5)));let g=h.div(7).toVar(),x=Ae(J(g).div(7)).sub(.5).toVar();g.assign(Ae(g));let v=P(.5).sub(de(g)).sub(de(x)).toVar(),V=Ne(v,P(0)).toVar();g.subAssign(V.mul(Ne(0,g).sub(.5))),x.subAssign(V.mul(Ne(0,x).sub(.5)));let T=w(f.x,p.x,_.x).toVar(),z=w(f.y,p.y,_.y).toVar(),b=w(f.z,p.z,_.z).toVar(),M=w(f.w,p.w,_.w).toVar(),S=w(g.x,x.x,v.x).toVar(),C=w(g.y,x.y,v.y).toVar(),R=w(g.z,x.z,v.z).toVar(),k=w(g.w,x.w,v.w).toVar(),E=Bl(P(q(T,T),q(b,b),q(z,z),q(M,M))).toVar();T.mulAssign(E.x),b.mulAssign(E.y),z.mulAssign(E.z),M.mulAssign(E.w);let I=Bl(P(q(S,S),q(R,R),q(C,C),q(k,k))).toVar();S.mulAssign(I.x),R.mulAssign(I.y),C.mulAssign(I.z),k.mulAssign(I.w);let D=q(T,s).toVar(),H=q(z,w(i.x,s.yz)).toVar(),K=q(b,w(s.x,i.y,s.z)).toVar(),O=q(M,w(i.xy,s.z)).toVar(),j=q(S,w(s.xy,i.z)).toVar(),Z=q(C,w(i.x,s.y,i.z)).toVar(),$=q(R,w(s.x,i.yz)).toVar(),me=q(k,i).toVar(),ue=(function(fe){return Tf({t:fe})})(s).toVar(),ce=X(P(D,H,K,O),P(j,Z,$,me),ue.z).toVar(),Me=X(ce.xy,ce.zw,ue.y).toVar();return X(Me.x,Me.y,ue.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Di(e){return wf({P:e})}var Sf=U(e=>{let t=Ae(e.p3.mul(.1031)).toVar();return t.addAssign(q(t,t.yzx.add(33.33))),Ae(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Vf=U(e=>{let t=Ae(e.p3.mul(w(.1031,.103,.0973))).toVar();return t.addAssign(q(t,t.yxz.add(33.33))),Ae(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Hn(e){return Vf({p3:e})}var Mf=U(e=>{let{a:t,b:a,k:r}=e,s=Ze(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(dt(s)).toVar();return X(a,t,s).sub(i)}).setLayout({name:"spe_smin",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Gs(e,t,a){return Mf({a:e,b:t,k:a})}var Cf=U(e=>{let{a:t,b:a,k:r}=e,s=Ze(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(dt(s)).toVar();return X(t,a,s).add(i)}).setLayout({name:"spe_smax",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function lh(e,t,a){return Cf({a:e,b:t,k:a})}var Rf=U(e=>{let{value:t,input_min:a,input_max:r,output_min:s,output_max:i}=e,n=r.sub(a).toVar(),l=i.sub(s).toVar(),o=t.sub(a).div(n).toVar();return s.add(o.mul(l))}).setLayout({name:"spe_remap",type:"float",inputs:[{name:"value",type:"float"},{name:"input_min",type:"float"},{name:"input_max",type:"float"},{name:"output_min",type:"float"},{name:"output_max",type:"float"}]});function oh(e,t,a,r,s){return Rf({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var zf=U(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=ra(J(t)).toVar(),l=Ae(t).toVar(),o=c(8).toVar(),u=c(8).toVar(),d=c(8).toVar(),m=c(8).toVar(),h=c(8).toVar(),f=c(8).toVar(),p=ra(0).toVar(),_=w(0).toVar(),y=N(i).toVar(),g=()=>({start:y.negate(),end:y,condition:"<=",type:"int"});cu(g(),g(),g(),({i:v,j:V,k:T})=>{let z=ra(v,V,T).toVar(),b=w(z).add(Hn(w(n.add(z)).add(s))).sub(l).toVar(),M=we(b).toVar();o.assign(Gs(M,o,r)),B(M.lessThan(u),()=>{m.assign(u),u.assign(M),p.assign(ra(v,V,T)),_.assign(b)}).ElseIf(M.lessThan(m),()=>{m.assign(M)})}),B(a.notEqual(N(0)).and(a.notEqual(N(5))).and(a.notEqual(N(7))),()=>{cu(g(),g(),g(),({i:v,j:V,k:T})=>{let z=p.add(ra(v,V,T)).toVar(),b=w(z).add(Hn(w(n.add(z)).add(s))).sub(l).toVar(),M=q(_.add(b).mul(.5),b.sub(_)).toVar(),S=q(_.add(b).mul(.5),ae(b.sub(_))).toVar();h.assign(Gs(M,h,r)),f.assign(xe(f,S));let C=ra(v,V,T).toVar();B(ld(hf(C,p)),()=>{let R=w(C).add(Hn(w(n.add(C)).add(s))).sub(l).toVar(),k=we(R).toVar();d.assign(Gs(k,d,r))})})});let x=c(0).toVar();return B(a.equal(N(0)),()=>{x.assign(o)}).ElseIf(a.equal(N(1)),()=>{x.assign(d)}).ElseIf(a.equal(N(2)),()=>{x.assign(d.sub(o))}).ElseIf(a.equal(N(3)),()=>{let v=c(3).toVar(),V=Q(v.sub(de(u.sub(m))),0).div(v).toVar();x.assign(xe(u,m).sub(V.mul(V).mul(v).mul(1/4)))}).ElseIf(a.equal(N(4)),()=>{x.assign(Ql(h.mul(5)))}).ElseIf(a.equal(N(5)),()=>{x.assign(Ma(o,3))}).ElseIf(a.equal(N(6)),()=>{let v=r.mul(.25).add(.0125).toVar(),V=Ma(r,3).mul(.25).add(.0125).toVar();x.assign(Ze(v.sub(v.mul(V)),v.add(v.mul(V)),f))}).ElseIf(a.equal(N(7)),()=>{x.assign((function(v){return Sf({p3:v})})(w(n.add(p)).add(s)))}),x}).setLayout({name:"spe_voronoi",type:"float",inputs:[{name:"x",type:"vec3"},{name:"style",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"quality",type:"int"}]});function uh(e,t,a,r,s){return zf({x:e,style:t,smoothness:a,seed:r,quality:s})}var Xi=[dr,function(e){return pf({m:e})},rs,function(e){return bf({x:e})},Di],pu=e=>e,kf=U(e=>{let t=e.v;return ae(Se(de(t.x).greaterThan(de(t.z)),w(t.y.negate(),t.x,0),w(0,t.z.negate(),t.y)))}
5).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function dh(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var fu=new Map,Af=U(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=c(uh(dh(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(oh(o,e.lowCut,e.highCut,c(0),c(1))),o.assign(lh(o,c(0),n.mul(.25))),o.assign(Gs(o,c(1),n.mul(.25))),l.add(t.mul(o).mul(r))}).setLayout({name:"spe_displaceVoronoi",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"},{name:"voronoiStyle",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"highCut",type:"float"},{name:"lowCut",type:"float"},{name:"quality",type:"int"}]});function Pf(e,t,a){let r=(function(u,d){let m=Math.trunc(u.getValue("noiseType")??0),h={n:d,scale:u.getFloat("scale"),intensity:u.getFloat("intensity"),offset:u.getVec3("offset"),movement:u.getFloat("movement")};if(m===5)return p=>Af({...h,p,voronoiStyle:u.getInt("voronoiStyle"),smoothness:u.getFloat("smoothness"),seed:u.getFloat("seed"),highCut:u.getFloat("highCut"),lowCut:u.getFloat("lowCut"),quality:u.getInt("quality")}
vendor: 15,503 bytes, line 5
5);let f=(function(p){let _=fu.get(p);if(_===void 0){let y=Xi[p]??Xi[0];_=U(g=>{let{n:x,scale:v,intensity:V,offset:T,movement:z}=g,b=g.p;return b.add(x.mul(y(dh(b,T,v,z))).mul(V))}).setLayout({name:`spe_displaceScalar${p}`,type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"}]}),fu.set(p,_)}return _})(m);return p=>f({...h,p})})(e,a),s=w(r(t)).toVar(),i=w((function(u){return kf({v:u})})(a)).toVar(),n=ae(_t(a,i)).toVar(),l=w(r(t.add(i))).toVar(),o=w(r(t.add(n))).toVar();return{position:s,normal:ae(_t(l.sub(s),o.sub(s)))}}Qt("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:ei(r,a)}});var gu=e=>e,Ef=e=>e;Qt("depth",(e,t,a)=>{let r,s=e.get("colors"),i=e.get("steps"),n=(e.getValue("colors")??s.array).length,l=e.getValue("smooth")===!0,o=(e.getValue("isVector")??1)>.5,u=(e.getValue("gradientType")??0)===0,d=(e.getValue("isWorldSpace")??0)>.5,m=e.getFloat("near"),h=e.getFloat("far");if(o){let y=e.getVec3("origin"),g=d?Ca:ga;if(u){let x=ae(e.getVec3("direction"));r=q(x,g.sub(y))}else r=we(g.sub(y))}else r=we(Ca.sub(pr));let f=r.sub(m).div(h.sub(m)).toVar(),p=P(s.element(0)).toVar();for(let y=1;y<n;y++){let g=gu(i.element(y-1)),x=gu(i.element(y)),v=ie(f.sub(g).div(x.sub(g)),c(0),c(1)),V=l?Ze(c(0),c(1),v):v;p.assign(X(p,Ef(s.element(y)),V))}let _=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Qa(_,a,t.isMask)}}),Qt("cavity",(e,t,a)=>{let r=ie(e.getFloat("ridge"),0,2),s=ie(e.getFloat("valley"),0,2),i=W.normalViewRenderTarget,n=W.resolution,l=Er("randomColor","vec3").x.toVar(),o=Fa.toVar(),u=A(c(1).div(n.x),c(1).div(n.y)).toVar(),d=(C,R)=>i.sample(o.add(A(C,R)).toVar()).toVar(),m=d(c(0),u.y.negate()),h=d(c(0),u.y),f=d(u.x.negate(),c(0)),p=d(u.x,c(0)),_=C=>C.a.equal(l).and(q(C.xyz,C.xyz).greaterThan(.5)),y=_(m).and(_(h)).and(_(f)).and(_(p)),g=m.y.sub(h.y).add(p.x.sub(f.x)).toVar(),x=c(.5).div(Q(r.mul(r),c(1e-4))).toVar(),v=c(.7).div(Q(s.mul(s),c(1e-4))).toVar(),V=(C,R)=>Se(C.lessThan(c(.5).div(R)),C.mul(c(1).sub(C.mul(R))),c(.25).div(R)),T=Se(y,Se(g.greaterThan(0),V(g,x).mul(2),V(g.negate(),v).mul(-2)),c(0)).toVar(),z=Se(T.abs().lessThan(.001),c(0),T).toVar(),b=w(ie(z.mul(.5).add(.5),0,1)),M=Se(z.notEqual(0),c(1),c(0)),S=Se(t.isMask,c(1),M);return{color:b,calpha:Qa(t.alpha.mul(t.mask).mul(S),a,t.isMask)}});var us=U(e=>{let t=e.material?.vertexObjectNormal??null;return t?il(t).transformNormalByInverseViewMatrix(La).normalize():Ym}).once()().toVar("speVertexNormalWorld");Qt("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=q(ae(us),w(0,1,0)),o=c(0).toVar();B(i.notEqual(0),()=>{let h=dr(ga.div(n).toVar().add(w(1.7,9.2,1)));o.assign(h.mul(i))});let u=Q(s,1e-4).toVar(),d=X(u.add(1),u.add(1).negate(),ie(r,0,1)).toVar(),m=Ze(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Qa(m,a,t.isMask)}});var xi=(e,t)=>e.element(t);Qt("fresnel",(e,t,a)=>{let r=xi(Js,2).w.equal(-1),s=w(xi(La,0).z,xi(La,1).z,xi(La,2).z).negate(),i=Ca.sub(pr),n=Se(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(Ma(de(e.getFloat("factor").add(q(ae(n),ae(us)))),e.getFloat("intensity")))),o=ie(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Qa(o,a,t.isMask)}});var jn=e=>e,Nf=e=>e;Qt("gradient",(e,t,a)=>{let r=e.get("colors"),s=e.get("steps"),i=(e.getValue("colors")??r.array).length,n=(e.getValue("steps")??s.array).length,l=Math.min(10,i,n),o=e.getInt("gradientType"),u=e.getBool("smooth"),d=e.getVec2("offset"),m=e.getVec2("morph"),h=e.getFloat("angle"),f=Ie(),p=P(r.element(0)).toVar(),_=A(m.div(f)).toVar(),y=A(c(.5).add(_.x),_.y).toVar(),g=A(ha(h).mul(y.x).sub(Zt(h).mul(y.y)),Zt(h).mul(y.x).add(ha(h).mul(y.y))).toVar(),x=A(f.sub(.5).add(d).div(2).add(g.div(2))),v=c(q(x,g).div(q(g,g))).toVar();B(o.equal(N(1)),()=>{v.assign(Jm(f.add(m).mul(3),f.add(d).add(1)).add(h))}).ElseIf(o.equal(N(2)),()=>{let T=hr(f.x.add(m.x).sub(.5).add(d.x),f.y.add(m.y).sub(.5).add(d.y)).mul(-1);v.assign(Ae(h.div(uo).div(-2).add(T.div(uo).mul(.5))))});for(let T=1;T<l;T++){let z=jn(s.element(T-1)),b=jn(s.element(T)),M=ie(v.sub(z).div(b.sub(z)),c(0),c(1)),S=jn(Se(u,Ze(c(0),c(1),M),M));p.assign(X(p,Nf(r.element(T)),S))}let V=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Qa(V,a,t.isMask)}}),Qt("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=ae(cr.negate()),i=ae(w(s.z,0,s.x.negate())),n=_t(s,i),l=A(q(i,na),q(n,na)),o=ha(r),u=Zt(r),d=A(o.mul(l.x).sub(u.mul(l.y)),u.mul(l.x).add(o.mul(l.y))).mul(.495).add(.5),m=e.get("texture").sample(d),h=t.alpha.mul(t.mask);return{color:m.rgb,calpha:Qa(h,a,t.isMask)}}),Qt("noise",(e,t,a)=>{try{if(new URLSearchParams(window.location.search).get("dbgnoise")==="0")return{color:w(0),calpha:c(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=c(Q(de(e.getFloat("scale")),.001)).toVar(),i=w(ga.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=P(0).toVar();if(r===5){let m=e.getFloat("smoothness"),h=c(uh(i.add(n),e.getInt("voronoiStyle"),m,e.getFloat("seed"),e.getInt("quality"))).toVar();h.assign(oh(h,e.getFloat("lowCut"),e.getFloat("highCut"),c(0),c(1))),h.assign(lh(h,c(0),m.mul(.25))),h.assign(Gs(h,c(1),m.mul(.25))),u.assign(X(l,o,h))}else{let m=Xi[r]??Xi[0],h=e.getVec4("colorB"),f=e.getVec4("colorD"),p=w(e.getVec2("distortion"),1).toVar(),_=w(e.getVec2("fA"),1).toVar(),y=w(e.getVec2("fB"),1).toVar(),g=w(m(i),m(i.add(w(1))),m(i.add(w(1)))).toVar(),x=w(m(i.add(p.mul(g)).add(_).add(n)),m(i.add(p.mul(g)).add(y).add(n)),m(i.mul(g))).toVar(),v=c(m(i.add(x))).toVar();u.assign(X(l,h,ie(v.mul(v).mul(4),c(0),c(1)))),u.assign(X(u,o,ie(we(g),c(0),c(1)))),u.assign(X(u,f,ie(we(x.x),c(0),c(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:ie(u,c(0),c(1)).rgb,calpha:Qa(d,a,t.isMask)}}),Qt("normal",(e,t,a)=>({color:ec(ae(na)).mul(Ne(w(.5),e.getVec3("cnormal"))),calpha:ei(t.alpha.mul(t.mask),a)}));var qs=2*Math.PI,Bf=Math.PI/180,Ff=U(e=>{let t=Ae(e.p.xyx.mul(.1031)).toVar();return t.addAssign(q(t,t.yzx.add(33.33))),Ae(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function ro(e){return Ff({p:e})}var Lf=U(e=>{let t=e.uv,a=.5,r=c(e.a.mul(Bf)).toVar(),s=A(ha(r).mul(t.x.sub(a)).add(Zt(r).mul(t.y.sub(a))).add(a),ha(r).mul(t.y.sub(a)).sub(Zt(r).mul(t.x.sub(a))).add(a));return Ae(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function vi(e,t){return Lf({uv:e,a:t})}var If=U(e=>{let t=A(e.uv.mul(e.frequency)).toVar(),a=A(J(t)).toVar(),r=c(qa(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=A(Ae(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(J(t));let i=c(ro(a).mul(5).add(1)).toVar(),n=c(X(c(1),i,e.variation)).toVar();return s.mulAssign(n),s}).setLayout({name:"spe_pattern_tile_and_center",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"variation",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function ds(e,t,a,r,s){return If({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var Df=U(e=>{let t=A(ds(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Ze(e.smoothness.negate(),e.smoothness,we(t).sub(e.size))}).setLayout({name:"spe_pattern_circle",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Uf=U(e=>{let t=A(ds(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=c(we(t)).toVar(),r=c(Ze(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=c(Ze(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(dt(s))}).setLayout({name:"spe_pattern_ring",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Of=U(e=>{let t=c(c(qs).div(c(e.n))).toVar(),a=c(e.r.mul(tc(t.mul(.5)))).toVar(),r=A(e.p.yx.negate()).toVar(),s=c(t.mul(J(hr(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=A(ha(s),Zt(s)).toVar();return r.assign(A(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),we(r.sub(A(e.r,ie(r.y,a.negate(),a)))).mul(Xa(r.x.sub(e.r)))}).setLayout({name:"spe_pattern_sdf_ngon",type:"float",inputs:[{name:"p",type:"vec2"},{name:"r",type:"float"},{name:"n",type:"int"}]}),Gf=U(e=>{let t=A(ds(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Ze(e.smoothness.negate(),e.smoothness,Of({p:t,r:e.size,n:e.sides}))}).setLayout({name:"spe_pattern_polygon",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"},{name:"sides",type:"int"}]}),qf=U(e=>{let t=e.b,a=A(de(e.p)).toVar();a.assign(Se(a.y.greaterThan(a.x),a.yx,a.xy));let r=A(a.sub(t)).toVar(),s=c(Q(r.y,r.x)).toVar(),i=A(Se(s.greaterThan(0),r,A(t.y.sub(a.x),s.negate()))).toVar();return Xa(s).mul(we(Q(i,A(0)))).add(e.r)}).setLayout({name:"spe_pattern_sdf_cross",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"},{name:"r",type:"float"}]}),Wf=U(e=>{let t=A(ds(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Ze(e.smoothness.negate(),e.smoothness,qf({p:t,b:A(e.size,e.size.mul(.25)),r:e.smoothness}))}).setLayout({name:"spe_pattern_xcross",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Hf=U(e=>{let t=e.b,a=A(de(e.p)).toVar(),r=A(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=c(ie(s.div(q(t,t)),c(-1),c(1))).toVar();return c(we(a.sub(t.mul(.5).mul(A(dt(i),i.add(1)))))).toVar().mul(Xa(a.x.mul(t.y).add(a.y.mul(t.x)).sub(t.x.mul(t.y))))}).setLayout({name:"spe_pattern_sdf_diamond",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"}]}),jf=U(e=>{let t=A(ds(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Ze(e.smoothness.negate(),e.smoothness,Hf({p:t,b:A(e.size)}))}).setLayout({name:"spe_pattern_diamond",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),$f=U(e=>{let t=A(e.uv.mul(e.frequency)).toVar(),a=A(J(t)).toVar(),r=c(qa(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=c(J(t.x)).toVar();return qa(s,2)}).setLayout({name:"spe_pattern_checkerboard",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Kf=U(e=>{let t=A(ds(e.uv,e.frequency,c(0),e.zigzag,e.rotation)).toVar(),a=c(J(e.uv.mul(e.frequency)).y).toVar(),r=c(ro(A(a))).toVar(),s=c(X(e.size,e.size.mul(r),e.variation)).toVar();return Ze(s.sub(e.smoothness),s.add(e.smoothness),de(t.y))}).setLayout({name:"spe_pattern_line",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Xf=U(e=>{let{a:t,b:a,c:r,d:s}=e,i=A(e.p.sub(A(s,t)).mul(r)).toVar();i.x.assign(qa(i.x,qs)),B(i.x.greaterThan(Math.PI),()=>{i.x.assign(c(qs).sub(i.x))});let n=c(0).toVar(),l=c(qs).toVar();We(24,()=>{let d=c(n.add(l).mul(.5)).toVar(),m=c(d.sub(i.x).add(a.mul(r).mul(Zt(d)).mul(i.y.sub(a.mul(r).mul(ha(d)))))).toVar();B(m.lessThan(0),()=>{n.assign(d)}).Else(()=>{l.assign(d)})});let o=c(n.add(l).mul(.5)).toVar(),u=A(o,a.mul(r).mul(ha(o))).toVar();return we(i.sub(u)).div(r)}).setLayout({name:"spe_pattern_udf_cos",type:"float",inputs:[{name:"p",type:"vec2"},{name:"a",type:"float"},{name:"b",type:"float"},{name:"c",type:"float"},{name:"d",type:"float"}]}),Qf=U(e=>{let t=c(e.frequency.x).toVar(),a=A(e.uv.mul(t)).toVar(),r=A(J(a)).toVar(),s=c(qa(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=A(a.x,Ae(a.y)).toVar(),n=c(e.frequency.y.mul(.1)).toVar(),l=c(Xf({p:i,a:c(.5),b:c(.125),c:n.mul(qs),d:c(0)})).toVar(),o=c(ro(A(r.y))).toVar(),u=c(X(e.size,e.size.mul(o),e.variation)).toVar();return Ze(e.smoothness.negate(),e.smoothness,l.sub(u.mul(.5)))}).setLayout({name:"spe_pattern_wave",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function bi(e,t){let a={uv:t.uv,frequency:t.frequency,size:t.size,variation:t.variation,smoothness:t.smoothness,zigzag:t.zigzag,rotation:t.rotation};switch(e){case 1:return Uf(a);case 2:return Gf({...a,sides:t.sides});case 3:return Wf(a);case 4:return jf(a);case 5:return $f(a);case 6:return Kf(a);case 7:return Qf(a);default:return Df(a)}}Qt("pattern",(e,t,a)=>{let r,s,i=e.getValue("style")??0,n=e.getValue("projection")??0,l=e.getValue("axis")??0,o=e.getFloat("blending"),u=e.getVec2("offset"),d=e.getVec4("colorA"),m=e.getVec4("colorB"),h=e.getVec2("frequency"),f=e.getFloat("size"),p=e.getFloat("variation"),_=e.getFloat("smoothness"),y=e.getFloat("zigzag"),g=e.getFloat("rotation"),x=e.getVec2("vertical"),v=e.getVec2("horizontal"),V=e.getInt("sides"),T={frequency:h,size:f,variation:p,smoothness:c(Ma(_,5)).toVar(),zigzag:y,rotation:g,sides:V};if(n===4){let M=w(ga).toVar(),S=c(.0125).toVar(),C=A(Ae(M.xy.mul(S))).toVar(),R=A(Ae(M.zy.mul(S))).toVar(),k=A(Ae(M.xz.mul(S))).toVar();C.assign(vi(C.add(u),g)),R.assign(vi(R.add(u),g)),k.assign(vi(k.add(u),g));let E=c(bi(i,{uv:C,...T})).toVar(),I=c(bi(i,{uv:R,...T})).toVar(),D=c(bi(i,{uv:k,...T})).toVar(),H=c(dt(o).mul(125).add(3)).toVar(),K=w(to).toVar(),O=w(de(ae(K))).toVar();O.assign(Ma(O,w(H))),O.divAssign(q(O,w(1))),E.mulAssign(O.z),I.mulAssign(O.x),D.mulAssign(O.y),r=c(E.add(I).add(D)).toVar(),s=A(C.mul(O.z).add(R.mul(O.x)).add(k.mul(O.y))).toVar()}else{let M=A(0).toVar();if(n===0)M.assign(Ie());else if(n===2){let S,C,R=w(ga).toVar(),k=c(we(R)).toVar();l===0?(S=c(hr(R.y,R.z)).toVar(),C=c(yn(R.x.div(k))).toVar()):l===1?(S=c(hr(R.x,R.z)).toVar(),C=c(yn(R.y.div(k))).toVar()):(S=c(hr(R.y,R.x)).toVar(),C=c(yn(R.z.div(k))).toVar()),M.assign(A(S,C).div(Math.PI))}M.addAssign(u),M.assign(Ae(M)),M.assign(vi(M,g)),r=bi(i,{uv:M,...T}),s=M}let z=P(X(d,m,r)).toVar();z.a.assign(ie(z.a,c(0),c(1))),z.a.mulAssign(Ne(x.x,s.y).mul(Ne(s.y,x.y))),z.a.mulAssign(Ne(v.x,de(s.x)).mul(Ne(de(s.x),v.y)));let b=t.alpha.mul(ie(z.a,c(0),c(1))).mul(t.mask);return{color:ie(z,P(0),P(1)).rgb,calpha:Qa(b,a,t.isMask)}});var Ti=(e,t)=>e.element(t);Qt("rainbow",(e,t,a)=>{let r=e.getFloat("filmThickness"),s=e.getFloat("movement"),i=e.getVec3("wavelengths"),n=e.getFloat("noiseStrength"),l=e.getFloat("noiseScale"),o=e.getVec3("offset"),u=c(0).toVar();t.noiseCompiledIn!==!1&&B(n.notEqual(0),()=>{let v=ga.div(l).toVar(),V=dr(v.mul(1.6).add(w(1.8,1.5,1.9).mul(dr(v))).add(w(1.7,9.2,1)));u.assign(V.mul(n))});let d=i.mul(w(1,.8,.6)).add(1),m=Ti(Js,2).w.equal(-1),h=w(Ti(La,0
5).z,Ti(La,1).z,Ti(La,2).z).negate(),f=Ca.sub(pr),p=Se(m,f,h),_=q(ae(p.add(o.mul(-.001))),ae(us)),y=ha(r.add(u).div(d).mul(_).add(s)).mul(.5).add(.5),g=w(ie(y,0,2)).toVar(),x=ie(g.r.add(g.g).add(g.b),0,1);return{color:g,calpha:Qa(t.alpha.mul(x).mul(t.mask),a,t.isMask)}});var _u=e=>e,Zf=e=>e,Yf=We,Jf=We,eg=U(e=>{let t=e.x,a=w(q(t,w(127.1,311.7,74.7)),q(t,w(269.5,183.3,246.1)),q(t,w(113.5,271.9,124.6)));return Ae(Zt(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),tg=U(e=>{let t=e.x,a=J(t).toVar(),r=Ae(t).toVar(),s=c(100).toVar(),i=()=>({start:N(-1),end:N(1),condition:"<=",type:"int"});return Jf(i(),i(),i(),({i:n,j:l,k:o})=>{let u=w(n,l,o).toVar(),d=u.sub(r).add((function(h){return eg({x:h})})(a.add(u))).toVar(),m=q(d,d).toVar();B(m.lessThan(s),()=>{s.assign(m)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Qt("toon",(e,t,a)=>{let r=e.getInt("positioning"),s=e.get("colors"),i=e.get("steps"),n=e.getVec3("source"),l=e.getBool("isWorldSpace"),o=e.getFloat("noiseStrength"),u=e.getFloat("noiseScale"),d=e.getVec4("shadowColor"),m=e.getVec3("offset"),h=ae(us).toVar(),f=c(0).toVar();a.lightsAvailable===!0&&B(r.equal(N(0)),()=>{Yf({start:N(0),end:W.toonLightCount,condition:"<",type:"int"},({i:v})=>{let V=W.toonLightData.element(v).toVar(),T=V.xyz,z=V.w,b=Se(z.greaterThan(.5),ae(T),ae(T.sub(Ca))),M=q(b,h).mul(.5).add(.5);f.assign(Q(f,M))}),f.assign(ie(f,0,1))}),B(r.equal(N(1)),()=>{let v=X(ga,Ca,Se(l,c(1),c(0))),V=ae(n.sub(v));f.assign(q(V,h).mul(.5).add(.5))}).ElseIf(r.equal(N(2)),()=>{let v=pr.sub(m),V=ae(v.sub(Ca));f.assign(q(V,h).mul(.5).add(.5))}),B(o.greaterThan(0),()=>{let v=ga.div(u),V=c(1).sub(tg({x:v}));f.addAssign(V.mul(o))}),f.assign(ie(f,0,1));let p=(e.getValue("colors")??s.array).length,_=(e.getValue("steps")??i.array).length,y=Math.min(10,p,_),g=P(s.element(0)).toVar();for(let v=1;v<y;v++){let V=_u(i.element(v-1)),T=_u(i.element(v)),z=ie(f.sub(V).div(T.sub(V)),c(0),c(1));g.assign(X(g,Zf(s.element(v)),Ze(0,1,z)))}a.lightsAvailable===!0&&B(r.equal(N(0)),()=>{let v=c(1),V=X(g.rgb,d.rgb,d.a);g.rgb.assign(X(V,g.rgb,v))});let x=t.alpha.mul(g.a).mul(t.mask);return{color:g.rgb,calpha:ei(x,a)}});var yu=e=>e,Hr=e=>e,ag=e=>e,rg=e=>e;Qt("transmission",(e,t,a)=>{let r=e.getFloat("thickness"),s=e.getFloat("ior"),i=e.getFloat("roughness"),n=W.transmissionRenderTarget,l=W.transmissionSamplerSize,o=j=>((Z,$)=>La.element($))(0,j),u=ae(w(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=ae(Ca.sub(pr)),m=W.orthographicUniform,h=Se(m.greaterThan(.5),u,d).toVar(),f=ae(us).toVar(),p=ac(h,f,c(1).div(s)).toVar(),_=ae(p).mul(r).mul(Jp).toVar(),y=j=>{let Z=W.unjitteredProjection.mul(La).mul(P(j,1)),$=Z.xy.div(Z.w);return A($.x.mul(.5).add(.5),$.y.mul(-.5).add(.5))},g=y(Ca.add(_).toVar()).toVar(),x=(y(Ca).toVar(),i.mul(ie(s.mul(2).sub(2),c(0),c(1))).toVar()),v=Ls(l.x).mul(x).toVar(),V=x,T=xe(v.div(5.5),c(8.5)).toVar(),z=null,b="fit",M=!0,S=!1,C=12,R="white",k=1;try{let j=new URLSearchParams(window.location.search),Z=j.get("dbglod");Z!==null&&(z=Number(Z));let $=j.get("dbgtap");$==="ring"&&(b="ring"),($==="single"||$==="1")&&(b="single"),($==="r50"||$==="r75"||$==="full")&&(b=$),$==="singlewide"&&(b="singlewide"),($==="fit"||$==="singlefit")&&(b="fit");let me=j.get("dbgwidth");me!==null&&Number.isFinite(Number(me))&&(k=Math.max(0,Number(me))),$==="6"&&(b="ring",C=6),j.get("dbgwarp")==="0"&&(M=!1),j.get("dbgdither")==="1"&&(S=!0);let ue=j.get("dbgangle");(ue==="classic"||ue==="0")&&(R=ue)}catch{}z!==null&&Number.isFinite(z)&&T.assign(c(z));let E,I=(()=>{if(b==="singlewide")return xe(T.add(1),c(8.5)).toVar();if(b!=="fit")return T;let j=W.transmissionActualSize.x.div(W.resolution.x),Z=V.mul(T).mul(5*k).mul(j).toVar();return xe(Ls(gs(T.mul(2)).add(Z.mul(Z).mul(3))).mul(.5),c(8.5)).toVar()})(),D=j=>n.sample(M?(Z=>{let $=W.transmissionActualSize.div(gs(J(I))),me=Z.mul($).sub(.5),ue=J(me),ce=me.sub(ue),Me=ce.mul(ce).mul(A(3,3).sub(ce.mul(2)));return ue.add(.5).add(Me).div($)})(j):j).level(I).rgb,H=b==="r50"?.5:b==="r75"?.75:1;if(b==="single"||b==="singlewide"||b==="fit")if(b==="fit"){let j=J(I).toVar(),Z=I.sub(j).toVar(),$=Ea(gs(Z.mul(2)).sub(1)).mul(1.1547).toVar(),me=A(gs(j)).div(W.transmissionActualSize).mul($).toVar(),ue=w(0).toVar(),ce=12;for(let Me=0;Me<ce;Me++){let fe=Hr(Nr(Me,ce,c(0))),Te=Hr(g.add(fe.mul(me)));ue.addAssign(ag(rg(n.sample(Te).level(j)).rgb))}E=ue.div(ce).toVar()}else E=D(g).toVar();else{let j=A(c(1).div(W.resolution.x),c(1).div(W.resolution.y)).toVar(),Z=mr(R==="classic"?da.xy.add(W.cameraJitterPx):da.xy).mul(6.28318530718);R==="white"&&(Z=Z.add(W.tapAngle));let $=Z.toVar(),me=W.tapAngle.mul(13.7).toVar(),ue=W.tapAngle2.mul(5.3).toVar(),ce=A(gs(J(I).add(1))).div(W.transmissionActualSize).toVar(),Me=mr(da.xy.add(A(me,ue))).toVar(),fe=mr(da.xy.add(A(ue.mul(1.71),me.mul(2.39)))).toVar(),Te=w(0).toVar();for(let Be=0;Be<C;Be++){let $e=Hr(Nr(Be,C,$)).mul(j).mul(V).mul(T.mul(10)).mul(H),Ge=Hr(g.add($e));if(S){let Ye=yu(Ae(Me.add(.7548776662*Be))),Ue=yu(Ae(fe.add(.5698402911*Be))),wt=Hr(A(Ye.sub(.5),Ue.sub(.5)).mul(ce));Ge=Hr(Ge.add(wt))}Te.addAssign(D(Ge))}E=Te.div(C).toVar()}if(e.has("attenuationDistance")){let j=e.getFloat("attenuationDistance"),Z=w(e.getColor("attenuationColor")).toVar();B(j.greaterThan(0),()=>{let $=Ma(Q(Z,w(1e-4)),w(r.div(j)));E.mulAssign($)})}let K=t.alpha.mul(t.mask).toVar(),O=K.div(ie(K.add(a.accumAlpha),c(1e-5),c(1))).toVar();return a.accumAlpha.addAssign(c(1).sub(a.accumAlpha).mul(t.alpha)),{color:E,calpha:O}}),Qt("reflection",(e,t,a)=>{let r=e.getFloat("blur"),s=e.getFloat("thickness"),i=e.getInt("steps"),n=e.getFloat("stepSize"),l=e.getValue("tracingMode")??0,o=W.reflectionRenderTarget,u=W.reflectionDepthPyramid,d=W.reflectionDepthPyramid,m=W.reflectionDepthLevels,h=W.reflectionEnvMap,f=W.reflectionPlanarTarget,p=W.reflectionPlanarEnabled,_=Sr("__splinePlanarMirror","float"),y=p.greaterThan(.5).and(_.greaterThan(.5)),g=W.reflectionResolveTarget,x=W.reflectionResolveEnabled,v=W.orthographicUniform.greaterThan(.5),V=Se(v,w(0,0,-1),ae(cr)).toVar(),T=ae(na).toVar(),z=Gi(V,T).toVar(),b=ie(r.mul(.1),c(0),c(1)).toVar(),M=W.resolution,S=w(0).toVar(),C=x.greaterThan(.5).and(b.greaterThan(.05)).and(y.not()),R=ae(fd(z,dl)).toVar(),k=Ad(h,R,b).toVar(),E=g.sample(Fa).level(c(0)).toVar();B(C,()=>{let H=E.a.toVar();S.assign(X(k,E.rgb.div(H.max(1e-4)),ie(H.mul(2),c(0),c(1))))}).Else(()=>{S.assign(Pd({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:cr,normalV:T,screenUv:Fa,fragWindowZ:Kl},camera:{projectionMatrix:Js,projectionMatrixInverse:sc,worldMatrix:dl,near:rc},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:h},usePlanar:y,noisePixel:Fa.mul(M).floor()}))}),B(y,()=>{let H=A(c(1).sub(Fa.x),Fa.y).toVar(),K=c(m.sub(1)),O=xe(Ls(b.mul(M.y).mul(.075).add(1)),K).toVar(),j=O.sub(1).max(0).floor().toVar(),Z=c(2).pow(O).sub(1).max(0).toVar(),$=Z.mul(.75).div(M.y).toVar();S.assign(kd(f,H,$,Z.mul(.75),j))});let I=t.alpha.mul(t.mask).toVar(),D=I.div(ie(I.add(a.accumAlpha),c(1e-5),c(1))).toVar();return a.accumAlpha.addAssign(c(1).sub(a.accumAlpha).mul(I)),{color:S,calpha:D}});var xu=e=>e,sg=e=>e;function vu(e){let t=e.data,a=[e.kind,e.type,`v=${!!t.visible}`,`m=${!!t.isMask}`,`p=${e.params.names().join(",")}`];if(e.type!=="light"){let r=xd[e.type];if(r!==void 0)for(let s of r)a.push(`${s}=${String(t[s])}`)}for(let[r,s]of e.uniformKinds)(s==="vec4array"||s==="floatArray")&&a.push(`${r}#${(e.params.getValue(r)??[]).length}`);if(e.type==="rainbow"&&a.push(`noise=${e.noiseCompiledIn!==!1}`,`forced=${e.noiseForced===!0}`),e.type==="displace"&&a.push(`dt=${String(t.displacementType)}`),e.type==="texture"||e.type==="video"||e.type==="matcap"){if(e.holders.length===0)throw new Error(`structuralKey: ${e.type} layer has no holder`);let r=t.texture??{};a.push(`holder=${e.holders.map(s=>s.instanceId).join(",")}
5`,`wrap=${String(r.wrapping)}`,`min=${String(r.minFilter)}`,`mag=${String(r.magFilter)}`)}return a.join(";")}Qt("outline",(e,t,a)=>{let r=e.getColor("outlineColor"),s=e.getColor("contourColor"),i=e.getFloat("outlineWidth"),n=e.getFloat("contourWidth"),l=e.getFloat("outlineThreshold"),o=e.getFloat("contourThreshold"),u=e.getFloat("outlineSmoothing"),d=e.getFloat("contourFrequency"),m=e.getVec3("contourDirection"),h=e.getBool("positionalLines"),f=e.getBool("compensation"),p=W.normalRenderTarget,_=W.normalRenderTargetDepth,y=W.resolution,g=W.pixelRatio,x=Er("randomColor","vec3").x.toVar(),v=Kl.toVar(),V=Fa.toVar(),T=A(c(1).div(y.x),c(1).div(y.y)).toVar(),z=W.pcssHalton,b=mr(da.xy.add(z)).mul(6.28318530718).toVar(),M=f.select(i.div(2),i),S=T.mul(M).mul(g).toVar(),C=[[-1,-1],[0,-1],[1,-1],[-1,0],[0,0],[1,0],[-1,1],[0,1],[1,1]],R=ue=>Nr(ue,9,b).mul(T),k=[],E=c(0).toVar();for(let ue=0;ue<9;ue++){let[ce,Me]=C[ue],fe=ue===4?V:xu(V.add(A(S.x.mul(ce),S.y.mul(Me))).add(R(ue))),Te=xu(fe).toVar(),Be=sg(p.sample(Te)).toVar();k.push(Be),B(Be.a.notEqual(x).and(Be.a.notEqual(0)),()=>{let $e=_.sample(Te).r.add(1e-4);B(v.greaterThan($e),()=>{E.assign(1)})})}let I=k[2].rgb.add(k[5].rgb.mul(2)).add(k[8].rgb).sub(k[0].rgb.add(k[3].rgb.mul(2)).add(k[6].rgb)),D=k[0].rgb.add(k[1].rgb.mul(2)).add(k[2].rgb).sub(k[6].rgb.add(k[7].rgb.mul(2)).add(k[8].rgb)),H=Ea(q(I,I).add(q(D,D))).mul(E.oneMinus()).toVar(),K=w(r).toVar(),O=Ze(l.sub(u),l.add(u),H).toVar(),j=ae(us).toVar(),Z=c(1).sub(o).toVar();B(h,()=>{let ue=ga.mul(m),ce=ue.x.add(ue.y).add(ue.z).toVar(),Me=Ae(ce.mul(d).mul(.01)),fe=ho(ce.mul(d)),Te=Ze(fe.mul(n.mul(.01)),fe.mul(n.mul(.02)),Me).toVar();B(Te.lessThan(1).and(O.equal(0)),()=>{K.assign(s),O.assign(1)})}).Else(()=>{let ue=j.mul(m),ce=ue.x.add(ue.y).add(ue.z).toVar(),Me=ho(ce.mul(o)).toVar(),fe=Zt(ce.mul(d)).toVar(),Te=Ze(c(0),Me.mul(n),c(1).sub(fe)).toVar();B(Me.greaterThan(Z.mul(.5)).and(Te.lessThan(1)).and(O.equal(0)),()=>{K.assign(s),O.assign(c(1).sub(Te))})});let $=t.alpha.mul(O).mul(t.mask).toVar(),me=$.div(ie($.add(a.accumAlpha),c(1e-5),c(1))).toVar();return a.accumAlpha.addAssign(c(1).sub(a.accumAlpha).mul($)),{color:K,calpha:me}}),Qt("vertexColor",(e,t,a)=>{let r=ic(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:ei(s,a)}});var ig=e=>e,bu=e=>e;function $t(e,t=1){let a=new gt(e);return new Sa(a.r,a.g,a.b,t)}function Fl(e,t){if(e instanceof Sa)return e;if(e instanceof gt)return new Sa(e.r,e.g,e.b,1);if(typeof e=="number")return $t(e);if(typeof e=="object"&&e!==null&&"r"in e&&"g"in e&&"b"in e){let a=e;return new Sa(a.r,a.g,a.b,a.a??1)}return t()}function Tu(){let e=new Array(10).fill(new at(0,0,0,1)).map(t=>t.clone());return e[1]=new at(1,1,1,1),e}function wu(){let e=new Array(10).fill(1);return e[0]=0,e}var Su={color:{color:{kind:"color",def:()=>$t(yd)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>$t(16777215)},bias:{kind:"float",def:()=>.1},scale:{kind:"float",def:()=>1},intensity:{kind:"float",def:()=>2},factor:{kind:"float",def:()=>1}},dust:{color:{kind:"color",def:()=>$t(10323813)},coverage:{kind:"float",def:()=>.2},softness:{kind:"float",def:()=>.2},noiseStrength:{kind:"float",def:()=>.2},noiseScale:{kind:"float",def:()=>1}},rainbow:{filmThickness:{kind:"float",def:()=>30},movement:{kind:"float",def:()=>0},wavelengths:{kind:"vec3",def:()=>new ne},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new ne}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>$t(16777215)},attenuationDistance:{kind:"float",def:()=>0}},reflection:{blur:{kind:"float",def:()=>0},thickness:{kind:"float",def:()=>.001},steps:{kind:"int",def:()=>60},stepSize:{kind:"float",def:()=>.005},tracingMode:{kind:"int",def:()=>1}},toon:{positioning:{kind:"int",def:()=>0},colors:{kind:"vec4array",def:Tu},steps:{kind:"floatArray",def:wu},source:{kind:"vec3",def:()=>new ne},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Sa(0,0,0,0)},offset:{kind:"vec3",def:()=>new ne}},outline:{outlineColor:{kind:"color",def:()=>$t(16777215)},contourColor:{kind:"color",def:()=>$t(16777215)},outlineWidth:{kind:"float",def:()=>.1},contourWidth:{kind:"float",def:()=>.1},outlineThreshold:{kind:"float",def:()=>.1},contourThreshold:{kind:"float",def:()=>.1},outlineSmoothing:{kind:"float",def:()=>.1},contourFrequency:{kind:"float",def:()=>.1},contourDirection:{kind:"vec3",def:()=>new ne(0,1,0)},positionalLines:{kind:"bool",def:()=>!1},compensation:{kind:"bool",def:()=>!0}},depth:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},near:{kind:"float",def:()=>50},far:{kind:"float",def:()=>200},isVector:{kind:"float",def:()=>1},isWorldSpace:{kind:"float",def:()=>0},origin:{kind:"vec3",def:()=>new ne},direction:{kind:"vec3",def:()=>new ne(1,0,0)},colors:{kind:"vec4array",def:()=>[new at(0,0,0,1),new at(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new ne(100,100,100)},move:{kind:"float",def:()=>1}
5,fA:{kind:"vec2",def:()=>new ve(1.7,9.2)},fB:{kind:"vec2",def:()=>new ve(8.3,2.8)},distortion:{kind:"vec2",def:()=>new ve(1,1)},colorA:{kind:"colorVec4",def:()=>new Sa(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Sa(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Sa(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Sa(1,1,1,1)},noiseType:{kind:"int",def:()=>0},voronoiStyle:{kind:"int",def:()=>0},highCut:{kind:"float",def:()=>1},lowCut:{kind:"float",def:()=>0},smoothness:{kind:"float",def:()=>.5},seed:{kind:"float",def:()=>.5},quality:{kind:"int",def:()=>1}},normal:{cnormal:{kind:"vec3",def:()=>new ne(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Tu},steps:{kind:"floatArray",def:wu},offset:{kind:"vec2",def:()=>new ve},morph:{kind:"vec2",def:()=>new ve},angle:{kind:"float",def:()=>0}},pattern:{style:{kind:"int",def:()=>0},projection:{kind:"int",def:()=>0},axis:{kind:"axis",def:()=>"x"},blending:{kind:"float",def:()=>0},offset:{kind:"vec2",def:()=>new ve},colorA:{kind:"colorVec4",def:()=>new Sa(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Sa(1,1,1,1)},frequency:{kind:"vec2",def:()=>new ve(10,10)},size:{kind:"float",def:()=>.5},variation:{kind:"float",def:()=>0},smoothness:{kind:"float",def:()=>.5},zigzag:{kind:"float",def:()=>0},rotation:{kind:"float",def:()=>0},vertical:{kind:"vec2",def:()=>new ve(0,1)},horizontal:{kind:"vec2",def:()=>new ve(0,1)},sides:{kind:"int",def:()=>6}}},ng=new at;function Bs(e,t){let a=e.material;if((a==null||a.isTSLNodeMaterial!==!0)&&(a=e.object?.material,a==null||a.isTSLNodeMaterial!==!0))return t;if(t.kind==="light"){let s=a.lightLayer;if(s==null)return t;let i=s.data?.category,n=t.data?.category;return i===n?s:t}let r=a.layers?.[t.structIndex];return r!==void 0&&r.type===t.type?r:t}function Vu(e,t){if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new Error(`[spe] ${e}.element() needs a build-time constant index (got ${String(t)}). Array params are inlined as per-slot uniforms; a dynamic index needs a real uniformArray.`);return t}function he(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=L(Number(r??0));break;case"int":s=L(Number(r??0),"int");break;case"axis":s=L(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=L(!!r);break;case"vec2":s=L(r instanceof ve?r:new ve);break;case"vec3":s=L(r instanceof ne?r:new ne);break;case"vec4":s=L(r instanceof at?r:new at);break;case"color":{let l=Fl(r,()=>$t(16777215));s=L(l),i=l;break}case"colorVec4":{let l=Fl(r,()=>new Sa(1,1,1,1)),o=new at(l.r,l.g,l.b,l.a),u=L(o);u.onObjectUpdate(d=>{let m=Bs(d,e).params.getLiveValue(t)??l;o.set(m.r,m.g,m.b,m.a)}),s=u,i=l;break}case"vec4array":{let l=Array.isArray(r)?r:[];s=(function(o,u,d){let m=new Map;return{element(h){let f=Vu(u,h),p=m.get(f);if(p===void 0){let _=L(d[f]??new at);_.onObjectUpdate(y=>(Bs(y,o).params.getValue(u)??d)[f]??ng),p=_,m.set(f,p)}return p},array:d,get value(){return d},set value(h){if(Array.isArray(h))for(let f=0;f<Math.min(d.length,h.length);f++){let p=h[f];Array.isArray(p)?d[f].set(p[0]??0,p[1]??0,p[2]??0,p[3]??1):p&&typeof p=="object"&&d[f].set(p.x??0,p.y??0,p.z??0,p.w??1)}}}})(e,t,l.length>0?l:[new at]),i=l;break}case"floatArray":{let l=Array.isArray(r)?r:[0];s=(function(o,u,d){let m=new Map;return{element(h){let f=Vu(u,h),p=m.get(f);if(p===void 0){let _=L(d[f]??0);_.onObjectUpdate(y=>{let g=Bs(y,o).params.getValue(u);return Number((g??d)[f]??0)}),p=_,m.set(f,p)}return p},array:d,get value(){return d},set value(h){if(Array.isArray(h))for(let f=0;f<Math.min(d.length,h.length);f++)d[f]=Number(h[f])}}})(e,t,l.length>0?l:[0]),i=l;break}}a!=="vec4array"&&a!=="floatArray"&&a!=="colorVec4"&&(rh(s),s.onObjectUpdate(l=>{let o=Bs(l,e).params.getValue(t);o!==void 0&&sh(s,o)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var lg=class{constructor(e,t,a,r){this.repeat=e,this.offset=t,this.rotation=a,this.target=r,this.updateMatrix()}updateMatrix(){this.target.setUvTransform(this.offset[0],this.offset[1],this.repeat[0],this.repeat[1],0,0,0).premultiply(new en().makeRotation(this.rotation*Zl.DEG2RAD))}},Qi=class{constructor(e,t,a,r){this.kind=e,this.id=t,this.uuid=a,this.data=r,this.uniformKinds=new Map,this.holders=[],this.structIndex=-1,this.params=new ef(t)}get type(){return this.data.type}get uniforms(){return this.params.uniforms}get alphaNode(){return this.params.getFloat("alpha")}get modeNode(){return this.params.getInt("mode")}get isMaskNode(){return this.params.getFloat("isMask")}get isMaskEnabled(){return"isMask"in this.data&&!!this.data.isMask}hasValue(e){return this.params.has(e)}setValue(e,t){if(e==="noiseStrength"&&this.noiseCompiledIn===!1&&typeof t=="number"&&t!==0&&this.onNoiseMismatch!==void 0){let a=this.onNoiseMismatch;return this.onNoiseMismatch=void 0,this.params.setValue(e,t),void(a(t)&&(this.noiseCompiledIn=!0))}this.params.setValue(e,t)}getNode(e){return this.params.has(e)?this.params.get(e):void 0}getValue(e){return this.params.getValue(e)}getName(e){let t=/f\d+_(.*)/.exec(e);if(t&&t.length>1)return t[1];console.log(`Layer.getName: error ${e}`)}getNames(){return this.params.names()}get assetsLoaded(){return this.holders.every(e=>e.loaded)}dispose(){for(let e of this.holders)e instanceof ep||e.deref();this.holders.length=0}},Ui=class extends Qi{constructor(e,t,a){super("light",e,t,a),this.node={alphaOverride:void 0,alpha:{value:1}}}get lightData(){return this.data}get category(){return this.lightData.category??"phong"}};function Zs(e,t){let a=e.data;a.type!=="displace"?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Xs(a.alpha,t)*(a.visible?1:0)),a.type==="outline"&&e.params.has("compensation")&&e.params.setValue("compensation",!!a.compensation&&!!a.visible)):e.params.has("intensity")&&e.params.setValue("intensity",(Ua(a.intensity,t)??1)*(a.visible?1:0))}function hh(e,t){he(e,"alpha","float",t.alpha??1),he(e,"mode","int",t.mode??0),he(e,"isMask","float",t.isMask?1:0)}function mh(e,t,a,r){let s=new Ui(e,t,a),i=a;if(he(s,"alpha","float",Xs(i.alpha,r)),he(s,"mode","int",i.mode??0),he(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),he(s,"alphaOverride","float",Xs(i.alphaOverride,r)),a.visible)if(i.category==="lambert")he(s,"emissive","color",r.color(i.emissive)??$t(0)),he(s,"occlusion","bool",i.occlusion??!0);else if(i.category==="toon")he(s,"shininess","float",i.shininess??30),he(s,"specular","color",r.color(i.specular)??$t(1118481));else if(i.category==="physical"){he(s,"roughness","float",i.roughness??.3),he(s,"metalness","float",i.metalness??0),he(s,"reflectivity","float",i.reflectivity??.5),he(s,"occlusion","bool",i.occlusion??!0),he(s,"normalScale","float",i.normalScale??1),he(s,"aoMapIntensity","float",i.aoMapIntensity??1),he(s,"emissive","color",i.emissive!==void 0?r.color(i.emissive)??$t(0):$t(0)),he(s,"emissiveIntensity","float",i.emissiveIntensity??1);let n=i;n.clearcoat!==void 0&&(he(s,"clearcoat","float",n.clearcoat),he(s,"clearcoatRoughness","float",n.clearcoatRoughness??.1)),n.sheen!==void 0&&(he(s,"sheen","float",n.sheen),he(s,"sheenColor","color",n.sheenColor!==void 0?r.color(n.sheenColor)??$t(16777215):$t(16777215)),he(s,"sheenRoughness","float",n.sheenRoughness??.5)),n.ior!==void 0&&(he(s,"ior","float",n.ior),he(s,"specularIntensity","float",n.specularIntensity??1),he(s,"specularColor","color",n.specularColor!==void 0?r.color(n.specularColor)??$t(16777215):$t(16777215))),n.iridescence!==void 0&&(he(s,"iridescence","float",n.iridescence),he(s,"iridescenceIOR","float",n.iridescenceIOR??1.3),he(s,"iridescenceThickness","float",n.iridescenceThickness??400))}else he(s,"shininess","float",i.shininess??30),he(s,"specular","color",i.specular!==void 0?r.color(i.specular)??$t(1118481):$t(1118481)),he(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),Zs(s,r),s}function ch(e,t,a,r){let s=new Qi("fragment",e,t,a),i=a.type==="texture"?a.texture.image!=null?r.uiBuffer(a.texture.image)??r.image(a.texture.image):r.getImage(""):a.type==="video"?r.video(a.texture.video):a.texture.image!=null?r.image(a.texture.image):r.getImage("");s.holders.push(i);let n=a.texture.wrapping??(a.type==="texture"?1e3:1001),l=(function(u,d,m,h){let f=re(u.getTexture(d,m,h));
5return f.onRenderUpdate(()=>u.getTexture(d,m,h)),f})(i,n,a.texture.minFilter??1008,a.texture.magFilter??1006);s.params.set("texture",l);let o=Ua(a.texture.rotation??0,r)??0;if(a.type==="matcap")he(s,"rotation","float",o*Zl.DEG2RAD);else{let u=L(new ve(1,1));u.onRenderUpdate(()=>{let _=i.getTexture(n,a.texture.minFilter??1008,a.texture.magFilter??1006).image;u.value.set(_?.width??1,_?.height??1)}),s.params.set("textureSize",u),s.uniformKinds.set("textureSize","vec2");let d=L(i.loaded||i.isBuffer?1:0);d.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",d),s.uniformKinds.set("loaded","float"),he(s,"crop","float",a.crop?1:0),he(s,"projection","int",a.projection??0),he(s,"axis","axis",a.axis),he(s,"projectionAxis","axis",a.projectionAxis),he(s,"side","int",a.side??0);let m=a.size?new ve(Ua(a.size[0],r)??0,Ua(a.size[1],r)??0):new ve(100,100);he(s,"size","vec2",m),he(s,"blending","float",a.blending??0);let h=new en,f=new lg([Ua(a.texture.repeat?.[0]??1,r)??1,Ua(a.texture.repeat?.[1]??1,r)??1],[Ua(a.texture.offset?.[0]??0,r)??0,Ua(a.texture.offset?.[1]??0,r)??0],o,h),p=L(h);rh(p),p.onObjectUpdate(_=>{let y=Bs(_,s).params.getNodeValue("mat");y!==void 0&&sh(p,y)}),s.params.set("mat",p,f)}return hh(s,{alpha:Xs(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),Zs(s,r),s}function og(e,t,a,r){if(a.type==="light")return mh(e,t,a,r);if(a.type==="texture"||a.type==="video"||a.type==="matcap")return ch(e,t,a,r);if(a.type==="displace")return(function(l,o,u,d){if(u.displacementType!=="noise")throw new Error;let m=new Qi("vertex",l,o,u),h=(f,p)=>Ua(f,d)??p;return he(m,"offset","vec3",new ne(...u.offset.map(f=>h(f,0)))),he(m,"scale","float",h(u.scale,10)),he(m,"intensity","float",h(u.intensity,8)),he(m,"movement","float",h(u.movement,1)),he(m,"noiseType","int",u.noiseType??0),he(m,"voronoiStyle","int",u.voronoiStyle??0),he(m,"smoothness","float",h(u.smoothness,.5)),he(m,"seed","float",h(u.seed,0)),he(m,"highCut","float",h(u.highCut,1)),he(m,"lowCut","float",h(u.lowCut,0)),he(m,"quality","int",Ua(u.quality,d)??1),Zs(m,d),m})(e,t,a,r);let s=new Qi("fragment",e,t,a),i=Hh(a,r),n=Su[a.type]??Su.color;for(let[l,o]of Object.entries(n))he(s,l,o.kind,i[l]??o.def());if(a.type==="transmission"){let l=typeof window<"u"?window.innerWidth:1,o=typeof window<"u"?window.innerHeight:1;he(s,"aspectRatio","vec2",l>=o?new ve(o/l,1):new ve(1,l/o))}return hh(s,i),Zs(s,r),s}var ug={displace_noise:[{nums:["intensity","scale","movement","smoothness","seed","highCut","lowCut"],vecs:["offset"]}],displace_map:[{nums:["intensity"],vecs:[]}],depth:[{nums:["near","far"],vecs:["origin","direction"]}],cavity:[{nums:["ridge","valley"],vecs:[]}],fresnel:[{nums:["bias","scale","intensity","factor"],vecs:[]}],dust:[{nums:["coverage","softness","noiseStrength","noiseScale"],vecs:[]}],rainbow:[{nums:["filmThickness","movement","noiseStrength","noiseScale"],vecs:["offset","wavelengths"]}],noise:[{nums:["scale","move","seed","highCut","lowCut","smoothness"],vecs:["size","distortion","fA","fB"]}],pattern:[{nums:["blending","size","variation","smoothness","zigzag","rotation"],vecs:["offset","frequency","vertical","horizontal"]}],outline:[{nums:["outlineWidth","contourWidth","outlineThreshold","contourThreshold","outlineSmoothing","contourFrequency"],vecs:["contourDirection"]}],toon:[{nums:["noiseStrength","noiseScale"],vecs:["offset","source"]}],transmission:[{nums:["roughness","thickness","ior"],vecs:[]}],reflection:[{nums:["blur","thickness","steps","stepSize"],vecs:[]}],texture:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],video:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],gradient:[{nums:["angle"],vecs:["offset","morph"]}],matcap:[{nums:["rotation"],vecs:[],path:["texture"]}]},es=class extends ke{constructor(e,t,a=!0,r,s=!1){super(),this.allowVariableSaves=a,this.isTSLNodeMaterial=!0,this.layerIdGen=0,this.layers=[],this.flavors=[],this.depthTwins=[],this.depthPrepass=!1,this.depthPrepassCutoff=0,this.depthPrepassTwins=[],this.flatShading=!1,this.wireframe=!1,this.emissiveNode=null,this.shapeBlendOptions=null,this.envMapRotation=Ga.rotation,this._shapeBlendResources=null,this._shapeBlendColorNode=null,this.shapeBlendObjectNormal=null,this.displacedObjectNormal=null,this.syntheticMapLayers=new Map,this._structuralKey=null,this._structuralKeyVersion=-1,this.forceRainbowNoise=new Set,this.root=r??this,this.isDepthPrepassTwin=s,this.fog=!0,this.dithering=!0,this.vertexColors=!1,this.transparent=!0,r?(this.lastContext=r.lastContext,this.syncFromRoot()):this.reset0(e,t),(function(i){Wi.add(i)})(this),this.addEventListener("dispose",()=>(function(i){Wi.delete(i)})(this))}_invalidateStructuralKey(){this._structuralKey=null,this._structuralKeyVersion=-1}customProgramCacheKey(){let e=this._structuralKey;if(e===null||this._structuralKeyVersion!==this.version){try{e=(function(r){let s=r.lightLayer,i=s.data,n=u=>{if(!u)return-1;if(typeof u!="string"){let h=r.syntheticMapLayers?.get(u);return h!==void 0?`img(${vu(h)};o=${JSON.stringify(u.offset??null)};r=${JSON.stringify(u.repeat??null)})`:"img"}let d=r.layers.findIndex(h=>h.uuid===u);if(d===-1||r.layers[d].kind!=="fragment")return-1;let m=r.layers[d].type;return m==="texture"||m==="video"?d:-1},l=r.category==="physical",o=["spe-tsl-v1",`lights=${r.lights}`,`cat=${r.category}`,`lvis=${i.visible===!0}`,`lidx=${r.layers.indexOf(s)}`,`bump=${n(i.bumpMap)}`,`rough=${l?n(i.roughnessMap):-1}`,`metal=${l?n(i.metalnessMap):-1}`,`nrm=${l?n(i.normalMap):-1}`,`ao=${l?n(i.aoMap):-1}`,`emis=${l?n(i.emissiveMap):-1}`,`rch=${l?i.roughnessMapChannel??"luminance":""}`,`mch=${l?i.metalnessMapChannel??"b":""}`,`ach=${l?i.aoMapChannel??"r":""}`];
5for(let u of r.layers)o.push(vu(u));return o.join("|")})(this),this.shapeBlendOptions!==null&&(e+=`|sb:${this.uuid}:${this._shapeBlendResources!==null?1:0}`)}catch{e=super.customProgramCacheKey()}this._structuralKey=e,this._structuralKeyVersion=this.version}let t=this.envNode instanceof Qs?Ga.version:0,a=this.physicalLobes();return`${e}|env${t}|lobes${(a.clearcoat?1:0)|(a.sheen?2:0)|(a.iridescence?4:0)}`}get isRoot(){return this.root===this}applyDepthPrepassPolicy(){if(this.isDepthPrepassTwin)return this.depthPrepass=!1,this.colorWrite=!1,void(this.depthWrite=!0);let e=Oh({transparent:this.transparent,depthTest:this.depthTest,wireframe:this.wireframe,shapeBlend:this.shapeBlendOptions!==null,data:this.root.data});this.depthPrepass=e,this.depthWrite=!e}getDepthPrepassTwin(e){let t=this.depthPrepassTwins[e];if(t===void 0){let a=this.root;t=new es(a.data,a.lastContext,a.allowVariableSaves,a,!0),t.flatShading=this.flatShading,t.side=e,t.wireframe=!1,t.depthPrepassCutoff=kc,t.applyDepthPrepassPolicy(),this.depthPrepassTwins[e]=t,a.depthTwins.push(t)}return t}get vertexObjectNormal(){return this.shapeBlendObjectNormal??this.root.displacedObjectNormal}get category(){return this.lightLayer.category}envReflectiveInLow(){let e=!1;for(let t of this.layers){let a=t.data;if(a?.category==="physical"&&(e=!0,a.roughnessMap!==void 0||a.metalnessMap!==void 0||typeof a.roughness!="number"||typeof a.metalness!="number"||a.clearcoat!==void 0||a.sheen!==void 0||a.iridescence!==void 0||a.ior!==void 0||a.metalness>.3||a.roughness<.4))return!0}return!e}get hasAO(){return this.lightLayer.getValue("occlusion")??!1}get fragment(){}reset(e,t,a=!1){(this.data!==e||a)&&this.reset0(e,t)}reset0(e,t){this.lastContext=t,this.data=e;let a=e.layers??Ac.defaultTwoLayerData("phong").layers;for(let i of this.layers)i.dispose();for(let i of this.syntheticMapLayers.values())i.dispose();this.syntheticMapLayers.clear();let r=[];for(let i of a)try{let n=og(this.layerIdGen++,i.id,i.data,t.shared);n.type==="rainbow"&&this.armRainbowNoiseSpecialization(n),r.push(n)}catch(n){console.warn(`[spe] material layer '${i.data.type}' (${i.id}) failed to build â skipping this layer`,n)}this.layers=r,this.layers.reverse();for(let i=0;i<this.layers.length;i++)this.layers[i].structIndex=i;this.name=e.name??"Untitled Material";let s=this.layers.find(i=>i instanceof Ui);if(s===void 0&&(s=mh(0,"",{...fo.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:c(0).toVar("accumAlpha"),lightsAvailable:this.lights&&(this.category==="phong"||this.category==="lambert"||this.category==="physical")},this.colorNode=U(()=>this.buildColorStack())(),this.buildVertexStack(),this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=this.lights&&this.category==="lambert"&&this.lightLayer.params.has("emissive")?this.lightLayer.params.get("emissive"):null,this.aoNode=null,this.lights&&this.category==="physical"){let i=this.lightLayer.params,n=this.lightLayer.lightData;if(i.has("emissive")){let o=this.findTextureMapLayer(n.emissiveMap);this.emissiveNode=U(()=>{let u=w(i.getColor("emissive")).mul(i.getFloat("emissiveIntensity"));return o!==null&&(u=u.mul((function(d){let m,h=d.get("texture"),f=d.has("loaded")?d.getFloat("loaded"):c(1),{uvs:p,weights:_}=Os(d);if(_!==null){let y=w(h.sample(p[0]).rgb).toVar(),g=w(h.sample(p[1]).rgb).toVar(),x=w(h.sample(p[2]).rgb).toVar();m=y.mul(_.z).add(g.mul(_.x)).add(x.mul(_.y))}else m=w(h.sample(p[0]).rgb);return X(w(0),m,f)})(o.params))),u})()}let l=this.findTextureMapLayer(n.aoMap);l!==null&&(this.aoNode=U(()=>X(c(1),Wn(l.params,n.aoMapChannel??"r"),i.getFloat("aoMapIntensity")))())}this.transparent=ni(e,t.shared),this.applyDepthPrepassPolicy(),Is(this),this.needsUpdate=!0;for(let i of this.flavors)i?.syncFromRoot();for(let i of this.depthTwins)i.syncFromRoot();this.saveVariableLocations(t)}
5setTransparent(e,t){if(!this.isRoot)return void this.root.setTransparent(e,t);let a=this.transparent!==e;if(a){this.transparent=e,this.needsUpdate=!0;for(let r of this.flavors)r!==void 0&&(r.transparent=e,r.needsUpdate=!0);for(let r of this.depthTwins)r.transparent=e,r.needsUpdate=!0}this.applyDepthPrepassPolicy();for(let r of this.flavors)r?.applyDepthPrepassPolicy();!a||t?.markNeedsUpdateRendererDirty()}syncFromRoot(){let e=this.root;this.data=e.data,this.layers=e.layers,this.lightLayer=e.lightLayer,this.ctx=e.ctx,this.name=e.name,this.lights=e.lights,this.colorNode=e.colorNode,this.positionNode=e.positionNode,this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=e.emissiveNode,this.aoNode=e.aoNode,this.transparent=e.transparent,this.applyDepthPrepassPolicy(),this._applyShapeBlendGraph(),Is(this),this.needsUpdate=!0}getFlavor(e,t,a,r){if(!this.isRoot)return this.root.getFlavor(e,t,a,r);let s=a?6:(e?3:0)+t;if(s+=7*((r?.resolutionLevel??0)-(r?.useChildrenColors?4:0)),s===0)return this;s-=1;let i=this.flavors[s];return i===void 0&&(i=new es(this.data,this.lastContext,this.allowVariableSaves,this),i.flatShading=e,i.side=t,i.wireframe=a,r&&(i.shapeBlendOptions={...r},i.defines={SHAPEBLEND:r.resolutionLevel,SHAPEBLEND_C:r.useChildrenColors?1:0},i._invalidateStructuralKey()),i.applyDepthPrepassPolicy(),this.flavors[s]=i),i}getShapeBlendBaseColor(){let e=this.layers.find(r=>r.kind==="fragment"&&r.type==="color"),t=e?.getValue("color"),a=e?.getValue("alpha");return{r:t?.r??1,g:t?.g??1,b:t?.b??1,a:a??1}}setShapeBlendResources(e){this._shapeBlendResources=e,this._applyShapeBlendGraph()}_applyShapeBlendGraph(){if(!this.shapeBlendOptions||!this._shapeBlendResources)return;let e=Kh();if(e===null)return;let t=e(this._shapeBlendResources);this.positionNode=t.position,this.shapeBlendObjectNormal=t.normal,this.normalNode=this.buildNormalNode(io(il(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=U(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof Ui)}findTextureMapLayer(e){if(!e)return null;if(typeof e!="string")return Pc.is(e)?this.syntheticMapLayer(e):null;let t=this.layers.find(a=>a.uuid===e);return t===void 0||t.kind!=="fragment"?null:t.type==="texture"||t.type==="video"?t:null}syntheticMapLayer(e){if(!this.isRoot)return this.root.syntheticMapLayer(e);let t=this.syntheticMapLayers.get(e);if(t!==void 0)return t;try{let a=fo.defaultData("texture"),r={...a,visible:!1,texture:{...a.texture,image:e.image,wrapping:e.wrapping??1e3,offset:e.offset??[0,0],repeat:e.repeat??[1,1],minFilter:e.minFilter??1008,magFilter:e.magFilter??1006}},s=ch(this.layerIdGen++,`mapImage${this.layerIdGen}`,r,this.lastContext.shared);return this.syntheticMapLayers.set(e,s),s}catch(a){return console.warn("[spe] light-layer map image failed to build â skipped",a),null}}buildNormalNode(e){if(this.lights&&this.category==="physical"&&!this.wireframe){let s=this.lightLayer.lightData,i=this.findTextureMapLayer(s.normalMap);if(i!==null){let n=this.lightLayer.params.getFloat("normalScale");return U(()=>(function(l,o,u){let d=w(u??na).toVar(),m=cr,h=l.get("texture"),f=l.has("loaded")?l.getFloat("loaded"):c(1),p=g=>{let x=A(g).toVar(),v=w(h.sample(x).rgb.mul(2).sub(1)).toVar(),V=w(X(w(0,0,1),v,f)).toVar();V.xy.mulAssign(o);let T=w(js(m)).toVar(),z=w($s(m)).toVar(),b=A(js(x)).toVar(),M=A($s(x)).toVar(),S=w(ae(d)).toVar(),C=w(_t(z,S)).toVar(),R=w(_t(S,T)).toVar(),k=w(C.mul(b.x).add(R.mul(M.x))).toVar(),E=w(C.mul(b.y).add(R.mul(M.y))).toVar(),I=c(Q(q(k,k),q(E,E))).toVar(),D=c(Se(I.equal(0),c(0),$l.mul(hd(I)))).toVar();return ae(k.mul(V.x.mul(D)).add(E.mul(V.y.mul(D))).add(S.mul(V.z)))},{uvs:_,weights:y}=Os(l);if(y!==null){let g=p(_[0]),x=p(_[1]),v=p(_[2]);return ae(g.mul(y.z).add(x.mul(y.x)).add(v.mul(y.y)))}return p(_[0])})(i.params,n,e))()}}let t=this.findTextureMapLayer(this.lightLayer.lightData.bumpMap),a=this.lights&&this.category!=="lambert";if(t===null||!a||this.wireframe)return e;let r=this.lightLayer.params.getFloat("bumpMapIntensity");return U(()=>(function(s,i,n){let l=w(n??na).toVar(),o=cr,u=s.get("texture"),{uvs:d,weights:m}=Os(s);if(m!==null){let h=fi(o,l,pi(u,d[0],i)),f=fi(o,l,pi(u,d[1],i)),p=fi(o,l,pi(u,d[2],i));return ae(h.mul(m.z).add(f.mul(m.x)).add(p.mul(m.y)))}return fi(o,l,pi(u,d[0],i))})(t.params,r,e))()}buildVertexStack(){let e=this.layers.filter(a=>a.kind==="vertex");if(e.length===0)return this.positionNode=null,void(this.displacedObjectNormal=null);let t=(function(a){let r=mt("vec3","vDisplacedNormal");return{position:U(s=>{let i=Ws,n=sd;for(let o=0;o<a.length;o++){let u=Pf(a[o],pu(Ws),n);i=o===0?u.position:pu(i.add(u.position).mul(.5)),n=u.normal}let l=w(i).toVar();return r.assign(n),s.needsPreviousData?.()===!0&&ql.assign(l),l})(),normal:r}})(e.map(a=>a.params));this.positionNode=t.position,this.displacedObjectNormal=t.normal}displacedNormalView(){let e=this.root.displacedObjectNormal;return e===null?null:io(il(e))}maskSourceFor(e){let t=this.layers[e];if(t.kind==="fragment"&&t.isMaskEnabled)return null;let a=this.layers[e+1];return a!==void 0&&a.kind==="fragment"&&a.isMaskEnabled&&a.data.visible?a:null}runLayerBuilder(e,t,a){let r=c(1);t!==null&&(r=this.evaluateMask(t));let s={alpha:a?.alpha??e.alphaNode,isMask:e.isMaskNode,mask:r,mode:e.modeNode,n
5oiseCompiledIn:e.noiseCompiledIn},i=rf(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return Wl(t.color.mul(t.calpha))}buildColorStack(){let e=this.lightLayerIndex(),t=e===-1?0:e,a=null;for(let r=0;r<t;r++){let s=this.layers[r];if(s.kind!=="fragment")continue;if(a===null){let n=this._shapeBlendColorNode;a=bu(this.runLayerBuilder(s,this.maskSourceFor(r),n?{color:bu(n.rgb),alpha:ig(n.w)}:void 0).color);continue}if(s.isMaskEnabled)continue;let i=this.runLayerBuilder(s,this.maskSourceFor(r));a=qn(a,i.color,i.calpha,s.modeNode)}return a??tm(yd)}setup(e){e.context.setupClearcoatNormal=()=>am(na,"NORMAL","vec3"),super.setup(e)}setupLightingModel(){let e=this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null;return(function(t,a=null,r=null,s=!1){switch(t){case"physical":{let i=new of(r?.clearcoat===!0,r?.sheen===!0,r?.iridescence===!0,!1,!1,!1);return i.envIrradianceActive=s,i}case"lambert":return new nl(!1);case"toon":{let i=new lf;return i.aoOcclusionGate=a,i}default:return new nl}})(this.category,e,this.physicalLobes(),this.envNode instanceof Qs)}physicalLobes(){let e=this.lightLayer.params;return{clearcoat:e.has("clearcoat"),sheen:e.has("sheen"),iridescence:e.has("iridescence")}}setupVariants(e){if(!this.lights)return;let t=null,a=null;if(this.category==="physical"){let r=this.lightLayer.lightData,s=this.findTextureMapLayer(r.roughnessMap);s!==null&&(t=U(()=>Wn(s.params,r.roughnessMapChannel??"luminance"))());let i=this.findTextureMapLayer(r.metalnessMap);i!==null&&(a=U(()=>Wn(i.params,r.metalnessMapChannel??"b"))())}(function(r,s,i=null,n=null){if(r==="phong"||r==="toon")ll.assign(s.getFloat("shininess").max(1e-4)),Es.assign(s.getColor("specular"));else if(r==="physical"){let l=s.getFloat("metalness"),o=s.getFloat("roughness"),u=s.getFloat("reflectivity");if(i!==null&&(o=i.mul(o)),n!==null&&(l=ie(n.mul(l),c(0),c(1))),rm.assign(l),id.assign(ie(o,c(.0525),c(1))),s.has("ior")){let d=s.getFloat("ior"),m=s.has("specularColor")?w(s.getColor("specularColor")):w(1),h=s.has("specularIntensity")?s.getFloat("specularIntensity"):c(1);cn.assign(d),Es.assign(xe(sm(cn.sub(1).div(cn.add(1))).mul(m),w(1)).mul(h)),uu.assign(X(Es,Ta.rgb,l)),no.assign(X(h,c(1),l))}else{let d=w(u.pow(2).mul(.16));Es.assign(d),uu.assign(X(d,Ta.rgb,l)),no.assign(c(1))}if(ih.assign(Ta.rgb.mul(dt(l))),s.has("clearcoat")&&(im.assign(s.getFloat("clearcoat")),nd.assign(ie(s.getFloat("clearcoatRoughness"),c(.0525),c(1)))),s.has("sheen")){let d=s.has("sheenColor")?w(s.getColor("sheenColor")):w(1);nm.assign(d.mul(s.getFloat("sheen"))),lm.assign(ie(s.getFloat("sheenRoughness"),c(.07),c(1)))}s.has("iridescence")&&(om.assign(s.getFloat("iridescence")),um.assign(s.getFloat("iridescenceIOR")),dm.assign(s.getFloat("iridescenceThickness")))}})(this.category,this.lightLayer.params,t,a)}setupLighting(e){let t=this.lights===!0||this.lightsNode!==null,a=this.lights===!0?this.setupMaterialLightings(e):[],r=t?this.lightsNode??e.lightsNode:null,s=this.lights===!0?w(0):Ta.rgb,i=w(0),n=w(0);if(r&&(a.length>0||r.getScope().hasLights)){let l=this.setupLightingModel()||null,o=hm(r,l,a,this.backdropNode,this.backdropAlphaNode),u=o,d=u._value??(u._value=u.getContext());i=d.reflectedLight.directSpecular,n=d.reflectedLight.indirectSpecular,s=o}return this.emissiveNode!==null&&this.emissiveNode!==void 0&&(lo.assign(w(this.emissiveNode)),s=s.add(lo)),U(()=>this.applyPostLighting(s,i,n))()}applyPostLighting(e,t,a){let r,s=this.ctx.accumAlpha,i=this.lights===!0,n=this.lightLayerIndex(),l=n===-1?0:n+1,o=c(1);if(i){let f=n===-1?null:this.maskSourceFor(n);f!==null&&(o=this.evaluateMask(f)),r=(function(p){let{outgoing:_,directSpecular:y,indirectSpecular:g,shadingAlpha:x,shadingBlend:v,mask:V,occlusion:T=null,ctx:z}=p,b=w(_).toVar();return B(ld(od(b,Ta.rgb)),()=>{let M=ie(we(y.add(g)),c(0),c(1));z.accumAlpha.addAssign(dt(z.accumAlpha).mul(x).mul(V).mul(M)),b.assign(qn(Ta.rgb,b,x.mul(V),v)),b.mulAssign(nh(T))}),b}
5)({outgoing:e,directSpecular:t,indirectSpecular:a,shadingAlpha:this.lightLayer.alphaNode,shadingBlend:this.lightLayer.modeNode,mask:o,occlusion:this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null,ctx:this.ctx})}else r=w(e).toVar();let u=r,d=!1;for(let f=l;f<this.layers.length;f++){let p=this.layers[f];if(p.kind!=="fragment"||p.isMaskEnabled)continue;let _=this.runLayerBuilder(p,this.maskSourceFor(f));u=qn(u,_.color,_.calpha,p.modeNode),d=!0}if(d&&r.assign(u),!i){let f=n===-1?null:this.maskSourceFor(n);f!==null&&(o=this.evaluateMask(f))}let m=this.lightLayer.params.has("alphaOverride")?this.lightLayer.params.getFloat("alphaOverride"):c(1),h=i?s:s.mul(o);if(Ta.a.assign(h.mul(m)),Ta.a.lessThanEqual(mm("depthPrepassCutoff","float")).discard(),this.dithering){let f=ud(da.xy),p=w(.25/255,-.25/255,.25/255),_=X(p.mul(2),p.mul(-2),f);r.assign(r.add(_))}return r}getLayersOfType(e){return this.layers.filter(t=>t.type===e)}getLayerByUuid(e){return this.layers.find(t=>t.uuid===e)}armRainbowNoiseSpecialization(e){let t=this.root.forceRainbowNoise.has(e.uuid),a=e.data;if(e.noiseForced=t,e.noiseCompiledIn=t||wn(a.noiseStrength),e.noiseCompiledIn===!1){let r=e.uuid;e.onNoiseMismatch=s=>this.root.ensureRainbowNoiseCompiled(r,s)}}ensureRainbowNoiseCompiled(e,t){if(!this.isRoot)return this.root.ensureRainbowNoiseCompiled(e,t);let a=this.data.layers?.data(e);return a!==void 0&&a.type==="rainbow"&&(!this.forceRainbowNoise.has(e)&&!wn(a.noiseStrength)||this.getLayerByUuid(e)?.noiseCompiledIn===!1)&&(this.forceRainbowNoise.add(e),this.reset0(this.data,this.lastContext),t!==void 0&&this.getLayerByUuid(e)?.setValue("noiseStrength",t),!0)}updateByOp(e,t,a){if(this.isRoot)if(t!==void 0?this.data=t:t=this.data,this.setTransparent
5(ni(t,a.shared),a.scene),e.path[0]==="layers"){let r=e.path[1];if(r===void 0)return a.scene.markNeedsUpdateRendererDirty(),void this.reset0(t,a);e.type===0&&e.props.occlusion!==void 0&&a.scene.markNeedsUpdateRendererDirty();let s=this.layers.find(n=>n.uuid===r);if(!s)return;let i=t.layers.data(r);if(!i)return;this.updateLayerByOp(s,{...e,path:e.path.slice(2)},i,a)?this.reset0(t,a):Is(this)}else this.reset0(t,a);else this.root.updateByOp(e,t,a)}static hasVariableString(e){return typeof e=="string"||Array.isArray(e)&&e.some(t=>typeof t=="string")}updateLayerTextureByOp(e,t,a){if(t.path.length!==1||t.type!==0)return!0;let r=t.props,s=a.texture;if(!s)return!0;let i=e.data.texture;for(let l of Object.keys(r))if(l!=="repeat"&&l!=="offset"&&l!=="rotation"||es.hasVariableString(s[l])||es.hasVariableString(i?.[l]))return!0;if(e.type==="matcap")return"repeat"in r||"offset"in r||(e.data=a,e.setValue("rotation",(s.rotation??0)*Zl.DEG2RAD),!1);let n=e.getValue("mat");if(!n)return!0;if(e.data=a,"repeat"in r){let l=s.repeat;n.repeat=[l?.[0]??1,l?.[1]??1]}if("offset"in r){let l=s.offset;n.offset=[l?.[0]??0,l?.[1]??0]}return"rotation"in r&&(n.rotation=s.rotation??0),n.updateMatrix(),!1}updateLayerByOp(e,t,a,r){if(t.path[0]==="texture")return this.updateLayerTextureByOp(e,t,a);if(t.path[0]!==void 0||t.type!==0)return!0;let s=t.props;if("type"in s||"category"in s||"visible"in s||"noiseType"in s)return r.scene.markNeedsUpdateRendererDirty(),!0;for(let i of Object.keys(s)){if(i==="isMask")return!0;if(e.type==="rainbow"&&i==="noiseStrength"&&e.noiseCompiledIn!==void 0){let d=a[i];if((e.noiseForced===!0||wn(d))!==e.noiseCompiledIn)return!0}let n=xd[e.type];if(n!==void 0&&n.includes(i))return!0;let l=Ec[e.type];if(l!==void 0&&l.includes(i)){let d=e.getValue(i),m=s[i];if(Array.isArray(d)&&Array.isArray(m)&&d.length!==m.length)return!0}let o=a[i],u=e.data[i];if(i!=="axis"&&(typeof o=="string"||typeof u=="string")||Array.isArray(o)&&o.some(d=>typeof d=="string")||Array.isArray(u)&&u.some(d=>typeof d=="string"))return!0}e.data=a;for(let i of Object.keys(s))this.applyLayerValue(e,i,a,r.shared);return!1}applyLayerValue(e,t,a,r){let s=a;if((t==="alpha"||t==="visible"||t==="intensity")&&(Zs(e,r),t!=="intensity"||e.type==="displace"))return;if(t==="alphaOverride"&&e instanceof Ui)return void e.setValue("alphaOverride",Xs(s[t],r));if(!e.hasValue(t))return;let i=e.uniformKinds.get(t),n=s[t];switch(i){case"color":case"colorVec4":{let l=e.getValue(t),o=typeof n=="string"?r.color(n):Fl(n,()=>l??new Sa(1,1,1,1));l&&o&&l.setRGBA(o.r,o.g,o.b,"a"in o?o.a:1);break}case"vec2":{let l=e.getValue(t);l&&Array.isArray(n)&&l.set(Number(n[0]??l.x),Number(n[1]??l.y));break}case"vec3":{let l=e.getValue(t);l&&Array.isArray(n)&&l.set(Number(n[0]??l.x),Number(n[1]??l.y),Number(n[2]??l.z));break}case"vec4array":{let l=e.getValue(t);if(l&&Array.isArray(n))for(let o=0;o<Math.min(l.length,n.length);o++){let u=n[o];l[o].set(u[0],u[1],u[2],u[3])}break}case"floatArray":{let l=e.getValue(t);if(l&&Array.isArray(n))for(let o=0;o<Math.min(l.length,n.length);o++)l[o]=Number(n[o]);break}case"axis":e.setValue(t,["x","y","z"].indexOf(String(n)));break;case"bool":e.setValue(t,!!n);break;default:(typeof n=="number"||typeof n=="boolean")&&e.setValue(t,n)}}onVariableUpdate(e,t,a){if(e[0]==="alphaOverride")return this.setTransparent
5(ni(this.data,a.shared),a.scene),void this.lightLayer.setValue("alphaOverride",Math.max(0,Math.min(Number(t)/100,1)));if(e[0]!=="layer")return;let r=e[1],s=e[2];if(!r||!s)return;let i=this.layers.find(o=>o.uuid===r);if(!i?.hasValue(s))return;if(s==="alpha")return this.setTransparent(ni(this.data,a.shared),a.scene),void i.setValue(s,Math.max(0,Math.min(Number(t)/100,1)));let n=i.getValue(s),l=e[3];(l==="x"||l==="y"||l==="z")&&n?.isVector3||(l==="x"||l==="y")&&n?.isVector2?n[l]=Number(t):n instanceof Lt||i.setValue(s,t)}saveVariableLocations(e){if(!this.allowVariableSaves)return;let t=this.data.layers?.find(a=>a.data.type==="light");t&&e.shared.getVariable(t.data.alphaOverride,["material",this.uuid,"alphaOverride"]),this.data.layers?.forEach(a=>{let r=a.data;"alpha"in r&&typeof r.alpha=="string"&&e.shared.getVariable(r.alpha,["material",this.uuid,"layer",a.id,"alpha"]);let s=a.data.type==="displace"?r.displacementType==="noise"?"displace_noise":"displace_map":a.data.type,i=ug[s];if(i)for(let n of i){let l=r;for(let o of n.path??[])o in l&&(l=l[o]);for(let o of n.nums)o in l&&e.shared.getVariable(l[o],["material",this.uuid,"layer",a.id,...n.path??[],o]);for(let o of n.vecs)o in l&&l[o].forEach((u,d)=>{e.shared.getVariable(u,["material",this.uuid,"layer",a.id,...n.path??[],o,d===0?"x":d===1?"y":"z"])})}})}clampUniformsForPreview(e,t){let a=(r,s,i)=>Math.min(Math.max(r,s),i);for(let r of this.layers)if(r.type==="displace"){let s=r.uniforms[`f${r.id}_intensity`];s.value=a(s.value,e,t)}}updateFrame(){}assetsLoaded(){if(!this.layers.every(e=>e.assetsLoaded))return!1;for(let e of this.root.syntheticMapLayers.values())if(!e.assetsLoaded)return!1;return!0}nodeMaterialDispose(){if(this.isRoot){for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear()}this.dispose();for(let e of this.flavors)e?.dispose();for(let e of this.depthTwins)e.dispose()}},dg=class extends es{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function Pa(e,t){let a=e.xyz;return t.add(_t(a,_t(a,t).add(t.mul(e.w))).mul(2))}function jr(e){let t=rs(e),a=rs(w(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=rs(w(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return w(t,a,r)}var hg=U(e=>{let t=e.p.add(e.seed).toVar(),a=w(.1,0,0),r=w(0,.1,0),s=w(0,0,.1),i=jr(t.sub(a)).toVar(),n=jr(t.add(a)).toVar(),l=jr(t.sub(r)).toVar(),o=jr(t.add(r)).toVar(),u=jr(t.sub(s)).toVar(),d=jr(t.add(s)).toVar(),m=o.z.sub(l.z).sub(d.y).add(u.y),h=d.x.sub(u.x).sub(n.z).add(i.z),f=n.y.sub(i.y).sub(o.x).add(l.x);return ae(w(m,h,f).mul(5))});function Mu(e,t){return hg({p:e,seed:t})}function Cu(e,t,a){return w(Di(e.add(w(a)).mul(t)),Di(e.add(w(a.add(20))).mul(t)),Di(e.add(w(a.sub(30))).mul(t)))}function $n(e){return{f:(t,a=0)=>e.node(t)??e.getUniform(t,a),v3:t=>e.node(t)??e.getUniform(t,null),v4:t=>e.node(t)??e.getUniform(t,null),tex:t=>e.node(t)??e.getTexture(t,null)}}function mg(e,t){switch(e){case"position":return(function(a){let r=$n(a.registry);return U(()=>{let s=Ie(),i=a.depTexture("uCurrentPosition"),n=a.depTexture("uCurrentVelocity"),l=a.depTexture("uCurrentEmissionRate"),o=i.sample(s).toVar().xyz.toVar(),u=l.sample(s).toVar(),d=u.x.toVar(),m=u.y.toVar(),h=u.z.toVar(),f=r.tex("uOriginalPosition").sample(s).xyz.mul(r.v3("uEmitterSize")).toVar(),p=n.sample(s).toVar(),_=p.xyz.toVar(),y=p.w.toVar(),g=r.f("uMaxLifeTime",1),x=Ne(.5,y),v=c(3).mul(x),V=_.mul(c(1).add(v)),T=_.mul(xe(r.f("uFPSRatio",1),c(5)));o.addAssign(X(T,V,x));let z=Pa(r.v4("uWorldQuaternion"),f).add(r.v3("uWorldOffset"));o.assign(X(o,z,d)),h.assign(X(h,r.f("uTime"),d));let b=Q(g.sub(r.f("uTime").sub(h)),c(0)).div(g);return X(P(0),P(o,b),m)})()})(t);case"velocity":return(function(a){let r=$n(a.registry),s=a.features;return U(()=>{let i=Ie(),n=a.depTexture("uCurrentPosition"),l=a.depTexture("uCurrentVelocity"),o=a.depTexture("uCurrentEmissionRate"),u=n.sample(i).xyz.toVar(),d=r.tex("uOriginalPosition").sample(i).xyz.toVar(),m=r.tex("uDirections").sample(i).xyz.toVar(),h=l.sample(i).xyz.toVar(),f=o.sample(i).toVar(),p=f.x.toVar(),_=f.y.toVar(),y=l.sample(i).w.toVar(),g=c(1).sub(r.f("uRandomMassF
5actor").mul((function(b){return b.dot(A(12.9898,78.233)).sin().mul(43758.5453).fract()})((function(b){return b.xy})(d)).mul(.5).add(.5))).toVar(),x=r.f("uSpeed",1),v=r.f("uNoiseStrength"),V=r.f("uNoiseScale"),T=r.f("uNoiseSeed");B(_.equal(1),()=>{s.USE_CURL_NOISE&&(B(V.greaterThan(0),()=>{h.assign(Mu(u.mul(V).mul(.002),T).mul(v.add(1)).mul(.05).mul(x))}),B(v.greaterThan(0).and(V.equal(0)),()=>{h.addAssign(Mu(u,T).mul(v).mul(.05).mul(x))})),s.USE_SIMPLEX_NOISE&&(B(V.greaterThan(0),()=>{h.assign(w(rs(u.mul(V).mul(.001)).mul(v.add(1)).mul(.1)).mul(x))}),B(v.greaterThan(0).and(V.equal(0)),()=>{h.addAssign(w(rs(u.mul(v).mul(.001)).mul(.05)).mul(x))})),s.USE_FBM_NOISE&&(B(V.greaterThan(0),()=>{h.assign(Cu(u.mul(V).mul(.001),v.add(1),T).mul(x))}),B(v.greaterThan(0).and(V.equal(0)),()=>{h.addAssign(Cu(u.mul(v).mul(.001),v.add(1),T).mul(.1).mul(x))})),(function(b,M,S,C,R){if(!b.features.USE_COLLIDER)return;let k=Q(M.f("uBounce").mul(2),c(.01)).toVar(),E=M.f("particleSize");if(b.features.USE_SPHERE_COLLIDER){let I=M.v3("uColliderSize"),D=Pa(M.v4("uColliderQuaternionInvert"),S.sub(M.v3("uColliderPos"))).toVar().div(I).toVar(),H=we(D).toVar();B(H.lessThanEqual(c(1).add(E.div(we(I)))).and(R.equal(0)),()=>{let K=D.mul(c(1).add(E.div(we(I)))),O=ae(K.div(I.mul(I)));O=Pa(M.v4("uColliderQuaternion"),O),C.assign(Gi(C,O).mul(k)),R.assign(1)}).Else(()=>{R.assign(0)})}if(b.features.USE_BOX_COLLIDER){let I=M.v3("uColliderSize").div(2),D=Pa(M.v4("uColliderQuaternionInvert"),S.sub(M.v3("uColliderPos"))).toVar(),H=de(D).sub(I).toVar(),K=Q(H.x,Q(H.y,H.z)).toVar();B(K.lessThanEqual(E.mul(.5)).and(R.equal(0)),()=>{let O=w(0).toVar();B(H.x.greaterThan(H.y).and(H.x.greaterThan(H.z)),()=>{O.assign(w(Xa(D.x),0,0))}).ElseIf(H.y.greaterThan(H.z),()=>{O.assign(w(0,Xa(D.y),0))}).Else(()=>{O.assign(w(0,0,Xa(D.z)))});let j=Pa(M.v4("uColliderQuaternion"),O);C.assign(Gi(C,j).mul(k)),R.assign(1)}).Else(()=>{R.assign(0)})}})(a,r,u,h,y),(function(b,M,S,C){if(!b.features.USE_ATTRACTOR)return;let R=M.f("uForceIntensity"),k=M.f("uForceDamping");if(b.features.USE_FORCE_LOCAL_SPACE){let E,I,D=M.f("particleSize");if(b.features.USE_SPHERE_COLLIDER){let H=M.v3("uColliderSize"),K=Pa(M.v4("uColliderQuaternionInvert"),S.sub(M.v3("uColliderPos")));E=we(K.div(H)).toVar(),I=c(1)}else{let H=M.v3("uColliderSize").div(2),K=Pa(M.v4("uColliderQuaternionInvert"),S.sub(M.v3("uColliderPos"))),O=de(K).sub(H);E=Q(O.x,Q(O.y,O.z)).toVar(),I=D}B(E.lessThanEqual(I),()=>{let H=b.features.USE_SPHERE_COLLIDER?c(1).sub(E).mul(R):Q(c(1).sub(I.div(E)),c(0)).mul(R),K=S.sub(M.v3("uColliderPos")),O=ae(K).mul(H);C.subAssign(O),C.mulAssign(k)})}else{let E=S.sub(M.v3("uColliderPos")),I=ae(E).mul(R);C.subAssign(I),C.mulAssign(k)}})(a,r,u,h),(function(b,M,S,C,R,k,E){if(!b.features.USE_VORTEX)return;let I=M.f("particleSize"),D=M.v3("uColliderSize").div(2),H=Pa(M.v4("uColliderQuaternionInvert"),S.sub(M.v3("uColliderPos"))).toVar(),K=de(H).sub(D).toVar(),O=Q(K.x,Q(K.y,K.z)).toVar();B(O.lessThanEqual(I),()=>{let j=M.f("uForceIntensity"),Z=M.v3("uColliderPos").add(Pa(M.v4("uColliderQuaternion"),w(0))).sub(S).toVar(),$=w(0,1,.01),me=ae(_t($,Pa(M.v4("uColliderQuaternion"),Z))).toVar(),ue=we(Z.mul(j).mul(3)).toVar();C.assign(me.mul(ue).mul(.005));let ce=Pa(M.v4("uWorldQuaternion"),R);C.addAssign(ce.mul(E).mul(c(1).sub(M.f("uForceDamping"))).div(k.mul(.5)))})})(a,r,u,h,m,g,x)});let z=s.USE_NORMALS?m:r.v3("uDirectionsAxis");return h.assign(X(h,Pa(r.v4("uWorldQuaternion"),z).mul(x),p)),h.addAssign(r.v3("uGravity").div(g.mul(.5)).mul(c(1).sub(y))),P(h,y)})()})(t);case"emissionRate":return(function(a){let r=$n(a.registry);return U(()=>{let s=Ie(),i=a.depTexture("uCurrentEmissionRate"),n=r.tex("uIndex").sample(s).x.toVar(),l=i.sample(s).toVar(),o=l.y.toVar(),u=l.z.toVar(),d=r.f("uLastIndexEmitted"),m=r.f("uParticlesToEmit"),h=Ne(d,n),f=Ne(n,d.add(m).sub(1)),p=h.mul(f);return u.assign(X(u,r.f("uTime"),p)),P(p,X(o,c(1),p),u,1)})()})(t)}}var cg=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=L(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=re(t??new Lt),this.textureNodes.set(e,a)),a}node(e){return this.nodes.get(e)??this.textureNodes.get(e)}adopt(e){for(let t of Object.keys(e)){let a=e[t].value;if(a instanceof Lt||a&&typeof a=="object"&&a.isTexture){let r=this.getTexture(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(s){r.value=s}}})}else{let r=this.getUniform(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(s){r.value=s}}})}}}},pg=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new cg,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new Ee(r,r,{type:Xt,minFilter:Oe,magFilter:Oe,wrapS:ns,wrapT:ns,depthBuffer:!1});this.renderTargets=[s(),s()],this.material=Object.defineProperty({},"uniforms",{get:()=>this._uniformsStore,set:i=>{this.registry.adopt(i),this._uniformsStore=i}})}get currentRenderTarget(){return this.renderTargets[this.currentIndex]}get nextRenderTarget(){return this.renderTargets[1-this.currentIndex]}advance(){this.currentIndex=1-this.currentIndex}dispose(){this.renderTargets[0].dispose(),this.renderTargets[1].dispose(),this.nodeMaterial?.dispose()}},Ru=new kt,fg=class{constructor(e,t,a,r){this.sizeX=e,this.sizeY=t,this.renderer=a,this.features=r,this.variables=[],this._copyMaterial=null,this._copyTextureNode=re(new Lt)}addVariable(e,t,a){let r=new pg(e,e==="uCurrentPosition"?"position":e==="uCurrentVelocity"?"velocity":"emissionRate",a,this.sizeX);return this.variables.push(r),r}setVariableDependencies(e,t){e.dependencies=t;
5for(let a of t)e.depTextureNodes.has(a.name)||e.depTextureNodes.set(a.name,re(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new ke;e.name="WebGPUComputation.copy",e.fragmentNode=P(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Ft,this._copyMaterial=e}for(let e of this.variables){this._copyTextureNode.value=e.initialTexture;for(let a of e.renderTargets)this._renderQuad(this._copyMaterial,a);let t=new ke;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=mg(e.kind,{features:this.features,registry:e.registry,depTexture:a=>{let r=e.depTextureNodes.get(a);if(!r)throw new Error(`WebGPUComputationRenderer: variable "${e.name}" reads undeclared dependency "${a}"`);return r},resolution:new ve(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Ft,t.needsUpdate=!0,e.nodeMaterial=t}}compute(){for(let e of this.variables)if(e.nodeMaterial){for(let t of e.dependencies)e.depTextureNodes.get(t.name).value=t.currentRenderTarget.texture;this._renderQuad(e.nodeMaterial,e.nextRenderTarget)}for(let e of this.variables)e.advance()}getCurrentRenderTarget(e){return e.currentRenderTarget}_renderQuad(e,t){let a=this.renderer,r=a.getRenderTarget(),s=a.getMRT();a.setMRT(null),a.setRenderTarget(t),Ru.material=e,Ru.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function zu(e,t){switch(e){case"linearFadeOut":return c(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,c(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(c(1).sub(t.sub(.6).div(.4)),c(1)));case"constant":return c(1);default:return t}}function ku(e){return e.dot(A(12.9898,78.233)).sin().mul(43758.5453).fract()}var gg=class extends ke{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=re(new Lt),this._uTexture=re(new Lt),this._uColor=L(new at(1,1,1,1)),this._uColor2=L(new at(1,1,1,1)),this._uSize=L(1),this._uSizeEnd=L(1),this._uWorldOffset=L(new ne),this._uWorldQuaternion=L(new at(0,0,0,1)),this._uRotation=L(0),this._uRotationEnd=L(0),this._center=L(new ve(.5,.5)),this._uRandScaleFactor=L(0),this._uRandRotationFactor=L(0),this.context=t,this.name="WebGPUParticleMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.lights=!1;let a=i=>({get value(){return i.value},set value(n){i.value=n}}),r=i=>({get value(){return i.value},set value(n){((l,o)=>{if(Array.isArray(l))o.set(Number(l[0]??1),Number(l[1]??1),Number(l[2]??1),Number(l[3]??1));else if(l&&typeof l=="object"&&"r"in l){let u=l;o.set(u.r,u.g,u.b,u.a??1)}})(n,i.value)}}),s=i=>({get value(){return i.value},set value(n){n&&n.isTexture&&(i.value=n)}});this._binders={uPosition:s(this._uPosition),uTexture:s(this._uTexture),uColor:r(this._uColor),uColor2:r(this._uColor2),uSize:a(this._uSize),uSizeEnd:a(this._uSizeEnd),uWorldOffset:a(this._uWorldOffset),uWorldQuaternion:a(this._uWorldQuaternion),uRotation:a(this._uRotation),uRotationEnd:a(this._uRotationEnd),center:a(this._center),uRandScaleFactor:a(this._uRandScaleFactor),uRandRotationFactor:a(this._uRandRotationFactor)},this._uniformsStore={...this._binders},this.updateState(e),this._rebuildGraph()}get uniforms(){return this._uniformsStore}set uniforms(e){for(let t of Object.keys(e)){let a=this._binders[t];if(!a)continue;let r=e[t]?.value;Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:a}),r!==void 0&&(a.value=r)}this._uniformsStore=e}updateState(e){let t=!1;if(e.coloring!==void 0){let a=e.coloring==="random";t||(t=a!==this.isColoringRandom),this.isColoringRandom=a}if(e.color!==void 0&&(this.uniforms.uColor.value=Array.isArray(e.color)?e.color:this.context.shared.color(e.color)),e.color2!==void 0&&(this.uniforms.uColor2.value=Array.isArray(e.color2)?e.color2:this.context.shared.color(e.color2)),e.size!==void 0){this.uniforms.uSize.value=e.size[0],this.uniforms.uSizeEnd.value=e.size[1];let a=e.size[0]!==e.size[1];t||(t=a!==this.useSizeEnd),this.useSizeEnd=a}e.ease!==void 0&&e.ease!==this.easeOpacity&&(this.easeOpacity=e.ease,t=!0),e.easeSize!==void 0&&e.easeSize!==this.easeSize&&(this.easeSize=e.easeSize,t=!0),t&&this._rebuildGraph(),this.needsUpdate=!0}_rebuildGraph(){let e=Er("particleRef","vec2"),t=this._uPosition,a=U(()=>{let s=t.sample(e).toVar(),i=s.w.toVar(),n=s.xyz.sub(this._uWorldOffset);n=(function(S,C){let R=S.xyz;return C.add(R.cross(R.cross(C).add(C.mul(S.w))).mul(2))})(this._uWorldQuaternion,n);let l=Er("position","vec3"),o=c(1).sub(i),u=this.useSizeEnd?l.mul(w(X(this._uSize,this._uSizeEnd,o))):l.mul(w(this._uSize.mul(zu(this.easeSize,o)))),d=Xl,m=d.element
vendor: 33,390 bytes, line 5
5(0).xyz.length(),h=d.element(1).xyz.length(),f=ku(e).toVar(),p=c(1).sub(this._uRandScaleFactor.mul(f)),_=A(m,h).mul(p).toVar(),y=2*Math.PI,g=f.mul(this._uRandRotationFactor).mul(y),x=c(1).sub(this._uRotation).mul(y),v=c(1).sub(this._uRotationEnd).mul(y),V=X(x.add(g),v.add(g),i).toVar(),T=this._center,z=u.xy.sub(T.sub(A(.5))).mul(_).toVar(),b=A(ha(V).mul(z.x).sub(Zt(V).mul(z.y)),Zt(V).mul(z.x).add(ha(V).mul(z.y))).toVar(),M=Tc.mul(P(n,1)).toVar();return M.xy.addAssign(b),Js.mul(M)}),r=U(()=>{let s=t.sample(e).w.toVar();s.lessThanEqual(.005).discard();let i=c(1).sub(s),n=this.isColoringRandom?ku(e):i,l=X(this._uColor,this._uColor2,n).toVar(),o=zu(this.easeOpacity,i).toVar(),u=this._uTexture.sample(Ie()).toVar();return P(u.rgb.mul(l.rgb),l.a.mul(u.a).mul(o))});this.vertexNode=a(),this.colorNode=r(),this.needsUpdate=!0}nodeMaterialDispose(){this.dispose()}};function ph(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=J(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(A(n,l))}}wc({createComputation:(e,t,a,r)=>new fg(e,t,a,r),createMaterial:(e,t)=>new gg(e,t)});var fh=[[0,0,0],[1,0,0],[1,0,0],[1,1,0],[0,1,0],[1,1,0],[0,0,0],[0,1,0],[0,0,1],[1,0,1],[1,0,1],[1,1,1],[0,1,1],[1,1,1],[0,0,1],[0,1,1],[0,0,0],[0,0,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,1,0],[0,1,1]];function Au(e){let t=Le(e.x.mul(65535).add(.5)),a=t.bitAnd(Le(255)).toFloat().mul(.00392156862),r=t.shiftRight(Le(8)).bitAnd(Le(255)).toFloat().mul(.00392156862);return P(r,a,e.y,e.z)}function gh(e){let{levelShiftX:t,scale:a,originOffset:r}=(function(_){switch(_){case 5:return{levelShiftX:[4,6,12,24,48,96,192],scale:16,originOffset:16};case 7:return{levelShiftX:[4,6,12,24,48,96,192,384,768,1536],scale:4,originOffset:64};case 8:return{levelShiftX:[4,8,16,32,64,128,256,512,1024,2048,4096],scale:2,originOffset:128};default:return{levelShiftX:[4,8,16,32,64,128,256,512],scale:8,originOffset:32}}})(e.resolutionLevel),s=e.pyramidLevelSizes.length,i=s%2==0?s-3:s-2,n=s%2==0,l=Math.pow(2,e.resolutionLevel),o=e.pyramidLevelSizes[s-1]/l,u=ph(l,o),d=e.pyramid1Size.width,m=e.pyramid1Size.height,h=e.pyramid2Size.width,f=e.pyramid2Size.height,p=hl(fh.map(([_,y,g])=>new ne(_,y,g)));return _=>{let y=w(0).toVar(),g=w(0,0,1).toVar(),x=P(0).toVar(),v=_.toVar(),V=J(v.div(3)).toVar(),T=(R,k)=>A(R.x.add(k).add(.5).div(d),R.y.add(.5).div(m)),z=(R,k)=>A(R.x.add(k).add(.5).div(h),R.y.add(.5).div(f)),b=d-2,M=h-1,S=A(0,0).toVar(),C=e.pyramid2.sample(z(S,M)).toVar();return B(V.lessThan(C.x),()=>{let R=c(0).toVar(),k=fe=>{let Te=C.add(P(R)).toVar(),Be=P(Te.yzw,R),$e=P(P(V).greaterThanEqual(Be)).mul(P(P(V).lessThan(Te))).toVar();S.mulAssign(2),S.addAssign(A(0,1).mul($e.x).add(A(1,1).mul($e.y)).add(A(1,0).mul($e.z))),R.assign($e.dot(Be)),fe?.()};for(let fe=0;fe<i;){let Te=t[fe];k(()=>{M-=Te,C.assign(e.pyramid1.sample(T(S,b)))}),fe++;let Be=t[fe];k(()=>{b-=Be,C.assign(e.pyramid2.sample(z(S,M)))}),fe++}n&&k(null);let E=S.x.mod(l).toVar(),I=S.y.mod(l).toVar(),D=J(S.x.div(l)).add(J(S.y.div(l)).mul(o)).toVar(),H=v.sub(R.mul(3)).mul(.0625).add(.03125),K=u(E,I,D,e.voxel).toVar().w.add(.5).mul(.00390625),O=e.triTable.sample(A(H,K)).x.mul(2).toInt().toVar(),j=w(E,I,D).add(p.element(O)).toVar(),Z=w(E,I,D).add(p.element(O.add(1))).toVar(),$=u(j.x,j.y,j.z,e.potential).toVar(),me=u(Z.x,Z.y,Z.z,e.potential).toVar(),ue=$.x.div($.x.sub(me.x));x.assign(X(Au($.yzw),Au(me.yzw),ue)),y.assign(j.add(Z.sub(j).mul(ue)).sub(w(r)).mul(a));let ce=u(j.x,j.y,j.z,e.voxel),Me=u(Z.x,Z.y,Z.z,e.voxel);g.assign(ae(X(ce.xyz,Me.xyz,ue)))}),{position:y,normal:g,color:x}}}function Pu(e,t){e.needsPreviousData?.()===!0&&ql.assign(t)}var ba=e=>e,Kn=e=>e,ws=ad,Ll=rd;function _h(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function yh(e,t,a,r){let s=ie(e,-1,1),i=e.sub(s).mul(2).add(1),n=ie(c(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return X(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(c(1).sub(n)))}function xh(e,t,a,r,s){let i=c(0).toVar(),n=a.y,l=a.z,o=a.w,u=B(e.lessThan(.5),()=>{i.assign(we(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let m=w(n,l,o),h=we(t.div(m)),f=we(t.div(m.mul(m)));i.assign(h.mul(h.sub(1)).div(f))}).ElseIf(e.lessThan(2.5),()=>{let m=w(n,l,o),h=de(t).sub(m).toVar();i.assign(we(Q(h,w(0))).add(xe(Q(h.x,Q(h.y,h.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let m=de(A(we(t.xz),t.y)).sub(A(l,n)).toVar();i.assign(xe(Q(m.x,m.y),0).add(we(Q(m,A(0)))))}).ElseIf(e.lessThan(4.5),()=>{let m=n,h=l,f=o,p=A(we(t.xz),t.y).toVar(),_=A(f,m),y=A(f.sub(h),m.mul(2)),g=A(p.x.sub(xe(p.x,p.y.lessThan(0).select(h,f))),de(p.y).sub(m)).toVar(),x=p.sub(_).add(y.mul(ie(q(_.sub(p),y).div(q(y,y)),0,1))).toVar(),v=x.x.lessThan(0).and(g.y.lessThan(0)).select(c(-1),c(1));i.assign(v.mul(Ea(xe(q(g,g),q(x,x)))))}).ElseIf(e.lessThan(5.5),()=>{let m=A(we(t.xy).sub(n),t.z);i.assign(we(m).sub(l))}),d=()=>{let m=de(t.x).toVar(),h=A(n,l),f=o,p=r.w,_=h.y.mul(m).greaterThan(h.x.mul(t.y)).select(q(A(m,t.y),h),we(A(m,t.y))),y=w(m,t.y,t.z);i.assign(Ea(q(y,y).add(f.mul(f)).sub(f.mul(_).mul(2))).sub(p))};return s?u.ElseIf(e.lessThan(6.5),d).Else(()=>{i.assign(s(t,a,r))}):u.Else(d),i}function Il(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?P(0).toVar():P(0),l=c(1e3).toVar(),o=t?c(0).toVar():c(0),u=t?c(0).toVar():c(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),m=(f,p)=>{let _=p.toVar();We(ws,({i:y})=>{B(_.lessThan(1),()=>{sa()}),_.mulAssign(.5),B(Ae(_).greaterThanEqual(.5),()=>{let g=c(y).add(f).add(.5).mul(1/Ll),x=e.shapeRow(g,0).toVar(),v=e.shapeRow(g,1).toVar(),V=e.shapeRow(g,2).toVar(),T=e.shapeRow(g,3).toVar(),z=_h(v,s.sub(x.xyz)).div(T.z).toVar(),b=xh(V.x,z,V,T,e.meshSdf).sub(T.y).mul(T.z).toVar(),M=T.x.toVar(),S=x.w;if(l.assign(yh(S,l,b,M)),t){let C=Ne(-1.5,S).mul(Ne(S,-.5)),R=Ze(u,0,b.negate()),k=X(c(1),R,C);n.mulAssign(k),o.mulAssign(k),u.assign(Q(u,M)),M.addAssign(e.colorKBump);let E=e.shapeRow(g,4).toVar(),I=Ze(M,0,b).mul(E.a.greaterThanEqual(0).toFloat()).toVar();o.addAssign(I),n.addAssign(E.mul(I))}})})},h=f=>{let p=f.mul(4*ws).toVar(),_=e.spatialTex.sample(A(i.x.mul(r).add(f).add(.5).div(r*a),d)).toVar();m(p,_.x),m(p.add(ws),_.y),m(p.add(2*ws),_.z),m(p.add(3*ws),_.w)};return r===1?h(c(0)):We(r,({i:f})=>{h(c(f).toVar())}),t&&n.divAssign(o),{sdf:X(l,c(0),Ne(1e20,l)).toVar(),color:n,colorDivisor:o}}}var wi=[4,4,4],vr=(e,t)=>yc(e,t);function Eu(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=L(e.bboxHalf),o=L(e.bboxOffset),u=L(1e30),d=L(new ne(0,0,0)),m=L(new ne(i,i,i)),h=e.env.spatialDivisions,f=c(e.buildSeq).mul(0),p=e.sparseStorage??null,_=p?p.poolBricks:0,y=p?Math.ceil(_/4096):0,g=p?.meshlet??null,x=g?g.drawIndex:null,v=g?Math.floor(s/24):0,V=g?g.vertexBlocks:0,T=(F,Y,ee,te)=>{let le=new ts(F,Y,ee);return le.format=or,le.type=Xt,le.minFilter=Oe,le.magFilter=Oe,le.name=te,le},z=p?T(256,256,4*Math.max(y,1),"SplineShapeBlend.ultraSdfPool"):e.reuseTextures?.sdfTexture??T(t,t,t,"SplineShapeBlend.ultraSdf");z.format=or,z.type=Xt,z.minFilter=Oe,z.magFilter=Oe;let b=e.reuseTextures?.colorTexture??new ts(r,r,r);b.name="SplineShapeBlend.ultraColor";let M=e.reuseTextures?.coarseTexture??new ts(i,i,i);M.format=or,M.type=Xt,M.minFilter=Oe,M.magFilter=Oe,M.name="SplineShapeBlend.ultraCoarse";let S=ft(8,"uint").toAtomic(),C=(F=0)=>S.element(F),R=p?ft(g?12:4,"int").toAtomic():null,k=F=>R.element(F),E=p?ft(Math.max(_,1),"float"):null,I=i*i*i,D=p?ft(I*(g?4:1),"float"):null,H=F=>N(F.x.add(F.y.mul(i)).add(F.z.mul(i*i))),K=F=>D.element(H(F)),O=F=>D.element(H(F).add(N(I))),j=F=>D.element(H(F).add(N(2*I))),Z=F=>D.element(H(F).add(N(3*I))),$=F=>D.element(F.add(N(3*I))),me=p?ft(Math.max(_,1),"float"):null,ue=g?ft(3*Math.max(v,1),"float"):null,ce=F=>ue.element(F),Me=F=>ce(N(F)),fe=F=>ce(N(F.add(v))),Te=F=>ce(F.add(N(2*v))),Be=g?ft(Math.max(V,1),"float"):null,$e=F=>Be.element(F),Ge=g?ft(24*Math.max(v,1),"uint"):null,Ye=F=>Ge.element(F),Ue=g?L(0):null,wt=g?L(new Ra):null,Yt=g?L(2):null,rt=hl(Array.from(e.numTrisTable)),yt=hl(fh.map(([F,Y,ee])=>new ne(F,Y,ee))),It=Il(e.env,!1),Re=Il(e.env),st=(F,Y)=>F.div(Y).mul(2).sub(1),De=(F,Y)=>F.div(Y).mul(h-1).floor(),qt=U(()=>{for(let F=0;F<8;F++)va(C(F),Le(0))})(),bt=U(()=>{B(N(Kt).greaterThanEqual(N(s)),()=>{Qe()}),e.buffers.positions.element(N(Kt)).assign(P(0))})(),Fe=g?U(()=>{B(N(Kt).greaterThanEqual(N(s)),()=>{Qe()}),x.element(N(Kt)).assign(Le(f))})():null,ze=nr(M),Ke=F=>ze.load(ra(ie(F,w(0),w(n)))).x,ye=F=>K(ie(F,w(0),w(n))),it=(F,Y)=>{let ee=Q(F,0),te=J(ee.div(4096)),le=ee.sub(te.mul(4096)),be=J(le.div(64)),He=le.sub(be.mul(64));return w(He,be,te).mul(4).add(Y)},ma=U(()=>{let F=w(fa).add(d).toVar();B(F.x.greaterThan(n).or(F.y.greaterThan(n)).or(F.z.greaterThan(n)),()=>{Qe()});let Y=F.mul(4).add(w(1.5)),ee=(te=>{let le=c(1e3).toVar();return We(Ll,({i:be})=>{B(c(be).greaterThanEqual(e.npart),()=>{sa()});let He=c(be).add(.5).mul(1/Ll),ht=e.env.shapeRow(He,0).toVar(),se=e.env.shapeRow(He,1).toVar(),oe=e.env.shapeRow(He,2).toVar(),pe=e.env.shapeRow(He,3).toVar(),ct=_h(se,te.sub(ht.xyz)).div(pe.z).toVar(),ot=xh(oe.x,ct,oe,pe,e.env.meshSdf).sub(pe.y).mul(pe.z).toVar();le.assign(yh(ht.w,le,ot,pe.x))}),le})(st(Y,a));Vr(M,ra(F),P(ee.add(f),0,0,0)).toStack()})(),Pe=F=>{B(F.x.greaterThan(n).or(F.y.greaterThan(n)).or(F.z.greaterThan(n)),()=>{Qe()})},Wt=p?U(()=>{let F=w(fa).toVar();Pe(F),K(F).assign(c(-1).add(f)),g&&(O(F).assign(c(-1).add(f)),j(F).assign(c(-1).add(f)))})():null,la=p?U(()=>{let F=w(fa).add(d).toVar();Pe(F);let Y=Ke(F).toVar(),ee=ye(F).toVar();B(de(Y).greaterThan(u).and(ee.greaterThan(-.5)),()=>{let te=Aa(k(1),N(1)).toVar();E.element(te).assign(ee),K(F).assign(c(-1).add(f))})})():null,oa=p?U(()=>{let F=w(fa).add(d).toVar();Pe(F);let Y=Ke(F).toVar(),ee=ye(F).toVar();B(de(Y).lessThanEqual(u).and(ee.lessThan(-.5)),()=>{let te=c(-1).toVar(),le=xn(k(1),N(1)).toVar();B(le.greaterThanEqual(1),()=>{te.assign(E.element(le.sub(1)))}).Else(()=>{Aa(k(1),N(1));let be=Aa(k(0),N(1)).toVar();B(be.lessThan(N(_)),()=>{te.assign(be.toFloat())}).Else(()=>{va(k(2),N(1))})}),B(te.greaterThan(-.5),()=>{me.element(N(te)).assign((be=>be.x.add(be.y.mul(256)).add(be.z.mul(65536)))(F)),K(F).assign(te.add(f))})})})():null,nt=p?U(()=>{let F=Br(k(0)).toVar(),Y=Br(k(2)).toVar();if(va(C(1),Le(F)),va(C(2),Le(Y)),va(k(2),N(0)),g){let ee=Br(k(3)).toVar(),te=Br(k(5)).toVar();va(C(4),Le(ee)),va(C(5),Le(te)),va(k(5),N(0));let le=Br(k(6)).toVar(),be=Br(k(8)).toVar();va(C(6),Le(le)),va(C(7),Le(be)),va(k(8),N(0))}})():null,Tt=g?U(()=>{let F=w(fa).toVar();B(F.x.greaterThanEqual(m.x).or(F.y.greaterThanEqual(m.y)).or(F.z.greaterThanEqual(m.z)),()=>{Qe()});let Y=F.add(d).toVar();Pe(Y);let ee=j(Y).toVar();B(ee.greaterThan(-.5),()=>{let le=Aa(k(7),N(1)).toVar();$e(le).assign(ee),j(Y).assign(c(-1).add(f))});let te=O(Y).toVar();B(te.lessThan(-.5),()=>{Qe()}),O(Y).assign(c(-1).add(f)),We(48,()=>{B(te.lessThan(-.5),()=>{sa()});let le=Aa(k(4),N(1)).toVar();Te(le).assign(te),te.assign(Me(te))})})():null,St=g?U(()=>{let F=w(fa).add(d).toVar();Pe(F);let Y=c(0).toVar();B(ye(F).greaterThan(-.5),()=>{let ee=F.mul(4).toVar(),te=Za.map(([ht,se,oe])=>Na(w(ee.x.add(4*ht),ee.y.add(4*se),ee.z.add(4*oe))).toVar()),le=te[0];for(let ht=1;ht<8;ht++)le=le.add(te[ht]);let be=ae(le).toVar(),He=q(te[0],be);for(let ht=1;ht<8;ht++)He=xe(He,q(te[ht],be));B(He.greaterThan(Yt),()=>{Y.assign(c(1))})}),Z(F).assign(Y.add(f))})():null,Dt=Math.min(4096,Math.max(_,1)),_a=()=>{let F=w(fa).toVar(),Y=J(F.x.mul(.25)).toVar(),ee=J(F.y.mul(.25)).toVar();return{slot:ee.mul(Dt).add(Y).toVar(),local:w(F.x.sub(Y.mul(4)),F.y.sub(ee.mul(4)),F.z).toVar()}},Je=F=>(Y=>{let ee=J(Y.div(65536)),te=Y.sub(ee.mul(65536)),le=J(te.div(256)),be=te.sub(le.mul(256));return w(be,le,ee)})(me.element(N(F))),Pt=p?U(()=>{let F=w(fa).add(d.mul(4)).toVar(),Y=F.mul(.25).floor().toVar(),ee=ye(Y).toVar();B(ee.lessThan(-.5),()=>{Qe()});let{sdf:te}=It(st(F,a),De(F,a));Vr(z,ra(it(ee,F.sub(Y.mul(4)))),P(te.add(f),0,0,0)).toStack()})():null,za=p?U(()=>{let{slot:F,local:Y}=_a();B(F.greaterThanEqual(_),()=>{Qe()});let ee=Je(F).toVar();B(ye(ee).notEqual(F),()=>{Qe()});let te=ee.mul(4).add(Y).toVar(),{sdf:le}=It(st(te,a),De(te,a));Vr(z,ra(it(F,Y)),P(le.add(f),0,0,0)).toStack()})():U(()=>{let F=w(fa).add(d.mul(4)).toVar(),Y=Ke(F.mul(.25).floor()).toVar();B(de(Y).greaterThan(u),()=>{Vr(z,ra(F),P(Y.add(f),0,0,0)).toStack(),Qe()});let{sdf:ee}=It(st(F,a),De(F,a));Vr(z,ra(F),P(ee.add(f),0,0,0)).toStack()})(),Jt=U(()=>{let F=w(fa).add(d.mul(2)).toVar();B(F.x.greaterThan(r-1).or(F.y.greaterThan(r-1)).or(F.z.greaterThan(r-1)),()=>{Qe()}),B(de(Ke(F.mul(.5).floor())).greaterThan(u),()=>{Qe()});let{color:Y,colorDivisor:ee}=Re(st(F,r-1),De(F,r-1)),te=ee.greaterThan(0).select(Y,P(0));Vr(b,ra(F),ie(te.add(f),P(0),P(1))).toStack()})(),Et=nr(z),lt=p?(F,Y,ee)=>{let te=ie(w(F,Y,ee),w(0),w(a)),le=te.mul(.25).floor(),be=ye(le),He=Et.load(ra(it(be,te.sub(le.mul(4))))).x;return be.lessThan(-.5).select(Ke(le),He)}:(F,Y,ee)=>Et.load(ra(ie(w(F,Y,ee),w(0),w(a)))).x,Na=F=>{let Y=F.x,ee=F.y,te=F.z,le=lt(Y.add(1),ee,te).sub(lt(Y.sub(1),ee,te)),be=lt(Y,ee.add(1),te).sub(lt(Y,ee.sub(1),te)),He=lt(Y,ee,te.add(1)).sub(lt(Y,ee,te.sub(1)));return le.equal(0).and(be.equal(0)).and(He.equal(0)).select(w(.199,.299,.399),ae(w(le,be,He)))},gr=(F,Y,ee)=>{let te=((He,ht,se)=>{let oe=(pe,ct,ot,Xe)=>lt(He.add(pe),ht.add(ct),se.add(ot)).lessThan(0).toFloat().mul(Xe);return oe(0,0,0,1).add(oe(1,0,0,2)).add(oe(0,1,0,8)).add(oe(1,1,0,4)).add(oe(0,0,1,16)).add(oe(1,0,1,32)).add(oe(0,1,1,128)).add(oe(1,1,1,64))})(F,Y,ee).toVar(),le=rt.element(N(te)).toVar();B(le.lessThan(.5),()=>{Qe()});let be=Aa(C(),Le(le)).toVar();B(c(be).add(le).mul(3).lessThanEqual(s),()=>{let He=te.add(.5).mul(.00390625);We(5,({i:ht})=>{B(c(ht).greaterThanEqual(le),()=>{sa()});let se=c(ht).toVar();We(3,({i:oe})=>{let pe=c(oe).toVar();((ct,ot,Xe,xt,Ht,xa)=>{let jt=Ht.mul(.0625).add(.03125),pt=e.triTable.sample(A(jt,xt)).x.mul(2).toInt().toVar(),vt=w(ct,ot,Xe).add(yt.element(pt)).toVar(),et=w(ct,ot,Xe).add(yt.element(pt.add(1))).toVar(),Bt=lt(vt.x,vt.y,vt.z).toVar(),ea=lt(et.x,et.y,et.z).toVar(),qe=Bt.div(Bt.sub(ea)).toVar(),Vt=vt.add(et.sub(vt).mul(qe)).toVar().div(a).mul(2).sub(1).toVar(),Ot=Vt.mul(l).add(w(o)),Mt=ae(X(Na(vt),Na(et),qe)),Ct=Vt.add(1).mul(.5),Gt=nr(b,Ct,N(0)),tt=xa.toVar();e.buffers.positions.element(tt).assign(P(Ot,1)),e.buffers.normals.element(tt).assign(P(Mt,0)),e.buffers.colors.element(tt).assign(Gt)})(F,Y,ee,He,se.mul(3).add(pe),N(be).add(N(se)).mul(3).add(N(pe)))})})})},an=p?U(()=>{let{slot:F,local:Y}=_a();B(F.greaterThanEqual(_),()=>{Qe()});let ee=Je(F).toVar();B(ye(ee).notEqual(F),()=>{Qe()});let te=ee.x.mul(4).add(Y.x).toVar(),le=ee.y.mul(4).add(Y.y).toVar(),be=ee.z.mul(4).add(Y.z).toVar();B(te.greaterThanEqual(a).or(le.greaterThanEqual(a)).or(be.greaterThanEqual(a)),()=>{Qe()}),gr(te,le,be)})():U(()=>{let F=w(fa).x.toVar(),Y=w(fa).y.toVar(),ee=w(fa).z.toVar();B(F.greaterThanEqual(a).or(Y.greaterThanEqual(a)).or(ee.greaterThanEqual(a)),()=>{Qe()}),B(de(Ke(w(F,Y,ee).mul(.25).floor())).greaterThan(u),()=>{Qe()}),gr(F,Y,ee)})(),ti=()=>{let F=w(bn).toVar(),Y=F.y.mul(Dt).add(F.x).toVar(),ee=w(0).toVar(),te=c(0).toVar();return B(Y.lessThan(_),()=>{ee.assign(Je(Y)),B(ye(ee).equal(Y),()=>{te.assign(c(1))})}),{brick:ee,valid:te}},ms=()=>{let F=w(bn).add(d).toVar(),Y=c(0).toVar();return B(F.x.lessThanEqual(n).and(F.y.lessThanEqual(n)).and(F.z.lessThanEqual(n)),()=>{B(ye(F).greaterThan(-.5),()=>{Y.assign(c(1))})}),{brick:F,valid:Y}},Za=[[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]],rn=[[0,1],[2,3],[4,5],[6,7],[0,2],[1,3],[4,6],[5,7],[0,4],[1,5],[2,6],[3,7]],ai=F=>U(()=>{let Y=vr("float",64),ee=vr("float",1),te=w(vn).toVar(),le=N(te.x.add(te.y.mul(4)).add(te.z.mul(16))).toVar(),{brick:be,valid:He}=F(),ht=Z(be).toVar(),se=c(1).add(ht).toVar(),oe=ht.greaterThan(.5),pe=oe.and(te.x.lessThan(2).and(te.y.lessThan(2)).and(te.z.lessThan(2))).or(oe.not()),ct=be.x.mul(4).add(te.x.mul(se)).toVar(),ot=be.y.mul(4).add(te.y.mul(se)).toVar(),Xe=be.z.mul(4).add(te.z.mul(se)).toVar(),xt=Za.map(([et,Bt,ea])=>lt(ct.add(se.mul(et)),ot.add(se.mul(Bt)),Xe.add(se.mul(ea))).toVar()),Ht=xt[0].lessThan(0).toFloat();for(let et=1;et<8;et++)Ht=Ht.add(xt[et].lessThan(0).toFloat());let xa=Ht.toVar(),jt=c(0).toVar();B(He.greaterThan(.5).and(pe).and(ct.add(se).lessThanEqual(a)).and(ot.add(se).lessThanEqual(a)).and(Xe.add(se).lessThanEqual(a)).and(xa.greaterThan(.5)).and(xa.lessThan(7.5)),()=>{jt.assign(c(1))}),Y.element(le).assign(jt.add(f)),_s(),B(le.equal(N(0)).and(He.greaterThan(.5)),()=>{let et=c(0).toVar();We(64,({i:ea})=>{et.addAssign(Y.element(ea))});let Bt=c(-1).toVar();B(et.greaterThan(.5),()=>{let ea=xn(k(7),N(1)).toVar();B(ea.greaterThanEqual(1),()=>{Bt.assign($e(ea.sub(1)))}).Else(()=>{Aa(k(7),N(1));let qe=Aa(k(6),N(1)).toVar();B(qe.lessThan(N(V)),()=>{Bt.assign(qe.toFloat())}).Else(()=>{va(k(8),N(1))})}),B(Bt.greaterThan(-.5),()=>{j(be).assign(Bt.add(f))})}),ee.element(N(0)).assign(Bt)}),_s();let pt=ee.element(N(0)).toVar(),vt=jt.greaterThan(.5).or(oe.and(pe).and(He.greaterThan(.5)).and(ct.add(se).lessThanEqual(a)).and(ot.add(se).lessThanEqual(a)).and(Xe.add(se).lessThanEqual(a)));B(vt.and(pt.greaterThan(-.5)),()=>{let et=w(0).toVar(),Bt=c(0).toVar();for(let[zt,Ia]of rn)B(xt[zt].lessThan(0).toFloat().notEqual(xt[Ia].lessThan(0).toFloat()),()=>{let Ya=xt[zt].div(xt[zt].sub(xt[Ia])),[ps,si,ii]=Za[zt],[dn,Dh,Uh]=Za[Ia];et.addAssign(w(ps,si,ii).add(w(dn-ps,Dh-si,Uh-ii).mul(Ya)).mul(se)),Bt.addAssign(1)});let ea=et.div(Q(Bt,1)).toVar();B(Bt.lessThan(.5),()=>{ea.assign(w(se.mul(.5)))});let qe=w(ct,ot,Xe).add(ea).toVar().div(a).mul(2).sub(1).toVar(),Vt=qe.mul(l).add(w(o)),Ot=w(0).toVar(),Mt=ea.div(se).toVar();for(let zt=0;zt<8;zt++){let[Ia,Ya,ps]=Za[zt],si=Ia?ba(Mt.x):c(1).sub(ba(Mt.x)),ii=Ya?ba(Mt.y):c(1).sub(ba(Mt.y)),dn=ps?ba(Mt.z):c(1).sub(ba(Mt.z));Ot.addAssign(Na(Kn(w(ct.add(se.mul(Ia)),ot.add(se.mul(Ya)),Xe.add(se.mul(ps))))).mul(si.mul(ii).mul(dn)))}let Ct=ae(Ot),Gt=qe.add(1).mul(.5),tt=nr(b,Gt,N(0)),ia=N(oe.select(te.x.add(te.y.mul(2)).add(te.z.mul(4)),c(le))).toVar(),Rt=N(pt.mul(64)).add(ia).toVar();e.buffers.positions.element(Rt).assign(P(Vt,1)),e.buffers.normals.element(Rt).assign(P(Ct,0)),e.buffers.colors.element(Rt).assign(tt)})})(),sn=g?ai(ti):null,nn=g?ai(ms):null,ri=F=>U(()=>{let Y=vr("float",64),ee=vr("float",64),te=vr("float",48),le=w(vn).toVar(),be=N(le.x.add(le.y.mul(4)).add(le.z.mul(16))).toVar(),{brick:He,valid:ht}=F(),se=He.x.mul(4).add(le.x).toVar(),oe=He.y.mul(4).add(le.y).toVar(),pe=He.z.mul(4).add(le.z).toVar(),ct=lt(se,oe,pe).lessThan(0).toFloat().toVar(),ot=(qe,Vt,Ot)=>$(N(J(qe.mul(.25))).add(N(J(Vt.mul(.25))).mul(i)).add(N(J(Ot.mul(.25))).mul(i*i))),Xe=qe=>qe.mul(.5).fract().lessThan(.25),xt=(qe,Vt)=>qe.greaterThanEqual(Vt).and(qe.add(Vt).lessThanEqual(a)),Ht=c(0).toVar(),xa=c(0).toVar(),jt=c(0).toVar(),pt=c(1).toVar(),vt=c(1).toVar(),et=c(1).toVar(),Bt=(qe,Vt,Ot,Mt,Ct,Gt,tt,ia,Rt)=>{let zt=ot(...Rt[0]).add(ot(...Rt[1])).add(ot(...Rt[2])).add(ot(...Rt[3])).greaterThan(3.5).toVar(),Ia=lt(se.add(Ot),oe.add(Mt),pe.add(Ct)).lessThan(0).toFloat(),Ya=lt(se.add(2*Ot),oe.add(2*Mt),pe.add(2*Ct)).lessThan(0).toFloat();B(ht.greaterThan(.5).and(zt.not()).and(ia.add(1).lessThanEqual(a)).and(xt(Gt,c(1))).and(xt(tt,c(1))).and(ct.notEqual(Ia)),()=>{qe.assign(c(1)),Vt.assign(c(1))}),B(ht.greaterThan(.5).and(zt).and(Xe(se)).and(Xe(oe)).and(Xe(pe)).and(ia.add(2).lessThanEqual(a)).and(xt(Gt,c(2))).and(xt(tt,c(2))).and(ct.notEqual(Ya)),()=>{qe.assign(c(1)),Vt.assign(c(2))})};Bt(Ht,pt,1,0,0,oe,pe,se,[[se,oe.sub(1),pe.sub(1)],[se,oe,pe.sub(1)],[se,oe,pe],[se,oe.sub(1),pe]]),Bt(xa,vt,0,1,0,pe,se,oe,[[se.sub(1),oe,pe.sub(1)],[se.sub(1),oe,pe],[se,oe,pe],[se,oe,pe.sub(1)]]),Bt(jt,et,0,0,1,se,oe,pe,[[se.sub(1),oe.sub(1),pe],[se,oe.sub(1),pe],[se,oe,pe],[se.sub(1),oe,pe]]);let ea=Ht.add(xa).add(jt).mul(2).toVar();Y.element(be).assign(ea.add(f)),_s(),B(be.equal(N(0)).and(ht.greaterThan(.5)),()=>{let qe=c(0).toVar();We(64,({i:Ct})=>{ee.element(Ct).assign(qe),qe.addAssign(Y.element(Ct))}),Aa(C(0),Le(qe));let Vt=J(qe.add(7).mul(1/8)).toVar(),Ot=c(-1).toVar(),Mt=c(-1).toVar();We(48,({i:Ct})=>{B(c(Ct).greaterThanEqual(Vt),()=>{sa()});let Gt=c(Ct).toVar(),tt=c(-1).toVar(),ia=xn(k(4),N(1)).toVar();B(ia.greaterThanEqual(1),()=>{tt.assign(Te(ia.sub(1)))}).Else(()=>{Aa(k(4),N(1));let Rt=Aa(k(3),N(1)).toVar();B(Rt.lessThan(N(v)),()=>{tt.assign(Rt.toFloat())}).Else(()=>{va(k(5),N(1))})}),te.element(N(Gt)).assign(tt),B(tt.greaterThan(-.5),()=>{fe(tt).assign(xe(qe.sub(Gt.mul(8)),8)),Me(tt).assign(c(-1)),B(Mt.greaterThan(-.5),()=>{Me(Mt).assign(tt)}).Else(()=>{Ot.assign(tt)}),Mt.assign(tt)})}),O(He).assign(Ot)}),_s(),B(ea.greaterThan(.5),()=>{let qe=(Ct,Gt,tt)=>{let ia=J(Ct.mul(.25)),Rt=J(Gt.mul(.25)),zt=J(tt.mul(.25)),Ia=N(ia).add(N(Rt).mul(i)).add(N(zt).mul(i*i)),Ya=N(Ct.sub(ia.mul(4))).add(N(Gt.sub(Rt.mul(4))).mul(4)).add(N(tt.sub(zt.mul(4))).mul(16));return Le(Ia.mul(64).add(Ya))},Vt=ee.element(be).toVar(),Ot=(Ct,Gt,tt)=>{let ia=te.element(N(J(Vt.mul(.125)))).toVar();B(ia.greaterThan(-.5),()=>{let Rt=Vt.sub(J(Vt.mul(.125)).mul(8)),zt=N(ia.mul(24).add(Rt.mul(3))).toVar();Ye(zt).assign(Ct),Ye(zt.add(N(1))).assign(Gt),Ye(zt.add(N(2))).assign(tt)}),Vt.addAssign(1)},Mt=(Ct,Gt)=>{B(Ct.greaterThan(.5),()=>{let tt=qe(...Gt[0]).toVar(),ia=qe(...Gt[1]).toVar(),Rt=qe(...Gt[2]).toVar(),zt=qe(...Gt[3]).toVar();B(ct.greaterThan(.5),()=>{Ot(tt,ia,Rt),Ot(tt,Rt,zt)}).Else(()=>{Ot(tt,zt,Rt),Ot(tt,Rt,ia)})})};Mt(Ht,[[se,oe.sub(pt),pe.sub(pt)],[se,oe,pe.sub(pt)],[se,oe,pe],[se,oe.sub(pt),pe]]),Mt(xa,[[se.sub(vt),oe,pe.sub(vt)],[se.sub(vt),oe,pe],[se,oe,pe],[se,oe,pe.sub(vt)]]),Mt(jt,[[se.sub(et),oe.sub(et),pe],[se,oe.sub(et),pe],[se,oe,pe],[se.sub(et),oe,pe]])})})(),ln=g?ri(ti):null,on=g?ri(ms):null,un=g?U(()=>{let F=vr("float",48),Y=vr("float",2),ee=w(vn).toVar(),te=N(ee.x.add(ee.y.mul(4)).add(ee.z.mul(16))).toVar(),le=w(bn).toVar(),be=le.y.mul(Dt).add(le.x).toVar();B(te.equal(N(0)),()=>{let oe=c(0).toVar();B(be.lessThan(_),()=>{let ct=Je(be).toVar();B(ye(ct).equal(be),()=>{let ot=c(0).toVar();B(Ue.greaterThan(.5),()=>{let Xe=w(0).toVar(),xt=w(0).toVar();for(let Ht=0;Ht<8;Ht++){let xa=Kn(ct.mul(4).add(w(4*(1&Ht),4*(Ht>>1&1),4*(Ht>>2&1)))),jt=Kn(xa.div(a).mul(2).sub(1)).mul(l).add(w(o)),pt=wt.mul(P(jt,1)).toVar(),vt=ba(pt.w);Xe.addAssign(w(ba(pt.x).lessThan(vt.negate()).toFloat(),ba(pt.y).lessThan(vt.negate()).toFloat(),ba(pt.z).lessThan(0).toFloat())),xt.addAssign(w(ba(pt.x).greaterThan(vt).toFloat(),ba(pt.y).greaterThan(vt).toFloat(),ba(pt.z).greaterThan(vt).toFloat()))}B(Q(Q(Xe.x,Q(Xe.y,Xe.z)),Q(xt.x,Q(xt.y,xt.z))).greaterThan(7.5),()=>{ot.assign(c(1))})}),B(ot.lessThan(.5),()=>{let Xe=O(ct).toVar();We(48,({i:xt})=>{B(Xe.lessThan(-.5),()=>{sa()}),F.element(xt).assign(Xe),oe.addAssign(fe(Xe)),Xe.assign(Me(Xe))})})})});let pe=c(0).toVar();B(oe.greaterThan(.5),()=>{let ct=Aa(C(3),Le(oe.mul(3))).toVar();pe.assign(c(ct))}),Y.element(N(0)).assign(pe.add(f)),Y.element(N(1)).assign(oe)}),_s();let He=Y.element(N(1)).toVar(),ht=Y.element(N(0)).toVar(),se=c(te).toVar();We(6,()=>{B(se.greaterThanEqual(He),()=>{sa()});let oe=F.element(N(J(se.mul(1/8)))).toVar(),pe=se.sub(J(se.mul(1/8)).mul(8)),ct=N(oe.mul(24).add(pe.mul(3))).toVar(),ot=N(ht.add(se.mul(3))).toVar(),Xe=jt=>{let pt=Ye(jt===0?ct:ct.add(N(jt))).toVar(),vt=N(pt.shiftRight(Le(6))).toVar(),et=N(pt.bitAnd(Le(63))).toVar(),Bt=(Ct=>D.element(Ct.add(N(2*I))))(vt).toVar(),ea=$(vt),qe=et.bitAnd(N(3)),Vt=et.shiftRight(N(2)).bitAnd(N(3)),Ot=et.shiftRight(N(4)).bitAnd(N(3)),Mt=qe.shiftRight(N(1)).add(Vt.shiftRight(N(1)).mul(N(2))).add(Ot.shiftRight(N(1)).mul(N(4)));return{blockF:Bt,li:N(ea.greaterThan(.5).select(Mt,et)).toVar()}},xt=Xe(0),Ht=Xe(1),xa=Xe(2);B(xt.blockF.greaterThan(-.5).and(Ht.blockF.greaterThan(-.5)).and(xa.blockF.greaterThan(-.5)),()=>{let jt=pt=>Le(N(pt.blockF.mul(64)).add(pt.li));x.element(ot).assign(jt(xt)),x.element(ot.add(N(1))).assign(jt(Ht)),x.element(ot.add(N(2))).assign(jt(xa))}).Else(()=>{x.element(ot).assign(Le(0)),x.element(ot.add(N(1))).assign(Le(0)),x.element(ot.add(N(2))).assign(Le(0))}),se.addAssign(64)})})():null,ya=Math.ceil(t/wi[0]),cs=Math.ceil(r/wi[0]),Nt=Math.ceil(i/wi[0]),Ut=(F,Y)=>F.compute(Y,Array.isArray(Y)?wi:void 0),ka=[Dt,Math.max(1,Math.ceil(_/Dt)),1];return{resolution:t,sparse:p!==null,poolBricks:_,meshlet:g!==null,vertexBlocks:V,needsInit:p!==null,sdfTexture:z,colorTexture:b,coarseTexture:M,counterAttribute:S.value,storageAttributes:[S,R,E,D,me,ue,Be,Ge].filter(F=>F!==null).map(F=>F.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,...g?{windowSize:m,cullEnabled:Ue,cullMVP:wt,adaptCos:Yt}:{}},kernels:{zero:Ut(qt,1),clear:bt.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:Ut(ma,[Nt,Nt,Nt]),...Wt?{init:Ut(Wt,[Nt,Nt,Nt])}:{},...la?{release:Ut(la,[Nt,Nt,Nt])}:{},...oa?{alloc:Ut(oa,[Nt,Nt,Nt])}:{},...nt?{stats:Ut(nt,1)}:{},sdf:Ut(za,p?ka:[ya,ya,ya]),...Pt?{sdfWindow:Ut(Pt,[ya,ya,ya])}:{},color:Ut(Jt,[cs,cs,cs]),extract:g?Ut(ln,ka):Ut(an,p?ka:[ya,ya,ya]),...g?{clearDraw:Fe.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:Ut(Tt,[Nt,Nt,Nt]),verts:Ut(sn,ka),vertsWindow:Ut(nn,[i,i,i]),extractWindow:Ut(on,[i,i,i]),classify:Ut(St,[Nt,Nt,Nt]),gather:Ut(un,ka)}:{}}}}var Dl=24576;function _g(e){let t=e.getAttribute("position");if(!t||t.count<3)return null;let a=e.getIndex(),r=Math.floor((a?a.count:t.count)/3);if(r===0)return null;let s=Math.max(1,Math.ceil(r/Dl));s>1&&console.warn(`Spline shape blend: mesh child has ${r} triangles â baking every ${s}th (SDF detail reduced).`);let i=Math.floor(r/s),n=new Float32Array(12*i),l=new ne(0,0,0),o=new ne,u=0;for(let m=0;m<i;m++){let h=m*s*3;for(let f=0;f<3;f++){let p=a?a.getX(h+f):h+f;o.fromBufferAttribute(t,p),n[u++]=o.x,n[u++]=o.y,n[u++]=o.z,n[u++]=0,l.x=Math.max(l.x,Math.abs(o.x)),l.y=Math.max(l.y,Math.abs(o.y)),l.z=Math.max(l.z,Math.abs(o.z))}}if(l.x===0&&l.y===0&&l.z===0)return null;let d=Math.max(l.x,l.y,l.z);return l.x=1.08*Math.max(l.x,.05*d),l.y=1.08*Math.max(l.y,.05*d),l.z=1.08*Math.max(l.z,.05*d),{data:n,triCount:i,boxHalf:l}}function yg(e){let t=nr(e);return(a,r,s)=>{let i=Q(w(r.z,r.w,s.w),w(1e-5)).toVar(),n=r.y,l=w(n.mod(4).mul(48),J(n.div(4)).mul(48),0).toVar(),o=ie(a.div(i).mul(.5).add(.5),w(0),w(1)).mul(47).toVar(),u=xe(J(o),w(46)).toVar(),d=o.sub(u).toVar(),m=l.add(u).toVar(),h=(M,S,C)=>t.load(ra(m.add(w(M,S,C)))).x,f=d.x,p=d.y,_=d.z,y=X(h(0,0,0),h(1,0,0),f),g=X(h(0,1,0),h(1,1,0),f),x=X(h(0,0,1),h(1,0,1),f),v=X(h(0,1,1),h(1,1,1),f),V=X(X(y,g,p),X(x,v,p),_),T=Q(i.x,Q(i.y,i.z)),z=de(a).sub(i),b=we(Q(z,w(0)));return V.mul(T).add(b)}}function xg(e){return new ne(e%4*48,48*Math.floor(e/4),0)}var ca=e=>e,vg=e=>e,tr=new kt,Fs=re(new Lt),vh=L(1),bh=L(1),Oi=L(0),Ss=L(0),Th=L(1),Xn=null;function bg(){if(Xn!==null)return Xn;let e=U(()=>{let a=A(vh,bh),r=A(1).div(a),s=Ie().mul(Th).sub(A(.5)).mul(2).add(A(.5)).toVar();s.x.addAssign(Oi);let i=s.div(a).toVar(),n=Fs.sample(i).x.toVar();i.x.addAssign(r.x);let l=Fs.sample(i).x.toVar();i.y.addAssign(r.y);let o=Fs.sample(i).x.toVar();i.x.subAssign(r.x);let u=Fs.sample(i).x.toVar(),d=n,m=d.add(l),h=m.add(o),f=h.add(u);return P(f,h,m,d)})(),t=new ke;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Ft,t.needsUpdate=!0,Xn=t,t}var wh=!1,Sh=!1,Mr="",Ul=!1,Vh=!1,Mh=!1,Ch=!1,Rh=!1,zh=!1,kh=!1,Ah=!1,Ol=!1;try{let e=new URLSearchParams(window.location.search);wh=e.get("dbgsbmarch")==="vertex",Sh=e.get("dbgsbultra")==="0",Mr=e.get("dbgsbchain")??"",Ul=e.get("dbgsbnoclear")==="1",Vh=e.get("dbgsbsparse")==="0",Mh=e.get("dbgsbincr")==="0",Ch=e.get("dbgsblod")==="1",Rh=e.get("dbgsbpool")==="1",zh=e.get("dbgsbpool")==="0",kh=e.get("dbgsbmesh")==="0",Ah=e.get("dbgsbadapt")==="0",Ol=e.get("dbgsbcull")==="1"}catch{}var je={updates:0,skips:0,computes:0,readbacksResolved:0,readbackErrors:0,fieldsFull:0,fieldsWindowed:0,lastWindowBricks:0,refines:0,lastDispatchRes:0,regathers:0,readbackPending:!1,lastTotal:-1,lastPass:"",marchPositions:null},Si=24576,Tg=Math.cos(8*Math.PI/180);function Vs(e,t,a=1){return new Ee(e,t,{count:a,format:Sd,type:Xt,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:Oe,magFilter:Oe,wrapS:ns,wrapT:ns})}var Nu=class{constructor(e=0,t=0,a=0){this.wantsReplacement=!1,this.capacityHint=0,this._builtOnce=!1,this.level=-1,this.spatialnAtBuild=-1,this._passesRenderer=null,this._marchCapacity=0,this._marchBuffers=null,this._computeNode=null,this._computeNodeKey="",this._legacyMaterialsLevel=-1,this._computeDirty=!1,this._cachedAtBuild=!1,this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,this._lastFieldChangeMs=0,this._ultraResAtBuild=0,this._ultraReadbackPending=!1,this._ultraReadbackQueued=!1,this._ultraWantedCapacity=0,this._poolAtBuild=0,this._ultraWantedPoolBricks=0,this.poolHint=0,this._drawIndex=null,this._vertexBuffers=null,this._vertBlocksAtBuild=0,this._ultraWantedVertexBlocks=0,this.vertHint=0,this._cullCamera=null,this._lastGatherMVP=new Ra,this._hasGatherMVP=!1,this._ultraRetired=[],this._retiredStorage=[],this._ultraBuildSeq=0,this._lastRenderer=null,this._meshBaker=null,this._meshAtBuild=!1,this._meshSlots=new Map,this._meshBakeFailed=new Map,this._meshWarnedFull=!1,this.shapesTex=re(new Lt),this.spatialTexNode=re(new Lt),this.potentialTexNode=re(new Lt),this.voxelTexNode=re(new Lt),this.pyramid1TexNode=re(new Lt),this.pyramid2TexNode=re(new Lt),this.npartUniform=L(0),this.spatialnUniform=L(1),this.spanUniform=L(0),this.spatialMaterial=null,this.potentialMaterial=null,this.voxelMaterial=null,this.spatialTargets=[],this.potentialTargets=[],this.voxelTargets=[],this.pyramidTargets=[],this.retired=!1,this._onSettled=[],this.capacityHint=e,this.poolHint=t,this.vertHint=a;let r=hn(),s=new fr(r.triTable,16,256,or,Xt);s.needsUpdate=!0;let i=new fr(r.numTrisTable,256,1,or,Xt);i.needsUpdate=!0,this.triTableTexNode=re(s),this.numTrisTableTexNode=re(i)}shapeRow(e,t){return this.shapesTex.sample(A(e,(t+.5)/5))}_quadMaterial(e,t){let a=new ke;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Ft,a.needsUpdate=!0,a}_buildSpatialMaterial(e){let t=e.spatialDivisions,a=ad,r=rd,s=this.npartUniform,i=this.spatialnUniform,n=this.spanUniform,l=e.spatialn,o=U(()=>{let u=A(t*l,t**2),d=J(Ie().mul(u)).toVar(),m=d.y.toVar(),h=m.sub(J(m.div(t)).mul(t)).toVar();m.assign(J(m.div(t)));let f=m,p=d.x.toVar(),_=p.sub(J(p.div(i)).mul(i)).toVar().mul(4*a).toVar();p.assign(J(p.div(i)));let y=w(p,h,f),g=y.div(t).mul(2).sub(1).sub(n).toVar(),x=y.add(1).div(t).mul(2).sub(1).add(n).toVar(),v=V=>{let T=c(0).toVar();for(let z=a-1;z>=0;z--){let b=V.add(z),M=b.add(.5).div(r),S=this.shapeRow(M,0),C=vg(S.xyz),R=ca(S.w);T.mulAssign(2);let k=ca(g.x).lessThan(ca(C.x)).and(ca(C.x).lessThan(ca(x.x))).and(ca(g.y).lessThan(ca(C.y))).and(ca(C.y).lessThan(ca(x.y))).and(ca(g.z).lessThan(ca(C.z))).and(ca(C.z).lessThan(ca(x.z))).and(b.lessThan(ca(s))).or(R.equal(-2));T.addAssign(k.select(c(1),c(0)))}return T};return P(v(_),v(_.add(a)),v(_.add(2*a)),v(_.add(3*a)))})();return this._quadMaterial("SplineShapeBlend.spatial",o)}_fieldEnv(e,t){return{shapeRow:(a,r)=>this.shapeRow(a,r),spatialTex:this.spatialTexNode,spatialDivisions:e.spatialDivisions,spatialn:e.spatialn,colorKBump:t,meshSdf:this._meshBaker?yg(this._meshBaker.atlas):void 0}}_buildPotentialMaterial(e){let t=e.spatialDivisions,a=e.resolution,r=a-1,s=1/a,i=e.zLayersPerRow,n=e.basePyramidSize,l=Il(this._fieldEnv(e,2*s)),o=U(()=>{let u=J(Ie().mul(A(n,n))).toVar(),d=u.x.mod(a),m=u.y.mod(a),h=J(u.x.mul(s)).add(J(u.y.mul(s)).mul(i)),f=w(d,m,h),p=f.div(r).mul(2).sub(1).toVar(),_=J(f.div(r).mul(t-1)).toVar(),{sdf:y,color:g}=l(p,_),x=Le(g.x.mul(255)),v=Le(g.y.mul(255)),V=x.shiftLeft(Le(8)).bitOr(v);return P(y,V.toFloat().mul(1525902e-11),g.z,g.w)})();return this._quadMaterial("SplineShapeBlend.potential",o)}_buildVoxelMaterial(e){let t=e.resolution,a=t-1,r=1/t,s=e.zLayersPerRow,i=e.basePyramidSize,n=ph(t,s),l=this.potentialTexNode,o=()=>{let h=J(Ie().mul(A(i,i))).toVar();return{xi:h.x.mod(t).toVar(),yi:h.y.mod(t).toVar(),zi:J(h.x.mul(r)).add(J(h.y.mul(r)).mul(s)).toVar()}},u=(h,f,p)=>{let _=(y,g,x,v)=>n(h.add(y),f.add(g),p.add(x),l).x.lessThan(0).toFloat().mul(v);return _(0,0,0,1).add(_(1,0,0,2)).add(_(0,1,0,8)).add(_(1,1,0,4)).add(_(0,0,1,16)).add(_(1,0,1,32)).add(_(0,1,1,128)).add(_(1,1,1,64))},d=U(()=>{let{xi:h,yi:f,zi:p}=o(),_=((x,v,V)=>{let T=n(x.add(1),v,V,l).x.sub(n(x.sub(1),v,V,l).x),z=n(x,v.add(1),V,l).x.sub(n(x,v.sub(1),V,l).x),b=n(x,v,V.add(1),l).x.sub(n(x,v,V.sub(1),l).x);return T.equal(0).and(z.equal(0)).and(b.equal(0)).select(w(.199,.299,.399),ae(w(T,z,b)))})(h,f,p).toVar(),y=P(_,0).toVar(),g=h.greaterThanEqual(a).or(f.greaterThanEqual(a)).or(p.greaterThanEqual(a));return B(g.not(),()=>{y.assign(P(_,u(h,f,p)))}),y})(),m=U(()=>{let{xi:h,yi:f,zi:p}=o(),_=P(0).toVar(),y=h.greaterThanEqual(a).or(f.greaterThanEqual(a)).or(p.greaterThanEqual(a));return B(y.not(),()=>{let g=u(h,f,p);_.assign(this.numTrisTableTexNode.sample(A(g.add(.5).div(256),.5)))}),_})();return this._quadMaterial("SplineShapeBlend.voxel",Hs({output:d,numTris:m}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=Vs(e.spatialDivisions*e.spatialn,e.spatialDivisions**2),this.spatialTargets[t]=a),a}_targetsFor(e){let t=e.resolutionLevel,a=this._spatialTargetFor(e),r=this.potentialTargets[t];r||(r=Vs(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=Vs(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=or,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];
5return i||(i=[Vs(e.pyramidTexture1Width,e.pyramidTexture1Height),Vs(e.pyramidTexture2Width,e.pyramidTexture2Height)],this.pyramidTargets[t]=i),{spatial:a,potential:r,voxel:s,pyramid:i}}_marchResources(e){let t=this._targetsFor(e),a=e.pyramidLevelSizes.length%2==0?0:1,r=1-a;return{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:t.pyramid[r].width,height:t.pyramid[r].height},pyramid2Size:{width:t.pyramid[a].width,height:t.pyramid[a].height}}}_maxMarchSlots(e){let t=e.backend?.device?.limits,a=Math.min(t?.maxStorageBufferBindingSize??134217728,t?.maxBufferSize??268435456);return 192*Math.floor(a/16/192)}_ensureMarchCapacity(e,t){if(this._marchBuffers!==null&&e<=this._marchCapacity)return!1;let a=Math.min(Math.max(t,Si),192*Math.ceil(1.5*e/192));if(this._marchBuffers!==null&&a<=this._marchCapacity)return!1;if(this._marchBuffers!==null)for(let r of[this._marchBuffers.positions,this._marchBuffers.normals,this._marchBuffers.colors]){let s=r.value;s&&this._retiredStorage.push(s)}return this._marchBuffers={positions:ft(a,"vec4"),normals:ft(a,"vec4"),colors:ft(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(je.updates++,this._lastRenderer=t,a!==void 0&&(this._cullCamera=a),e._meshSdfBaked.size>0)for(let[b,M]of e._meshSdfBaked)M.owner!==this&&e._meshSdfBaked.delete(b);let r=Qh(e),s=t.backend?.isWebGPUBackend===!0;if(s&&e._meshSdfWanted.size>0&&this._meshBaker===null&&(this._meshBaker=(function(b,M){let S=new ts(192,48*Math.ceil(4),48);S.format=or,S.type=Xt,S.minFilter=Oe,S.magFilter=Oe,S.name="SplineShapeBlend.meshSdfAtlas";let C=c(M).mul(0),R=L(new ne(0,0,0)),k=L(0),E=L(new ne(1,1,1)),I=ft(3*Dl,"vec4"),D=j=>
vendor: 3,321 bytes, line 5
5I.element(j),H=U(()=>{let j=w(fa).toVar();B(j.x.greaterThanEqual(48).or(j.y.greaterThanEqual(48)).or(j.z.greaterThanEqual(48)),()=>{Qe()});let Z=j.div(47).mul(2).sub(1).mul(E).toVar(),$=c(1e30).toVar(),me=c(1e15).toVar();We(Dl,({i:ce})=>{B(c(ce).greaterThanEqual(k),()=>{sa()});let Me=N(c(ce).toVar()).mul(3).toVar(),fe=D(Me).xyz.toVar(),Te=D(Me.add(N(1))).xyz.toVar(),Be=D(Me.add(N(2))).xyz.toVar(),$e=Te.sub(fe).toVar(),Ge=Be.sub(fe).toVar(),Ye=Z.sub(fe).toVar(),Ue=q($e,Ye).toVar(),wt=q(Ge,Ye).toVar(),Yt=Z.sub(Te).toVar(),rt=q($e,Yt).toVar(),yt=q(Ge,Yt).toVar(),It=Z.sub(Be).toVar(),Re=q($e,It).toVar(),st=q(Ge,It).toVar(),De=w(0).toVar(),qt=rt.mul(st).sub(Re.mul(yt)).toVar(),bt=Re.mul(wt).sub(Ue.mul(st)).toVar(),Fe=Ue.mul(yt).sub(rt.mul(wt)).toVar();B(Ue.lessThanEqual(0).and(wt.lessThanEqual(0)),()=>{De.assign(fe)}).ElseIf(rt.greaterThanEqual(0).and(yt.lessThanEqual(rt)),()=>{De.assign(Te)}).ElseIf(st.greaterThanEqual(0).and(Re.lessThanEqual(st)),()=>{De.assign(Be)}).ElseIf(Fe.lessThanEqual(0).and(Ue.greaterThanEqual(0)).and(rt.lessThanEqual(0)),()=>{let ye=Ue.div(Ue.sub(rt));De.assign(fe.add($e.mul(ye)))}).ElseIf(bt.lessThanEqual(0).and(wt.greaterThanEqual(0)).and(st.lessThanEqual(0)),()=>{let ye=wt.div(wt.sub(st));De.assign(fe.add(Ge.mul(ye)))}).ElseIf(qt.lessThanEqual(0).and(yt.sub(rt).greaterThanEqual(0)).and(Re.sub(st).greaterThanEqual(0)),()=>{let ye=yt.sub(rt).div(yt.sub(rt).add(Re.sub(st)));De.assign(Te.add(Be.sub(Te).mul(ye)))}).Else(()=>{let ye=c(1).div(qt.add(bt).add(Fe)),it=bt.mul(ye),ma=Fe.mul(ye);De.assign(fe.add($e.mul(it)).add(Ge.mul(ma)))});let ze=Z.sub(De).toVar(),Ke=q(ze,ze).toVar();B(Ke.lessThan($),()=>{$.assign(Ke);let ye=_t($e,Ge),it=q(ze,ye).greaterThanEqual(0).select(c(1),c(-1));me.assign(Ea(Ke).mul(it))})});let ue=Q(E.x,Q(E.y,E.z));Vr(S,ra(j.add(R)),P(me.div(ue).add(C),0,0,0)).toStack()})(),K=Math.ceil(12),O=H.compute([K,K,K],[4,4,4]);return{atlas:S,slots:16,kernel:O,uniforms:{slotOrigin:R,triCount:k,boxHalf:E},setTriangles(j,Z){let $=I.value;$.array.set(j.subarray(0,12*Z)),$.needsUpdate=!0}}})(0,++this._ultraBuildSeq)),e.npart===0)return this._meshBaker!==null&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t),void(e.geometry.drawRange.count=0);this.npartUniform.value=e.npart,this.spatialnUniform.value=e.spatialn,this.spanUniform.value=e.spatialPassUniforms.span.value,e.shapesDataTexture.value&&(this.shapesTex.value=e.shapesDataTexture.value);let i=!wh&&s,n=i&&!Sh&&e.ultraFieldResolution>0,l=n&&!zh&&(Rh||e.ultraFieldResolution>=512)?Math.min(Math.pow(e.ultraFieldResolution/4,3),Math.max((function(b){let M=b/4;return Math.min(M*M*M,Math.max(8192,16*M*M))})(e.ultraFieldResolution),this._ultraWantedPoolBricks,this.poolHint)):0,o=l>0&&!kh,u=this._maxMarchSlots(t),d=o?Math.min(Math.floor(u/64),Math.max((function(b){let M=b/4;return Math.min(262144,Math.max(2048,2*M*M))})(e.ultraFieldResolution),this._ultraWantedVertexBlocks,this.vertHint)):0,m=this._meshBaker!==null,h=e.needsRebuild||this.level!==e.resolutionLevel||this.spatialnAtBuild!==e.spatialn||this._cachedAtBuild!==i||this._ultraResAtBuild!==(n?e.ultraFieldResolution:0)||this._poolAtBuild!==l||this._vertBlocksAtBuild!==d||this._meshAtBuild!==m;if(h&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=
5Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let f=i&&this._ensureMarchCapacity(Math.min(Math.max(u,Si),Math.max(e.geometry.drawRange.count,this.capacityHint,n?Math.max((function(b){return Math.max(Si,192*Math.ceil(16*b*b/192))})(e.ultraFieldResolution),this._ultraWantedCapacity):Si)),u);if(f&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let p=this._spatialTargetFor(e),_=n?null:this._targetsFor(e),y=h||f,g=n&&this._ultra!==null&&this._ultraResAtBuild===e.ultraFieldResolution&&!f&&this.level===e.resolutionLevel&&this.spatialnAtBuild===e.spatialn&&this._cachedAtBuild===i;if(y&&g)e.needsRebuild=!1,this._ultra.uniforms.bboxHalf.value=e.bboxSize/2,this._ultra.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag&&(this._ultraDrag.uniforms.bboxHalf.value=e.bboxSize/2,this._ultraDrag.uniforms.bboxOffset.value=e.bboxOffset);else if(y){e.needsRebuild=!1;let b=this.spatialnAtBuild!==e.spatialn;this.level=e.resolutionLevel,this.spatialnAtBuild=e.spatialn,this._meshAtBuild=m,(b||this.spatialMaterial===null)&&(this.spatialMaterial?.dispose(),this.spatialMaterial=this._buildSpatialMaterial(e)),this.spatialTexNode.value=p.texture;let M=this._ultra,S=this._ultraDrag;if(this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,n){let k=e.ultraFieldResolution,E=M!==null&&this._ultraResAtBuild===k;if(E&&!f)this._ultra=M,M.uniforms.bboxHalf.value=e.bboxSize/2,M.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag=S,S&&(S.uniforms.bboxHalf.value=e.bboxSize/2,S.uniforms.bboxOffset.value=e.bboxOffset);else{let I=E&&l===0&&!M.sparse;M&&!I&&this._ultraRetired.push(M.sdfTexture,M.colorTexture,M.coarseTexture),o&&this._drawIndex===null&&(this._drawIndex=ft(this._marchCapacity,"uint")),o&&this._vertexBuffers===null&&(this._vertexBuffers={positions:ft(64*d,"vec4"),normals:ft(64*d,"vec4"),colors:ft(64*d,"vec4")}),this._ultra=Eu({resolution:k,colorResolution:k/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(k/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:hn().numTrisTable,buffers:o?this._vertexBuffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,sparseStorage:l>0?{poolBricks:l,meshlet:o?{drawIndex:this._drawIndex,vertexBlocks:d}:void 0}:void 0,reuseTextures:I?{sdfTexture:M.sdfTexture,colorTexture:M.colorTexture,coarseTexture:M.coarseTexture}:void 0}),this._poolAtBuild=l,this._vertBlocksAtBuild=d;let D=Ch&&k>=128&&!o?k/2:0;S&&(!E||D===0)&&this._ultraRetired.push(S.sdfTexture,S.colorTexture,S.coarseTexture),D>0&&(this._ultraDrag=Eu({resolution:D,colorResolution:D/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(D/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:hn().numTrisTable,buffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,reuseTextures:E&&S?{sdfTexture:S.sdfTexture,colorTexture:S.colorTexture,coarseTexture:S.coarseTexture}:void 0}))}this._ultraResAtBuild=k}else{M&&this._ultraRetired.push(M.sdfTexture,M.colorTexture,M.coarseTexture),S&&this._ultraRetired.push(S.sdfTexture,S.colorTexture,S.coarseTexture),(this._legacyMaterialsLevel!==e.resolutionLevel||b||this.potentialMaterial===null||this.voxelMaterial===null)&&(this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose(),this.potentialMaterial=this._buildPotentialMaterial(e),this.voxelMaterial=this._buildVoxelMaterial(e),this._legacyMaterialsLevel=e.resolutionLevel),this.potentialTexNode.value=_.potential.texture,this.voxelTexNode.value=_.voxel.textures[0];let k=e.pyramidLevelSizes.length%2==0?0:1,E=1-k;this.pyramid1TexNode.value=_.pyramid[E].texture,this.pyramid2TexNode.value=_.pyramid[k].texture,this._ultraResAtBuild=0}let C=e.material;C.defines===void 0&&(C.defines={}),Mr.includes("nomat")||(C.defines.SHAPEBLEND=e.resolutionLevel),Mr.includes("nomat")||C.setShapeBlendResources?.(n?{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:1,height:1}
5,pyramid2Size:{width:1,height:1},cached:o?{...this._vertexBuffers,drawIndex:this._drawIndex}:this._marchBuffers}:{...this._marchResources(e),cached:i?this._marchBuffers:void 0}),this._cachedAtBuild=i;let R=`${e.resolutionLevel}:${this._marchCapacity}`;this._computeNodeKey!==R&&(this._computeNode=null,this._computeNodeKey=R)}if(y)return this._builtOnce=!0,void(this._computeDirty=!0);this._meshBaker!==null&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t);let x=this._passesRenderer!==t,v=r&&!Mh&&!this._computeDirty&&!x&&!e._fieldDirtyFull;if(!(r||this._computeDirty||x)){if(n&&this._refinePending&&this._ultra!==null&&performance.now()-this._lastFieldChangeMs>250)return this._refinePending=!1,this._passesRenderer=t,je.refines++,void this._runUltra(e,t,!1,this._ultra);if(n&&Ol&&this._ultra!==null&&this._ultra.meshlet&&this._lastDispatched===this._ultra&&!this._ultraReadbackPending&&this._updateCullUniforms(e,this._ultra)&&(!this._hasGatherMVP||!this._lastGatherMVP.equals(this._ultra.uniforms.cullMVP.value))){this._lastGatherMVP.copy(this._ultra.uniforms.cullMVP.value),this._hasGatherMVP=!0,je.regathers++;let b=t;return b.compute(this._ultra.kernels.zero),Ul||b.compute(this._ultra.kernels.clearDraw),b.compute(this._ultra.kernels.gather),this._ultra.kernels.stats&&b.compute(this._ultra.kernels.stats),void this._runUltraReadback(e,t)}if(!e.drawRangeNeedsForceUpdate)return void je.skips++;if(n)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,Mr.includes("none")&&je.readbacksResolved>0)return void(this._computeDirty=!1);let V=t.getRenderTarget(),T=t.getMRT(),z=t.autoClear;if(t.setMRT(null),t.autoClear=!1,je.lastPass="spatial",t.setRenderTarget(p),tr.material=this.spatialMaterial,tr.render(t),n){t.autoClear=z,t.setRenderTarget(V),t.setMRT(T);let b=this._ultraDrag!==null&&r&&!this._computeDirty;return this._refinePending=b,this._lastFieldChangeMs=performance.now(),this._runUltra(e,t,v,b?this._ultraDrag:this._ultra),void(this._computeDirty=!1)}return Mr==="spatial"&&je.readbacksResolved>0?(t.autoClear=z,t.setRenderTarget(V),t.setMRT(T),void(this._computeDirty=!1)):(je.lastPass="potential",t.setRenderTarget(_.potential),tr.material=this.potentialMaterial,tr.render(t),Mr==="potential"&&je.readbacksResolved>0?(t.autoClear=z,t.setRenderTarget(V),t.setMRT(T),void(this._computeDirty=!1)):(je.lastPass="voxel",t.setRenderTarget(_.voxel),tr.material=this.voxelMaterial,tr.render(t),Mr==="voxel"&&je.readbacksResolved>0?(t.autoClear=z,t.setRenderTarget(V),t.setMRT(T),void(this._computeDirty=!1)):(je.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=z,t.setRenderTarget(V),t.setMRT(T),je.lastPass="march",i&&(this._computeNode===null&&(this._computeNode=(function(b,M,S){let C=gh(b);return U(()=>{let{position:R,normal:k,color:E}=C(Kt.toFloat());M.positions.element(Kt).assign(P(R,1)),M.normals.element(Kt).assign(P(k,0)),M.colors.element(Kt).assign(E)})().compute(S)})(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),je.computes++),void(this._computeDirty=!1))))}_bakeNextMeshChild(e,t){let a=this._meshBaker;for(let[r,s]of e._meshSdfWanted){let i=Zh(s);if(this._meshBakeFailed.get(r)===i)continue;let n=this._meshSlots.get(r);if(n===void 0){if(this._meshSlots.size>=a.slots)for(let u of this._meshSlots.keys())!e._meshSdfBaked.has(u)&&!e._meshSdfWanted.has(u)&&(this._meshSlots.delete(u),this._meshBakeFailed.delete(u));if(this._meshSlots.size>=a.slots){this._meshWarnedFull||(this._meshWarnedFull=!0,console.warn(`Spline shape blend: more than ${a.slots} distinct mesh children â the extra meshes are left out of the blend.`));continue}let o=new Set(this._meshSlots.values());for(n=0;o.has(n);)n++;this._meshSlots.set(r,n)}let l=_g(s);if(l!==null)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(xg(n)),a.uniforms.triCount.value=l.triCount,a.uniforms.boxHalf.value.copy(l.boxHalf),t.compute(a.kernel),e._meshSdfBaked.set(r,{slot:n,boxHalf:l.boxHalf.clone(),posVersion:i,owner:this}),void e._meshSdfWanted.delete(r);this._meshBakeFailed.set(r,i)}}_updateCullUniforms(e,t){if(!t.meshlet)return!1;let a=this._cullCamera;return Ol&&a&&a.projectionMatrix!==void 0&&a.matrixWorldInverse!==void 0?(t.uniforms.cullMVP.value.multiplyMatrices(W.unjitteredProjection.value,a.matrixWorldInverse).multiply(e.matrixWorld),t.uniforms.cullEnabled.value=1,!0):(t.uniforms.cullEnabled.value=0,!1)}_runUltra(e,t,a,r){let s=t;je.lastPass="ultra-kernels",je.lastDispatchRes=r.resolution,je.marchPositions=(r.meshlet?this._vertexBuffers:this._marchBuffers).positions.value,this._lastDispatched=r;let i=r.resolution,n=i/4,l=2/(i-1);r.uniforms.activeThreshold.value=Vh?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!Ah;r.meshlet&&(r.uniforms.adaptCos.value=o?Tg:2);let u=0,d=0,m=0,h=n,f=n,p=n;if(a){let g=r.uniforms.activeThreshold.value+2/(e.spatialDivisions-1)+4/(i-1),x=T=>Math.floor(.5*(T+1)*(i-1)/4),v=T=>Math.min(n-1,Math.max(0,x(T))),V=T=>Math.min(n,Math.max(1,x(T)+1));if(u=v(e._fieldDirtyMin.x-g),d=v(e._fieldDirtyMin.y-g),m=v(e._fieldDirtyMin.z-g),h=V(e._fieldDirtyMax.x+g)-u,f=V(e._fieldDirtyMax.y+g)-d,p=V(e._fieldDirtyMax.z+g)-m,je.fieldsWindowed++,o){let T=Math.min(n,u+h+1),z=Math.min(n,d+f+1),b=Math.min(n,m+p+1);u=Math.max(0,u-1),d=Math.max(0,d-1),m=Math.max(0,m-1),h=T-u,f=z-d,p=b-m}}else je.fieldsFull++;je.lastWindowBricks=h*f*p,r.uniforms.windowOrigin.value.set(u,d,m),r.uniforms.windowSize?.value.set(h,f,p);let _=u===0&&d===0&&m===0&&h===n&&f===n&&p===n,y=[Math.ceil(h/4),Math.ceil(f/4),Math.ceil(p/4)];r.meshlet&&this._updateCullUniforms(e,r)&&(this._lastGatherMVP.copy(r.uniforms.cullMVP.value),this._hasGatherMVP=!0),s.compute(r.kernels.zero),Ul||s.compute(r.meshlet?r.kernels.clearDraw:r.kernels.clear),r.needsInit&&r.kernels.init&&(s.compute(r.kernels.init),r.needsInit=!1),s.compute(r.kernels.coarse,y),r.kernels.release&&s.compute(r.kernels.release,y),r.kernels.alloc&&s.compute(r.kernels.alloc,y),r.kernels.meshRelease&&s.compute(r.kernels.meshRelease,y),r.sparse?_?s.compute(r.kernels.sdf):s.compute(r.kernels.sdfWindow,[h,f,p]):s.
vendor: 25,283 bytes, lines 5-32
5compute(r.kernels.sdf,[h,f,p]),r.kernels.classify&&s.compute(r.kernels.classify,y),s.compute(r.kernels.color,[Math.ceil(h/2),Math.ceil(f/2),Math.ceil(p/2)]),r.meshlet?(_?(s.compute(r.kernels.verts),s.compute(r.kernels.extract)):(s.compute(r.kernels.vertsWindow,[h,f,p]),s.compute(r.kernels.extractWindow,[h,f,p])),s.compute(r.kernels.gather)):s.compute(r.kernels.extract),r.kernels.stats&&s.compute(r.kernels.stats),je.computes++,this._ultraReadbackPending?this._ultraReadbackQueued=!0:this._runUltraReadback(e,t)}_disposeRetired(){for(let e of this._ultraRetired)e.dispose();if(this._ultraRetired.length=0,this._retiredStorage.length>0){let e=this._lastRenderer?.backend?.attributeUtils;if(e)for(let t of this._retiredStorage)e.destroyAttribute(t);this._retiredStorage.length=0}for(let e of this._onSettled)e();this._onSettled.length=0}runWhenSettled(e){this._onSettled.push(e)}transferSettleQueue(e){e._onSettled.push(...this._onSettled),this._onSettled.length=0}_runUltraReadback(e,t){let a=this._lastDispatched??this._ultra,r=t;this._ultraReadbackPending=!0,je.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(s=>{if(this._ultraReadbackPending=!1,je.readbackPending=!1,this.retired)return;this._disposeRetired();let i=new Uint32Array(s),n=a.meshlet?Math.floor(i[3]/3):i[0];if(je.readbacksResolved++,je.lastTotal=n,a.sparse&&i.length>2&&i[2]>0&&(this._ultraWantedPoolBricks=Math.ceil(1.5*Math.max(i[1],a.poolBricks)),this._computeDirty=!0),a.meshlet&&i.length>5&&i[5]>0){let o=Math.min(24*i[4],this._maxMarchSlots(t));o>this._marchCapacity&&(this._ultraWantedCapacity=Math.max(this._ultraWantedCapacity,o),this._computeDirty=!0)}if(a.meshlet&&i.length>7&&i[7]>0){let o=Math.min(Math.ceil(1.5*i[6]),Math.floor(this._maxMarchSlots(t)/64));o>a.vertexBlocks&&(this._ultraWantedVertexBlocks=Math.max(this._ultraWantedVertexBlocks,o),this._computeDirty=!0)}let l=Math.floor(this._marchCapacity/3);if(e.geometry.drawRange.count=3*Math.min(Math.ceil(1.25*n),l),e.markSceneShadowsDirty(),e.drawRangeNeedsForceUpdate=!1,this._ultraReadbackQueued&&(this._ultraReadbackQueued=!1,this._runUltraReadback(e,t)),n>l){let o=Math.min(3*n,this._maxMarchSlots(t));o>this._marchCapacity&&(this._ultraWantedCapacity=o,this._computeDirty=!0)}}).catch(()=>{je.readbackErrors++,this._ultraReadbackPending=!1,je.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;Oi.value=0,Ss.value=0;for(let l=i;l>=0;l--){let o=l%2==i%2?r[0]:r[1],u=l===i?a:l%2==i%2?r[1]:r[0];Fs.value=u.textures.length>1?u.textures[1]:u.texture,vh.value=u.width,bh.value=u.height;let d=s[l];l===2&&e.resolutionLevel%2!=0&&(d=3),Th.value=d,o.viewport.set(Ss.value,0,d,d),t.setRenderTarget(o),tr.material=bg(),tr.render(t),o.viewport.set(0,0,o.width,o.height);let m=Oi.value;Oi.value=Ss.value,Ss.value=m,l<i&&(Ss.value+=s[l+1])}je.lastPass="pyramid-readback";let n=s.length%2==0?0:1;t.readRenderTargetPixelsAsync(r[n],r[n].width-1,0,1,1).then(l=>{let o=l[0];je.readbacksResolved++,je.lastTotal=o,!this.retired&&(this._disposeRetired(),(3*o>e.geometry.drawRange.count||e.drawRangeNeedsForceUpdate)&&(e.geometry.drawRange.count=3*Math.floor(1.2*o)),e.drawRangeNeedsForceUpdate=!1,this._marchBuffers!==null&&e.geometry.drawRange.count>this._marchCapacity&&(this._computeDirty=!0))}).catch(()=>{})}dispose(){for(let s of[...this.spatialTargets,...this.potentialTargets,...this.voxelTargets,...this.pyramidTargets.flat()])s?.dispose();this.spatialMaterial?.dispose(),this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose();let e=this._lastRenderer?.backend?.attributeUtils,t=s=>{if(e&&s!==null)for(let i of[s.positions,s.normals,s.colors]){let n=i.value;n&&e.destroyAttribute(n)}},a=s=>{if(s!==null){for(let i of Object.values(s.kernels))i?.dispose?.();if(e)for(let i of s.storageAttributes)e.destroyAttribute(i)}};t(this._marchBuffers),t(this._vertexBuffers);let r=this._drawIndex?.value;e&&r&&e.destroyAttribute(r),this._drawIndex=null,this._computeNode?.dispose?.(),this._marchBuffers=null,this._vertexBuffers=null,this._computeNode=null,this._computeNodeKey="",this._marchCapacity=0,a(this._ultra),this._ultra?.sdfTexture.dispose(),this._ultra?.colorTexture.dispose(),this._ultra?.coarseTexture.dispose(),this._ultra=null,a(this._ultraDrag),this._ultraDrag?.sdfTexture.dispose(),this._ultraDrag?.colorTexture.dispose(),this._ultraDrag?.coarseTexture.dispose(),this._ultraDrag=null,this._meshBaker?.atlas.dispose(),this._meshBaker=null,this._lastDispatched=null,this._disposeRetired(),this._lastRenderer=null}},Ms=new WeakMap,Vi=new WeakMap,Cs=[];Yh(function(e){if(e.cached)return(function(s){let i=()=>s.drawIndex?s.drawIndex.element(Ni):Ni;return{position:U(n=>{let l=s.positions.element(i()).xyz.toVar();return Pu(n,l),l})(),normal:mo(s.normals.element(i()).xyz),color:mo(s.colors.element(i()))}})(e.cached);let t=gh(e),a=mt("vec3","vShapeBlendNormal"),r=mt("vec4","vShapeBlendColor");return{position:U(s=>{let{position:i,normal:n,color:l}=t(Ni.toFloat());return a.assign(n),r.assign(l),Pu(s,i),i})(),normal:a,color:r}}),$h(e=>(function(t){let a=Ms.get(t);if(a?.wantsReplacement){let r=Vi.get(t);Vi.set(t,a),a.retired=!0;let s=new Nu(a.capacityHint,a.poolHint,a.vertHint);a.transferSettleQueue(s),r&&s.runWhenSettled(()=>r.dispose()),a=s,Ms.set(t,a)}return a||(a=new Nu,Ms.set(t,a)),a})(e)),Xh({release:e=>(function(t){let a=Ms.get(t),r=Vi.get(t);Ms.delete(t),Vi.delete(t),r&&Cs.push(r),a&&(a.retired=!0,Cs.push(a))})(e),drainRetired:function(){let e=Cs.length;if(e>0){for(let t of Cs)t.dispose();Cs.length=0}return e}});var pa=[64,1,1],ta=Cc,Ba=ta-1,_e=(e,t)=>t!==void 0?L(e,t):L(e),Da=(e,t)=>{let a=e.xyz,r=_t(a,t),s=_t(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Bu=U(([e,t])=>{let a=e,r=t,s=q(a,r).add(1).toVar(),i=w(0).toVar();return B(s.lessThan(1e-7),()=>{s.assign(0),B(de(a.x).greaterThan(de(a.z)),()=>{i.assign(w(a.y.negate(),a.x,0))}).Else(()=>{i.assign(w(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(_t(a,r))}),(n=>{let l=q(n,n);return l.lessThan(1e-10).select(P(0,0,0,1),n.mul(hd(Q(l,1e-20))))})(P(i,s))}),Qn=e=>(t=>t.sub(J(t.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),Zn=U(([e])=>{let t=e,a=1/6,r=1/3,s=J(t.add(q(t,w(r)))).toVar(),i=t.sub(s).add(q(s,w(a))).toVar(),n=Ne(i.yzx,i.xyz).toVar(),l=w(1).sub(n).toVar(),o=xe(n,l.zxy).toVar(),u=Q(n,l.zxy).toVar(),d=i.sub(o).add(a).toVar(),m=i.sub(u).add(r).toVar(),h=i.sub(.5).toVar();s.assign(($=>$.sub(J($.mul(1/289)).mul(289)))(s));let f=Qn(Qn(Qn(P(0,o.z,u.z,1).add(s.z)).add(s.y).add(P(0,o.y,u.y,1))).add(s.x).add(P(0,o.x,u.x,1))).toVar(),p=.142857142857,_=2*p,y=.5*p-1,g=p,x=f.sub(J(f.mul(g*g)).mul(49)).toVar(),v=J(x.mul(g)).toVar(),V=J(x.sub(v.mul(7))).toVar(),T=v.mul(_).add(y).toVar(),z=V.mul(_).add(y).toVar(),b=P(1).sub(de(T)).sub(de(z)).toVar(),M=P(T.xy,z.xy).toVar(),S=P(T.zw,z.zw).toVar(),C=J(M).mul(2).add(1).toVar(),R=J(S).mul(2).add(1).toVar(),k=Ne(b,P(0)).negate().toVar(),E=M.xzyw.add(C.xzyw.mul(k.xxyy)).toVar(),I=S.xzyw.add(R.xzyw.mul(k.zzww)).toVar(),D=w(E.xy,b.x).toVar(),H=w(E.zw,b.y).toVar(),K=w(I.xy,b.z).toVar(),O=w(I.zw,b.w).toVar(),j=($=>P(1.79284291400159).sub($.mul(.85373472095314)))(P(q(D,D),q(H,H),q(K,K),q(O,O))).toVar();D.assign(D.mul(j.x)),H.assign(H.mul(j.y)),K.assign(K.mul(j.z)),O.assign(O.mul(j.w));let Z=Q(P(.5).sub(P(q(i,i),q(d,d),q(m,m),q(h,h))),P(0)).toVar();return Z.assign(Z.mul(Z)),q(Z.mul(Z),P(q(D,i),q(H,d),q(K,m),q(O,h))).mul(105)}),wg=class extends _d{constructor(e,t,a,r,s){super(),this.tangentWorld=e,this.specularPower=t,this.specularIntensity=a,this.diffuseIntensity=r,this.ambientFloor=s}direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=ae(La.mul(P(this.tangentWorld,0)).xyz),i=t,n=Ks,l=ae(i.add(n)),o=Q(we(_t(s,i)),0),u=Q(we(_t(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Ta.rgb)),r.directSpecular.addAssign(a.mul(Ma(u,this.specularPower)).mul(this.specularIntensity).mul(w(1,.95,.9)))}indirect(e){let{irradiance:t,ambientOcclusion:a,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(1/Math.PI).add(this.ambientFloor).mul(Ta.rgb)),r.indirectDiffuse.mulAssign(a)}},Sg=class extends _d{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=na,n=Ks,l=ae(s.add(n)),o=q(i,s).clamp(),u=q(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Ta.rgb)),r.directSpecular.addAssign(a.mul(Ma(u,60)).mul(.3).mul(w(.3,.28,.25)))}indirect(e){let{irradiance:t,ambientOcclusion:a,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(1/Math.PI).add(.15).mul(Ta.rgb)),r.indirectDiffuse.mulAssign(a)}},Fu=class extends ke{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},ar=new Jl,Rs=new Jl,Mi=new ne,Vg=class{constructor(){this.uNumStrands=_e(0,"int"),this.uNumVerts=_e(0,"int"),this.uDamping=_e(.03),this.uLocalStiffness=_e(.67),this.uGlobalStiffness=_e(.5),this.uGlobalRange=_e(.15),this.uStiffnessFalloff=_e(.1),this.uGravity=_e(0),this.uVspCoeff=_e(.01),this.uVspThreshold=_e(50),this.uKink=_e(0),this.uKinkFreq=_e(0),this.uUnitScale=_e(100),this.uClumpStrength=_e(0),this.uClumpSize=_e(32,"int"),this.uClumpTipScale=_e(1.5),this.uReset=_e(1),this.uHasWind=_e(0),this.uWind0=_e(new ne),this.uWind1=_e(new ne),this.uWind2=_e(new ne),this.uWind3=_e(new ne),this.uBoneQuat=_e(new at(0,0,0,1)),this.uBoneTrans=_e(new ne),this.uDeltaQuat=_e(new at(0,0,0,1)),this.uPrevBoneTrans=_e(new ne),this.uHairRoot=_e(new gt),this.uHairMid=_e(new gt),this.uHairTip=_e(new gt),this.uHeadColor=_e(new gt),this.uNoiseA=_e(new gt),this.uNoiseB=_e(new gt),this.uNoiseC=_e(new gt),this.uNoiseD=_e(new gt),this.uNoiseScale=_e(.018),this.uNoiseMixHair=_e(0),this.uNoiseMixHead=_e(0),this.uWidth=_e(.525),this.uSpecPow=_e(40),this.uSpecInt=_e(.4),this.uDiffInt=_e(.6),this.uAmbInt=_e(.25),this.uOpacity=_e(1),this.uTipFade=_e(.4),this.uColorSource=_e(0),this.uShadeRoot=_e(.6),this.uShadeTip=_e(1.15),this.uShadowTexelWorld=_e(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new Jl,this._prevBonePos=new ne,this._hasPrevBone=!1,this._renderer=null,this.initialPos=ft(Fr,"vec4"),this.rootColors=ft(Tn,"vec4"),this.positions=ft(Fr,"vec4"),this.positionsPrev=ft(Fr,"vec4"),this.positionsPrevPrev=ft(Fr,"vec4"),this.tangents=ft(Fr,"vec4"),this.restLengths=ft(Fr,"float"),this.vspQuats=ft(Tn,"vec4"),this.vspTrans=ft(Tn,"vec4"),this.kIntegrate=this._buildIntegrate(),this.kStrandLevel=this._buildStrandLevel(),this.kVsp=this._buildVsp(),this.kLocalShape=this._buildLocalShape(),this.kLengthWind=this._buildLengthWind(),this.kClump=this._buildClump(),this.kRigidFollow=this._buildRigidFollow(),this.ribbonMaterial=this._buildRibbonMaterial(),this.scalpMaterial=this._buildScalpMaterial()}boneQuatNode(){return this.uBoneQuat}boneTransNode(){return this.uBoneTrans}_buildIntegrate(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumVerts),()=>{Qe()});let t=e.div(ta).toVar(),a=e.sub(t.mul(ta)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=P(Da(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();B(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();B(l.w.greaterThan(0),()=>{let m=c(Lr),h=Ql(this.uDamping.negate().mul(m).mul(60)),f=l.xyz.add(l.xyz.sub(u.xyz).mul(h)).add(w(0,-1,0).mul(this.uGravity).mul(m).mul(m));d.assign(P(f,l.w))}),B(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(ta))),()=>{let m=e.sub(a),h=this.initialPos.element(m),f=ae(Da(r,h.xyz)).y.mul(.5).add(.5),p=this.uGlobalStiffness.mul(Ma(Q(f,0),this.uStiffnessFalloff)),_=n.xyz.sub(d.xyz).mul(p);d.assign(P(d.xyz.add(_),d.w))}),B(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let m=a.toFloat().div(ta),h=t.sub(t.div(256).mul(256)).toFloat().mul(.0245),f=m.mul(this.uKinkFreq).mul(6.2831853).add(h),p=this.uKink.mul(m).mul(.15).mul(this.uUnitScale),_=ae(n.xyz.sub(s)).toVar(),y=w(0).toVar();B(de(_.y).lessThan(.99),()=>{y.assign(ae(_t(_,w(0,1,0))))}).Else(()=>{y.assign(ae(_t(_,w(1,0,0))))});let g=ae(_t(_,y)),x=y.mul(Zt(f)).mul(p).add(g.mul(ha(f.mul(1.3).add(h))).mul(p).mul(.7));d.assign(P(d.xyz.add(x),d.w))}),this.positionsPrevPrev.element(e).assign(o),this.positionsPrev.element(e).assign(l),this.positions.element(e).assign(d)})().compute(pa[0],pa)}_buildStrandLevel(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumStrands),()=>{Qe()});let t=e.mul(ta).toVar(),a=this.positionsPrevPrev.element(t.add(1)),r=this.positionsPrev.element(t),s=this.positionsPrev.element(t.add(1)),i=this.positions.element(t),n=this.positions.element(t.add(1)),l=s.xyz.sub(r.xyz),o=n.xyz.sub(i.xyz),u=l.div(Q(we(l),1e-7)),d=o.div(Q(we(o),1e-7)),m=Bu(u,d).toVar(),h=i.xyz.sub(Da(m,r.xyz)),f=this.uVspCoeff.toVar(),p=we(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));B(p.greaterThan(this.uVspThreshold),()=>{f.assign(1)}),this.vspQuats.element(e).assign(m),this.vspTrans.element(e).assign(P(h,f))})().compute(pa[0],pa)}_buildVsp(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumVerts),()=>{Qe()});let t=e.div(ta).toVar(),a=e.sub(t.mul(ta)).toVar();B(a.lessThan(2),()=>{Qe()});let r=this.vspQuats.element(t),s=this.vspTrans.element(t),i=s.w,n=this.positions.element(e).toVar(),l=this.positionsPrev.element(e).toVar(),o=u=>P(u.xyz.mul(c(1).sub(i)).add(Da(r,u.xyz).add(s.xyz).mul(i)),u.w);this.positions.element(e).assign(o(n)),this.positionsPrev.element(e).assign(o(l))})().compute(pa[0],pa)}_buildLocalShape(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumStrands),()=>{Qe()});let t=e.mul(ta).toVar(),a=xe(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();We(Ba-1,({i:s})=>{let i=t.add(s).add(1).toVar(),n=this.positions.element(i).toVar(),l=this.positions.element(i.add(1)).toVar(),o=this.positions.element(i.sub(1)),u=Da(r,this.initialPos.element(i).xyz),d=Da(r,this.initialPos.element(i.add(1)).xyz),m=Da(r,this.initialPos.element(i.sub(1)).xyz),h=n.xyz.sub(o.xyz),f=d.sub(u),p=u.sub(m),_=Bu(p.div(Q(we(p),1e-7)),h.div(Q(we(h),1e-7))),y=Da(_,f).add(n.xyz).sub(l.xyz).mul(a);B(n.w.greaterThan(0),()=>{n.assign(P(n.xyz.sub(y),n.w))}),B(l.w.greaterThan(0),()=>{l.assign(P(l.xyz.add(y),l.w))}),this.positions.element(i).assign(n),this.positions.element(i.add(1)).assign(l)})})().compute(pa[0],pa)}_buildLengthWind(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumStrands),()=>{Qe()});let t=e.mul(ta).toVar();B(this.uHasWind.greaterThan(.5),()=>{let a=e.sub(e.div(20).mul(20)).toFloat().div(20),r=this.uWind0.mul(a).add(this.uWind1.mul(c(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(c(1).sub(a))).toVar();We(Ba-2,({i:s})=>{let i=t.add(s).add(2).toVar(),n=this.positions.element(i).toVar(),l=this.positions.element(i.add(1)),o=n.xyz.sub(l.xyz),u=_t(_t(o,r),o).negate();n.assign(P(n.xyz.add(u.mul(Lr).mul(.1)),n.w)),this.positions.element(i).assign(n)})}),We(5,()=>{We(Ba,({i:a})=>{let r=t.add(a).toVar(),s=this.positions.element(r).toVar(),i=this.positions.element(r.add(1)).toVar(),n=this.restLengths.element(r),l=i.xyz.sub(s.xyz),o=Q(we(l),1e-7),u=c(1).sub(n.div(o)),d=l.mul(u),m=s.w.greaterThan(0),h=i.w.greaterThan(0),f=m.select(h.select(c(.5),c(1)),c(0)),p=h.select(m.select(c(.5),c(1)),c(0));s.assign(P(s.xyz.add(d.mul(f)),s.w)),i.assign(P(i.xyz.sub(d.mul(p)),i.w)),this.positions.element(r).assign(s),this.positions.element(r.add(1)).assign(i)})}),We(Ba,({i:a})=>{let r=t.add(a).add(1).toVar(),s=this.positions.element(r.sub(1)),i=this.positions.element(r).toVar(),n=i.xyz.sub(s.xyz),l=Q(we(n),1e-7),o=this.restLengths.element(r.sub(1));B(l.greaterThan(o),()=>{i.assign(P(s.xyz.add(n.div(l).mul(o)),i.w)),this.positions.element(r).assign(i)})}),We(ta,({i:a})=>{let r=t.add(a).toVar(),s=a.equal(ta-1).select(r.sub(1),r).toVar(),i=ae(this.positions.element(s.add(1)).xyz.sub(this.positions.element(s).xyz));this.tangents.element(r).assign(P(i,0))})})().compute(pa[0],pa)}_buildClump(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumStrands),()=>{Qe()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();B(e.equal(a),()=>{Qe()}),B(a.greaterThanEqual(this.uNumStrands),()=>{Qe()});let r=e.mul(ta).toVar(),s=a.mul(ta).toVar();We(Ba,({i})=>{let n=i.add(1).toVar(),l=n.toFloat().div(Ba),o=this.uClumpStrength.mul(Ma(l,c(1).div(Q(this.uClumpTipScale,.5)))),u=r.add(n).toVar(),d=this.positions.element(u).toVar(),m=this.positions.element(s.add(n));d.assign(P(X(d.xyz,m.xyz,o),d.w)),this.positions.element(u).assign(d)})})().compute(pa[0],pa)}_buildRigidFollow(){return U(()=>{let e=N(Kt).toVar();B(e.greaterThanEqual(this.uNumVerts),()=>{Qe()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=n=>{let l=n.element(e).toVar();l.assign(P(Da(t,l.xyz.sub(a)).add(r),l.w)),n.element(e).assign(l)};s(this.positions),s(this.positionsPrev),s(this.positionsPrevPrev);let i=this.tangents.element(e).toVar();i.assign(P(Da(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(pa[0],pa)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=Zn(t).mul(.5).add(.5),r=Zn(t.add(w(31.7,17.3,53.1))).mul(.5).add(.5),s=Zn(t.mul(.7).add(w(71.9,11.2,43.8))).mul(.5).add(.5),i=X(this.uNoiseA,this.uNoiseB,a);return i=X(i,this.uNoiseC,r.mul(.6)),i=X(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=mt("vec3","vHairTangent"),t=mt("vec3","vHairNormal"),a=mt("vec2","vHairUv"),r=mt("float","vHairRand"),s=mt("vec3","vHairInherit"),i=new Fu(new wg(e,this.uSpecPow,this.uSpecInt,this.uDiffInt,this.uAmbInt));i.name="SplineHairRibbons",i.userData.hairShadowVariant="texel-floor-v6",i.transparent=!1,i.depthTest=!0,i.depthWrite=!0,i.side=is;let n=o=>U(()=>{let u=N(Kt).toVar(),d=u.div(Ba).toVar(),m=u.sub(d.mul(Ba)).toVar(),h=d.mul(ta).add(m).toVar(),f=N(Ni).toVar(),p=f.bitAnd(1).toFloat().toVar(),_=f.shiftRight(1).bitAnd(1).toFloat().toVar(),y=this.positions.element(h).xyz.toVar(),g=this.positions.element(h.add(1)).xyz.toVar(),x=this.tangents.element(h).xyz,v=this.tangents.element(h.add(1)).xyz,V=X(y,g,_).toVar(),T=X(x,v,_).toVar(),z=ae(pr.sub(V)),b=_t(T,z).toVar(),M=we(b).toVar();b.assign(M.greaterThan(1e-7).select(b.div(M),w(1,0,0)));let S=m.toFloat().div(Ba),C=m.add(1).toFloat().div(Ba),R=X(S,C,_).toVar(),k=this.uWidth.mul(c(1).sub(R.mul(this.uTipFade))).toVar(),E=o?(()=>{let j=this.uShadowTexelWorld,Z=j.greaterThan(0).select(j.mul(1.5).clamp(c(2),c(8)),c(0));return Q(Z.sub(k),0).toVar()})():null;E&&k.addAssign(E);let I=p.mul(2).sub(1),D=V.add(b.mul(k).mul(I)).toVar();E&&D.assign(D.sub(z.mul(E)));let H=this.positionsPrev.element(h).xyz,K=this.positionsPrev.element(h.add(1)).xyz;ql.assign(X(H,K,_).add(b.mul(k).mul(I)));let O=Ae(Zt(d.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(O),s.assign(this.rootColors.element(d).xyz),e.assign(T),t.assign(ae(z.sub(T.mul(q(T,z))))),a.assign(A(p,R)),D}),l=U(()=>{let o=a.y,u=X(this.uHairRoot,this.uHairMid,xe(o.mul(2),1)),d=o.lessThan(.5).select(u,X(this.uHairMid,this.uHairTip,o.sub(.5).mul(2))).toVar(),m=s.mul(X(this.uShadeRoot,this.uShadeTip,o));d.assign(this.uColorSource.greaterThan(.5).select(m,d)),d.assign(X(d,this.pastelNoise(Ca),this.uNoiseMixHair));let h=c(1).sub(de(a.x.sub(.5)).mul(2));return c(1).sub(o.mul(this.uTipFade)).mul(Ma(Q(h,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),P(d,1)});return i.positionNode=n(!1)(),i.castShadowPositionNode=n(!0)(),i.normalNode=t,i.colorNode=l(),i.needsUpdate=!0,i}_buildScalpMaterial(){let e=new Fu(new Sg);e.name="SplineHairScalp";let t=U(()=>{let a=X(this.uHeadColor,this.pastelNoise(Ca),this.uNoiseMixHead);return P(a,1)});return e.colorNode=t(),e.needsUpdate=!0,e}update(e,t){let a=t;if(a.backend?.isWebGPUBackend!==!0||(this._renderer=a,e.visible===!1))return;if(!this._armed){this._armed=!0;let l=e.ribbonMesh.material;e.ribbonMesh.material=this.ribbonMaterial,l.dispose?.();let o=e.scalpMesh.material;e.scalpMesh.material=this.scalpMaterial,o.dispose?.(),e.ribbonMesh.visible=!0}e.checkDataDrift();let r=e.activeGuideStrands,s=r*ta;e.generation!==this._uploadedGeneration&&(this._uploadedGeneration=e.generation,this.initialPos.value.array.set(e.roots.initialPositions),this.initialPos.value.needsUpdate=!0,this.restLengths.value.array.set(e.roots.restLengths),this.restLengths.value.needsUpdate=!0,this.rootColors.value.array.set(e.roots.rootColors),this.rootColors.value.needsUpdate=!0,e.ribbonMesh.geometry.instanceCount=r*Ba,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(ar,Mi),this.uBoneQuat.value.set(ar.x,ar.y,ar.z,ar.w),this.uBoneTrans.value.copy(Mi);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(ar))<.9999995||this._prevBonePos.distanceToSquared(Mi)>1e-8),n=Math.floor(e.pendingSimSeconds/Lr);n>po&&(n=po),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*Lr,Lr)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Rs.copy(this._prevBoneQuat).invert().premultiply(ar),this.uDeltaQuat.value.set(Rs.x,Rs.y,Rs.z,Rs.w),this.uPrevBoneTrans.value.copy(this._prevBonePos),this._dispatch(a,this.kRigidFollow,s));for(let l=0;l<n;l++){this.uReset.value=e.resetRequested&&l===0?1:0,e.simTime+=Lr,this._updateWind(e),this._dispatch(a,this.kIntegrate,s),this._dispatch(a,this.kStrandLevel,r),this._dispatch(a,this.kVsp,s);for(let o=0;o<2;o++)this._dispatch(a,this.kLocalShape,r);this._dispatch(a,this.kLengthWind,r),e.data.clumpStrength>.001&&this._dispatch(a,this.kClump,r)}n>0&&(e.resetRequested=!1),this._prevBoneQuat.copy(ar),this._prevBonePos.copy(Mi),this._hasPrevBone=!0}_dispatch(e,t,a){t.count=a,e.compute(t)}_updateWind(e){let t=e.data,a=Math.max(e.roots.unitScale,.001),r=t.windStrength/a;this.uHasWind.value=t.windStrength>.001?1:0;let s=.7*e.simTime,i=Math.sin(s)*r,n=Math.cos(s)*r*.5;this.uWind0.value.set(i,0,n),this.uWind1.value.set(.7*i,.5*r,1.2*n),this.uWind2.value.set(.3*-i,0,.5*n),this.uWind3.value.set(.5*i,-.3*r,.8*-n)}_shadowTexelWorld(e){let t=e;for(;t.parent;)t=t.parent;let a=t;if(!a?.traverse)return 0;let r=0;return a.traverse(s=>{let i=s;if(i.isDirectionalLight!==!0||i.castShadow!==!0||i.visible===!1)return;let n=i.shadow?.camera,l=i.shadow?.mapSize?.x??0;typeof n?.right!="number"||typeof n?.left!="number"||l<=0||(r=Math.max(r,(n.right-n.left)/l))}),r}_syncUniforms(e){let t=e.data,a=e.roots.unitScale;this.uNumStrands.value=e.activeGuideStrands,this.uNumVerts.value=e.activeGuideStrands*ta,this.uDamping.value=t.damping,this.uLocalStiffness.value=t.localStiffness,this.uGlobalStiffness.value=t.globalStiffness,this.uGlobalRange.value=t.globalRange,this.uStiffnessFalloff.value=t.stiffnessFalloff,this.uGravity.value=t.gravity*a,this.uVspCoeff.value=t.vspCoefficient,this.uVspThreshold.value=.5*a,this.uKink.value=t.kink,this.uKinkFreq.value=t.kinkFrequency,this.uUnitScale.value=a,this.uClumpStrength.value=t.clumpStrength,this.uClumpSize.value=Math.max(1,Math.round(t.clumpSize)),this.uClumpTipScale.value=t.clumpTipScale;let r=(i,n)=>{i.value.setRGB(n.r,n.g,n.b,Yl)};r(this.uHairRoot,t.hairRootColor),r(this.uHairMid,t.hairMidColor),r(this.uHairTip,t.hairTipColor),r(this.uHeadColor,t.headColor),r(this.uNoiseA,t.noiseColorA),r(this.uNoiseB,t.noiseColorB),r(this.uNoiseC,t.noiseColorC),r(this.uNoiseD,t.noiseColorD);let s=t.noiseEnabled?1:0;this.uNoiseScale.value=t.noiseScale/Math.max(a,.001),this.uNoiseMixHair.value=t.noiseMixHair*s,this.uNoiseMixHead.value=t.noiseMixHead*s,this.uWidth.value=.003*t.hairWidth*Rc*e.widthWorldScale,this.uShadowTexelWorld.value=this._shadowTexelWorld(e),this.uColorSource.value=t.hairColorSource==="object"&&t.headShape==="object"&&t.baseObjectId?1:0,this.uShadeRoot.value=t.hairShadeRoot??.6,this.uShadeTip.value=t.hairShadeTip??1.15,this.uSpecPow.value=t.specularPower,this.uSpecInt.value=t.specularIntensity,this.uDiffInt.value=t.diffuseIntensity,this.uAmbInt.value=t.ambientIntensity,this.uOpacity.value=t.opacity,this.uTipFade.value=t.tipFade}dispose(){for(let t of[this.kIntegrate,this.kStrandLevel,this.kVsp,this.kLocalShape,this.kLengthWind,this.kClump,this.kRigidFollow])t.dispose();this.ribbonMaterial.dispose(),this.scalpMaterial.dispose();let e=this._renderer?.backend?.attributeUtils;if(e)for(let t of[this.initialPos,this.rootColors,this.positions,this.positionsPrev,this.positionsPrevPrev,this.tangents,this.restLengths,this.vspQuats,this.vspTrans])e.destroyAttribute(t.value);this._renderer=null}},Ci=new WeakMap,Ri=[];Vc(e=>(function(t){let a=Ci.get(t);return a===void 0&&(a=new Vg,Ci.set(t,a)),a})(e)),Mc({release:e=>(function(t){let a=Ci.get(t);a!==void 0&&(Ci.delete(t),Ri.push(a))})(e),drainRetired:function(){let e=Ri.length;if(e>0){for(let t of Ri)t.dispose();Ri.length=0}return e}});var Gl=` 6const PI: f32 = 3.14159265358979323846; 7 8const TRANSMITTANCE_TEXTURE_WIDTH: i32 = 256; 9const TRANSMITTANCE_TEXTURE_HEIGHT: i32 = 64; 10const SCATTERING_TEXTURE_R_SIZE: i32 = 32; 11const SCATTERING_TEXTURE_MU_SIZE: i32 = 128; 12const SCATTERING_TEXTURE_MU_S_SIZE: i32 = 32; 13const SCATTERING_TEXTURE_NU_SIZE: i32 = 8; 14const SCATTERING_TEXTURE_WIDTH: i32 = 256; 15const SCATTERING_TEXTURE_HEIGHT: i32 = 128; 16const SCATTERING_TEXTURE_DEPTH: i32 = 32; 17const IRRADIANCE_TEXTURE_WIDTH: i32 = 64; 18const IRRADIANCE_TEXTURE_HEIGHT: i32 = 16; 19 20struct DensityProfileLayer { 21 width: f32, 22 exp_term: f32, 23 exp_scale: f32, 24 linear_term: f32, 25 constant_term: f32, 26 pad0: f32, 27 pad1: f32, 28 pad2: f32, 29} 30 31struct DensityProfile { 32 layers: array<DensityProfileLayer, 2>,
33} 34 35 36 37 38struct Atm { 39 solar_irradiance: vec3f, 40 sun_angular_radius: f32, 41 rayleigh_scattering: vec3f, 42 bottom_radius: f32, 43 mie_scattering: vec3f, 44 top_radius: f32, 45 mie_extinction: vec3f, 46 mie_phase_function_g: f32, 47 absorption_extinction: vec3f, 48 mu_s_min: f32, 49 ground_albedo: vec3f, 50 pad0: f32, 51 sky_spectral_radiance_to_luminance: vec3f, 52 pad1: f32, 53 sun_spectral_radiance_to_luminance: vec3f, 54 pad2: f32, 55 rayleigh_density: DensityProfile, 56 mie_density: DensityProfile, 57 absorption_density: DensityProfile, 58} 59 60fn ClampCosine(mu: f32) -> f32 { 61 return clamp(mu, -1.0, 1.0); 62} 63 64fn ClampDistance(d: f32) -> f32 { 65 return max(d, 0.0); 66} 67 68fn ClampRadius(atm: Atm, r: f32) -> f32 { 69 return clamp(r, atm.bottom_radius, atm.top_radius); 70} 71 72fn SafeSqrt(a: f32) -> f32 { 73 return sqrt(max(a, 0.0)); 74} 75 76 77 78fn smoothstepGl(edge0: f32, edge1: f32, x: f32) -> f32 { 79 let t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); 80 return t * t * (3.0 - 2.0 * t); 81} 82 83 84 85 86fn tex2DBilinear(t: texture_2d<f32>, uv: vec2f, size: vec2i) -> vec4f { 87 let coord = uv * vec2f(size) - 0.5; 88 let i0 = vec2i(floor(coord)); 89 let f = coord - floor(coord); 90 let maxc = size - 1; 91 let c00 = textureLoad(t, clamp(i0, vec2i(0), maxc), 0); 92 let c10 = textureLoad(t, clamp(i0 + vec2i(1, 0), vec2i(0), maxc), 0); 93 let c01 = textureLoad(t, clamp(i0 + vec2i(0, 1), vec2i(0), maxc), 0); 94 let c11 = textureLoad(t, clamp(i0 + vec2i(1, 1), vec2i(0), maxc), 0); 95 return mix(mix(c00, c10, f.x), mix(c01, c11, f.x), f.y); 96} 97 98fn tex3DTrilinear(t: texture_3d<f32>, uvw: vec3f, size: vec3i) -> vec4f { 99 let coord = uvw * vec3f(size) - 0.5; 100 let i0 = vec3i(floor(coord)); 101 let f = coord - floor(coord); 102 let maxc = size - 1; 103 let c000 = textureLoad(t, clamp(i0, vec3i(0), maxc), 0); 104 let c100 = textureLoad(t, clamp(i0 + vec3i(1, 0, 0), vec3i(0), maxc), 0); 105 let c010 = textureLoad(t, clamp(i0 + vec3i(0, 1, 0), vec3i(0), maxc), 0); 106 let c110 = textureLoad(t, clamp(i0 + vec3i(1, 1, 0), vec3i(0), maxc), 0); 107 let c001 = textureLoad(t, clamp(i0 + vec3i(0, 0, 1), vec3i(0), maxc), 0); 108 let c101 = textureLoad(t, clamp(i0 + vec3i(1, 0, 1), vec3i(0), maxc), 0); 109 let c011 = textureLoad(t, clamp(i0 + vec3i(0, 1, 1), vec3i(0), maxc), 0); 110 let c111 = textureLoad(t, clamp(i0 + vec3i(1, 1, 1), vec3i(0), maxc), 0); 111 let z0 = mix(mix(c000, c100, f.x), mix(c010, c110, f.x), f.y); 112 let z1 = mix(mix(c001, c101, f.x), mix(c011, c111, f.x), f.y); 113 return mix(z0, z1, f.z); 114} 115 116fn GetLayerDensity(layer: DensityProfileLayer, altitude: f32) -> f32 { 117 let density = layer.exp_term * exp(layer.exp_scale * altitude) + 118 layer.linear_term * altitude + layer.constant_term; 119 return clamp(density, 0.0, 1.0); 120} 121 122fn GetProfileDensity(profile: DensityProfile, altitude: f32) -> f32 { 123 if (altitude < profile.layers[0].width) { 124 return GetLayerDensity(profile.layers[0], altitude); 125 } 126 return GetLayerDensity(profile.layers[1], altitude); 127} 128 129fn DistanceToTopAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {
130 let discriminant = r * r * (mu * mu - 1.0) + atm.top_radius * atm.top_radius; 131 return ClampDistance(-r * mu + SafeSqrt(discriminant)); 132} 133 134fn DistanceToBottomAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 { 135 let discriminant = r * r * (mu * mu - 1.0) + 136 atm.bottom_radius * atm.bottom_radius; 137 return ClampDistance(-r * mu - SafeSqrt(discriminant)); 138} 139 140fn RayIntersectsGround(atm: Atm, r: f32, mu: f32) -> bool { 141 return mu < 0.0 && 142 r * r * (mu * mu - 1.0) + atm.bottom_radius * atm.bottom_radius >= 0.0; 143} 144 145fn GetTextureCoordFromUnitRange(x: f32, texture_size: i32) -> f32 { 146 return 0.5 / f32(texture_size) + x * (1.0 - 1.0 / f32(texture_size)); 147} 148 149fn GetUnitRangeFromTextureCoord(u: f32, texture_size: i32) -> f32 { 150 return (u - 0.5 / f32(texture_size)) / (1.0 - 1.0 / f32(texture_size)); 151} 152 153fn GetTransmittanceTextureUvFromRMu(atm: Atm, r: f32, mu: f32) -> vec2f { 154 let H = sqrt(atm.top_radius * atm.top_radius - 155 atm.bottom_radius * atm.bottom_radius); 156 let rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius); 157 let d = DistanceToTopAtmosphereBoundary(atm, r, mu);
158 let d_min = atm.top_radius - r; 159 let d_max = rho + H; 160 let x_mu = (d - d_min) / (d_max - d_min); 161 let x_r = rho / H; 162 return vec2f( 163 GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH), 164 GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)); 165} 166 167fn GetRMuFromTransmittanceTextureUv( 168 atm: Atm, uv: vec2f, r: ptr<function, f32>, mu: ptr<function, f32>) { 169 let x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH); 170 let x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT); 171 let H = sqrt(atm.top_radius * atm.top_radius - 172 atm.bottom_radius * atm.bottom_radius); 173 let rho = H * x_r; 174 *r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius); 175 let d_min = atm.top_radius - *r; 176 let d_max = rho + H; 177 let d = d_min + x_mu * (d_max - d_min); 178 if (d == 0.0) { 179 *mu = 1.0; 180 } else { 181 *mu = (H * H - rho * rho - d * d) / (2.0 * (*r) * d); 182 } 183 *mu = ClampCosine(*mu); 184} 185 186fn GetTransmittanceToTopAtmosphereBoundary( 187 atm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu: f32) -> vec3f { 188 let uv = GetTransmittanceTextureUvFromRMu(atm, r, mu); 189 return tex2DBilinear(transmittance_texture, uv, 190 vec2i(TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT)).rgb; 191} 192 193fn GetTransmittance( 194 atm: Atm, transmittance_texture: texture_2d<f32>, 195 r: f32, mu: f32, d: f32, ray_r_mu_intersects_ground: bool) -> vec3f { 196 let r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r)); 197 let mu_d = ClampCosine((r * mu + d) / r_d); 198 199 if (ray_r_mu_intersects_ground) { 200 return min( 201 GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, -mu_d) / 202 GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, -mu), 203 vec3f(1.0, 1.0, 1.0)); 204 } else { 205 return min( 206 GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu) / 207 GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, mu_d), 208 vec3f(1.0, 1.0, 1.0)); 209 } 210} 211 212fn GetTransmittanceToSun( 213 atm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f { 214 let sin_theta_h = atm.bottom_radius / r; 215 let cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0)); 216 217 let step = smoothstepGl(-sin_theta_h * atm.sun_angular_radius, 218 sin_theta_h * atm.sun_angular_radius, 219 mu_s - cos_theta_h); 220 221 return GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) * step; 222} 223 224fn RayleighPhaseFunction(nu: f32) -> f32 { 225 let k = 3.0 / (16.0 * PI); 226 return k * (1.0 + nu * nu); 227} 228 229fn MiePhaseFunction(g: f32, nu: f32) -> f32 { 230 let k = 3.0 / (8.0 * PI) * (1.0 - g * g) / (2.0 + g * g); 231 return k * (1.0 + nu * nu) / pow(abs(1.0 + g * g - 2.0 * g * nu), 1.5); 232} 233 234fn GetScatteringTextureUvwzFromRMuMuSNu( 235 atm: Atm, r: f32, mu: f32, mu_s: f32, nu: f32, 236 ray_r_mu_intersects_ground: bool) -> vec4f {
237 let H = sqrt(atm.top_radius * atm.top_radius - 238 atm.bottom_radius * atm.bottom_radius); 239 let rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius); 240 let u_r = GetTextureCoordFromUnitRange(rho / H, SCATTERING_TEXTURE_R_SIZE); 241 242 let r_mu = r * mu; 243 let discriminant = r_mu * r_mu - r * r + 244 atm.bottom_radius * atm.bottom_radius; 245 var u_mu: f32; 246 247 if (ray_r_mu_intersects_ground) { 248 let d = -r_mu - SafeSqrt(discriminant); 249 let d_min = r - atm.bottom_radius; 250 let d_max = rho; 251 var x: f32 = 0.0; 252 if (d_max != d_min) { 253 x = (d - d_min) / (d_max - d_min); 254 } 255 u_mu = 0.5 - 0.5 * GetTextureCoordFromUnitRange(x, SCATTERING_TEXTURE_MU_SIZE / 2); 256 } else { 257 let d = -r_mu + SafeSqrt(discriminant + H * H); 258 let d_min = atm.top_radius - r; 259 let d_max = rho + H; 260 u_mu = 0.5 + 0.5 * GetTextureCoordFromUnitRange( 261 (d - d_min) / (d_max - d_min), SCATTERING_TEXTURE_MU_SIZE / 2); 262 } 263 264 let d = DistanceToTopAtmosphereBoundary(atm, atm.bottom_radius, mu_s); 265 let d_min = atm.top_radius - atm.bottom_radius; 266 let d_max = H; 267 let a = (d - d_min) / (d_max - d_min); 268 let A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min); 269 270 let u_mu_s = GetTextureCoordFromUnitRange( 271 max(1.0 - a / A, 0.0) / (1.0 + a), SCATTERING_TEXTURE_MU_S_SIZE); 272 273 let u_nu = (nu + 1.0) / 2.0; 274 return vec4f(u_nu, u_mu_s, u_mu, u_r); 275} 276 277fn GetRMuMuSNuFromScatteringTextureUvwz( 278 atm: Atm, uvwz: vec4f, 279 r: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>, 280 nu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {
281 let H = sqrt(atm.top_radius * atm.top_radius - 282 atm.bottom_radius * atm.bottom_radius); 283 let rho = H * GetUnitRangeFromTextureCoord(uvwz.w, SCATTERING_TEXTURE_R_SIZE); 284 *r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius); 285 286 if (uvwz.z < 0.5) { 287 let d_min = *r - atm.bottom_radius; 288 let d_max = rho; 289 let d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord( 290 1.0 - 2.0 * uvwz.z, SCATTERING_TEXTURE_MU_SIZE / 2); 291 if (d == 0.0) { 292 *mu = -1.0; 293 } else { 294 *mu = ClampCosine(-(rho * rho + d * d) / (2.0 * (*r) * d)); 295 } 296 *ray_r_mu_intersects_ground = true; 297 } else { 298 let d_min = atm.top_radius - *r; 299 let d_max = rho + H; 300 let d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord( 301 2.0 * uvwz.z - 1.0, SCATTERING_TEXTURE_MU_SIZE / 2); 302 if (d == 0.0) { 303 *mu = 1.0; 304 } else { 305 *mu = ClampCosine((H * H - rho * rho - d * d) / (2.0 * (*r) * d)); 306 } 307 *ray_r_mu_intersects_ground = false; 308 } 309 310 let x_mu_s = GetUnitRangeFromTextureCoord(uvwz.y, SCATTERING_TEXTURE_MU_S_SIZE); 311 let d_min = atm.top_radiu
311s - atm.bottom_radius; 312 let d_max = H; 313 let A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min); 314 let a = (A - x_mu_s * A) / (1.0 + x_mu_s * A); 315 let d = d_min + min(a, A) * (d_max - d_min); 316 if (d == 0.0) { 317 *mu_s = 1.0; 318 } else { 319 *mu_s = ClampCosine((H * H - d * d) / (2.0 * atm.bottom_radius * d)); 320 } 321 322 *nu = ClampCosine(uvwz.x * 2.0 - 1.0); 323} 324 325fn GetRMuMuSNuFromScatteringTextureFragCoord( 326 atm: Atm, frag_coord: vec3f, 327 r: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>, 328 nu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) { 329 let SCATTERING_TEXTURE_SIZE = vec4f( 330 f32(SCATTERING_TEXTURE_NU_SIZE - 1), 331 f32(SCATTERING_TEXTURE_MU_S_SIZE), 332 f32(SCATTERING_TEXTURE_MU_SIZE), 333 f32(SCATTERING_TEXTURE_R_SIZE)); 334 335 let frag_coord_nu = floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE)); 336 let frag_coord_mu_s = frag_coord.x - 337 f32(SCATTERING_TEXTURE_MU_S_SIZE) * floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE)); 338 339 let uvwz = vec4f(frag_coord_nu, frag_coord_mu_s, frag_coord.y, frag_coord.z) / 340 SCATTERING_TEXTURE_SIZE; 341 342 GetRMuMuSNuFromScatteringTextureUvwz( 343 atm, uvwz, r, mu, mu_s, nu, ray_r_mu_intersects_ground); 344 345 *nu = clamp(*nu, 346 (*mu) * (*mu_s) - sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))), 347 (*mu) * (*mu_s) + sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s)))); 348} 349 350fn GetIrradianceTextureUvFromRMuS(atm: Atm, r: f32, mu_s: f32) -> vec2f {
351 let x_r = (r - atm.bottom_radius) / (atm.top_radius - atm.bottom_radius); 352 let x_mu_s = mu_s * 0.5 + 0.5; 353 return vec2f(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH), 354 GetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT)); 355} 356 357fn GetIrradiance( 358 atm: Atm, irradiance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f { 359 let uv = GetIrradianceTextureUvFromRMuS(atm, r, mu_s); 360 return tex2DBilinear(irradiance_texture, uv, 361 vec2i(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT)).rgb; 362} 363`,hs=e=>` 364${Gl} 365 366fn ComputeOpticalLengthToTopAtmosphereBoundary( 367 atm: Atm, profile: DensityProfile, r: f32, mu: f32) -> f32 { 368 const SAMPLE_COUNT: i32 = 500; 369 let dx = DistanceToTopAtmosphereBoundary(atm, r, mu) / f32(SAMPLE_COUNT); 370 var result: f32 = 0.0; 371 for (var i: i32 = 0; i <= SAMPLE_COUNT; i++) { 372 let d_i = f32(i) * dx; 373 let r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r); 374 let y_i = GetProfileDensity(profile, r_i - atm.bottom_radius); 375 var weight_i: f32 = 1.0; 376 if (i == 0 || i == SAMPLE_COUNT) { 377 weight_i = 0.5; 378 } 379 result += y_i * weight_i * dx; 380 } 381 return result; 382} 383 384fn ComputeTransmittanceToTopAtmosphereBoundary( 385 atm: Atm, r: f32, mu: f32) -> vec3f { 386 var density = vec3f(0.0); 387 density += atm.rayleigh_scattering * 388 ComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.rayleigh_density, r, mu); 389 density += atm.mie_extinction * 390 ComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.mie_density, r, mu); 391 density += atm.absorption_extinction * 392 ComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.absorption_density, r, mu); 393 return exp(-density); 394} 395 396fn ComputeTransmittanceToTopAtmosphereBoundaryTexture( 397 atm: Atm, frag_coord: vec2f) -> vec3f { 398 let TRANSMITTANCE_TEXTURE_SIZE = vec2f( 399 f32(TRANSMITTANCE_TEXTURE_WIDTH), f32(TRANSMITTANCE_TEXTURE_HEIGHT)); 400 var r: f32; 401 var mu: f32; 402 GetRMuFromTransmittanceTextureUv( 403 atm, frag_coord / TRANSMITTANCE_TEXTURE_SIZE, &r, &mu); 404 return ComputeTransmittanceToTopAtmosphereBoundary(atm, r, mu); 405} 406 407fn ComputeSingleScatteringIntegrand( 408 atm: Atm, transmittance_texture: texture_2d<f32>, 409 r: f32, mu: f32, mu_s: f32, nu: f32, d: f32, 410 ray_r_mu_intersects_ground: bool, 411 rayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) { 412 let r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r)); 413 let mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d); 414 415 let transmittance = 416 GetTransmittance(atm, transmittance_texture, r, mu, d, ray_r_mu_intersects_ground) * 417 GetTransmittanceToSun(atm, transmittance_texture, r_d, mu_s_d); 418 419 *rayleigh = transmittance * 420 GetProfileDensity(atm.rayleigh_density, r_d - atm.bottom_radius); 421 *mie = transmittance * 422 GetProfileDensity(atm.mie_density, r_d - atm.bottom_radius); 423} 424 425fn DistanceToNearestAtmosphereBoundary( 426 atm: Atm, r: f32, mu: f32, ray_r_mu_intersects_ground: bool) -> f32 { 427 if (ray_r_mu_intersects_ground) { 428 return DistanceToBottomAtmosphereBoundary(atm, r, mu); 429 } 430 return DistanceToTopAtmosphereBoundary(atm, r, mu); 431} 432 433fn ComputeSingleScattering( 434 atm: Atm, transmittance_texture: texture_2d<f32>, 435 r: f32, mu: f32, mu_s: f32, nu: f32, 436 ray_r_mu_intersects_ground: bool, 437 rayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) { 438 const SAMPLE_COUNT: i32 = 50; 439 let dx = DistanceToNearestAtmosphereBoundary( 440 atm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT); 441 442 var rayleigh_sum = vec3f(0.0); 443 var mie_sum = vec3f(0.0); 444 445 for (var i: i32 = 0; i <= SAMPLE_COUNT; i++) { 446 let d_i = f32(i) * dx; 447 var rayleigh_i: vec3f; 448 var mie_i: vec3f; 449 ComputeSingleScatteringIntegrand( 450 atm, transmittance_texture, r, mu, mu_s, nu, d_i, 451 ray_r_mu_intersects_ground, &rayleigh_i, &mie_i); 452 453 var weight_i: f32 = 1.0; 454 if (i == 0 || i == SAMPLE_COUNT) { 455 weight_i = 0.5; 456 } 457 rayleigh_sum += rayleigh_i * weight_i; 458 mie_sum += mie_i * weight_i; 459 } 460 461 *rayleigh = rayleigh_sum * dx * atm.solar_irradiance * atm.rayleigh_scattering; 462 *mie = mie_sum * dx * atm.solar_irradiance * atm.mie_scattering; 463} 464 465fn ComputeSingleScatteringTexture( 466 atm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec3f, 467 rayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) { 468 var r: f32; 469 var mu: f32; 470 var mu_s: f32; 471 var nu: f32; 472 var ray_r_mu_intersects_ground: bool; 473 GetRMuMuSNuFromScatteringTextureFragCoord( 474 atm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground); 475 ComputeSingleScattering( 476 atm, transmittance_texture, r, mu, mu_s, nu, 477 ray_r_mu_intersects_ground, rayleigh, mie); 478} 479 480// The n-th-order lookup used during precompute: the delta textures are 481// float32, so they go through the manual trilinear helper. 482fn GetScatteringDelta( 483 atm: Atm, scattering_texture: texture_3d<f32>, 484 r: f32, mu: f32, mu_s: f32, nu: f32, 485 ray_r_mu_intersects_ground: bool) -> vec3f { 486 let uvwz = GetScatteringTextureUvwzFromRMuMuSNu( 487 atm, r, mu, mu_s, nu, ray_r_mu_intersects_ground); 488 489 let tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1); 490 let tex_x = floor(tex_coord_x); 491 let lerp = tex_coord_x - tex_x; 492 493 let uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w); 494 let uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w); 495 496 let size = vec3i(SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT, SCATTERING_TEXTURE_DEPTH); 497 return tex3DTrilinear(scattering_texture, uvw0, size).rgb * (1.0 - lerp) + 498 tex3DTrilinear(scattering_texture, uvw1, size).rgb * lerp; 499} 500 501fn GetScatteringOrder( 502 atm: Atm, 503 single_rayleigh_scattering_texture: texture_3d<f32>, 504 single_mie_scattering_texture: texture_3d<f32>, 505 multiple_scattering_texture: texture_3d<f32>, 506 r: f32, mu: f32, mu_s: f32, nu: f32, 507 ray_r_mu_intersects_ground: bool, 508 scattering_order: i32) -> vec3f { 509 if (scattering_order == 1) { 510 let rayleigh = GetScatteringDelta( 511 atm, single_rayleigh_scattering_texture, r, mu, mu_s, nu, 512 ray_r_mu_intersects_ground); 513 let mie = GetScatteringDelta( 514 atm, single_mie_scattering_texture, r, mu, mu_s, nu, 515 ray_r_mu_intersects_ground); 516 return rayleigh * RayleighPhaseFunction(nu) + 517 mie * MiePhaseFunction(atm.mie_phase_function_g, nu); 518 } else { 519 return GetScatteringDelta( 520 atm, multiple_scattering_texture, r, mu, mu_s, nu, 521 ray_r_mu_intersects_ground); 522 } 523} 524 525fn GetRMuSFromIrradianceTextureUv( 526 atm: Atm, uv: vec2f, r: ptr<function, f32>, mu_s: ptr<function, f32>) { 527 let x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH); 528 let x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT);
529 *r = atm.bottom_radius + x_r * (atm.top_radius - atm.bottom_radius); 530 *mu_s = ClampCosine(2.0 * x_mu_s - 1.0); 531} 532 533fn ComputeDirectIrradiance( 534 atm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f { 535 let alpha_s = atm.sun_angular_radius; 536 537 var average_cosine_factor: f32; 538 if (mu_s < -alpha_s) { 539 average_cosine_factor = 0.0; 540 } else if (mu_s > alpha_s) { 541 average_cosine_factor = mu_s; 542 } else { 543 average_cosine_factor = (mu_s + alpha_s) * (mu_s + alpha_s) / (4.0 * alpha_s); 544 } 545 546 return atm.solar_irradiance * 547 GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) * 548 average_cosine_factor; 549} 550 551fn ComputeIndirectIrradiance( 552 atm: Atm, 553 single_rayleigh_scattering_texture: texture_3d<f32>, 554 single_mie_scattering_texture: texture_3d<f32>, 555 multiple_scattering_texture: texture_3d<f32>, 556 r: f32, mu_s: f32, scattering_order: i32) -> vec3f { 557 const SAMPLE_COUNT: i32 = 32; 558 let dphi = PI / f32(SAMPLE_COUNT); 559 let dtheta = PI / f32(SAMPLE_COUNT); 560 561 var result = vec3f(0.0); 562 let omega_s = vec3f(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); 563 564 for (var j: i32 = 0; j < SAMPLE_COUNT / 2; j++) { 565 let theta = (f32(j) + 0.5) * dtheta; 566 for (var i: i32 = 0; i < 2 * SAMPLE_COUNT; i++) { 567 let phi = (f32(i) + 0.5) * dphi; 568 let omega = vec3f(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); 569 let domega = dtheta * dphi * sin(theta); 570 let nu = dot(omega, omega_s); 571 572 result += GetScatteringOrder(atm, 573 single_rayleigh_scattering_texture, single_mie_scattering_texture, 574 multiple_scattering_texture, 575 r, omega.z, mu_s, nu, false, scattering_order) * omega.z * domega; 576 } 577 } 578 579 return result; 580} 581 582fn ComputeDirectIrradianceTexture( 583 atm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec2f) -> vec3f { 584 var r: f32; 585 var mu_s: f32; 586 let IRRADIANCE_TEXTURE_SIZE = vec2f( 587 f32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT)); 588 GetRMuSFromIrradianceTextureUv( 589 atm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s); 590 return ComputeDirectIrradiance(atm, transmittance_texture, r, mu_s); 591} 592 593fn ComputeIndirectIrradianceTexture( 594 atm: Atm, 595 single_rayleigh_scattering_texture: texture_3d<f32>, 596 single_mie_scattering_texture: texture_3d<f32>, 597 multiple_scattering_texture: texture_3d<f32>, 598 frag_coord: vec2f, scattering_order: i32) -> vec3f { 599 var r: f32; 600 var mu_s: f32; 601 let IRRADIANCE_TEXTURE_SIZE = vec2f( 602 f32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT)); 603 GetRMuSFromIrradianceTextureUv( 604 atm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s); 605 return ComputeIndirectIrradiance(atm, 606 single_rayleigh_scattering_texture, single_mie_scattering_texture, 607 multiple_scattering_texture, r, mu_s, scattering_order); 608} 609 610fn ComputeScatteringDensity( 611 atm: Atm, 612 transmittance_texture: texture_2d<f32>, 613 single_rayleigh_scattering_texture: texture_3d<f32>, 614 single_mie_scattering_texture: texture_3d<f32>, 615 multiple_scattering_texture: texture_3d<f32>, 616 irradiance_texture: texture_2d<f32>, 617 r: f32, mu: f32, mu_s: f32, nu: f32, scattering_order: i32) -> vec3f { 618 let zenith_direction = vec3f(0.0, 0.0, 1.0); 619 let omega = vec3f(sqrt(1.0 - mu * mu), 0.0, mu); 620 var sun_dir_x: f32 = 0.0; 621 if (omega.x != 0.0) { 622 sun_dir_x = (nu - mu * mu_s) / omega.x; 623 } 624 let sun_dir_y = sqrt(max(1.0 - sun_dir_x * sun_dir_x - mu_s * mu_s, 0.0)); 625 let omega_s = vec3f(sun_dir_x, sun_dir_y, mu_s); 626 627 const SAMPLE_COUNT: i32 = 16; 628 let dphi = PI / f32(SAMPLE_COUNT); 629 let dtheta = PI / f32(SAMPLE_COUNT); 630 var rayleigh_mie = vec3f(0.0); 631 632 for (var l: i32 = 0; l < SAMPLE_COUNT; l++) { 633 let theta = (f32(l) + 0.5) * dtheta; 634 let cos_theta = cos(theta); 635 let sin_theta = sin(theta); 636 let ray_r_theta_intersects_ground = RayIntersectsGround(atm, r, cos_theta); 637 638 var distance_to_ground: f32 = 0.0; 639 var transmittance_to_ground = vec3f(0.0); 640 var ground_albedo = vec3f(0.0); 641 if (ray_r_theta_intersects_ground) { 642 distance_to_ground = DistanceToBottomAtmosphereBoundary(atm, r, cos_theta); 643 transmittance_to_ground = GetTransmittance( 644 atm, transmittance_texture, r, cos_theta, distance_to_ground, true); 645 // NOTE: the reference leaves ground_albedo at vec3(0) here (it 646 // declares it but never assigns atm.ground_albedo) â transcribed 647 // as-is so the LUTs match bit-for-bit in spirit. 648 } 649 650 for (var m: i32 = 0; m < 2 * SAMPLE_COUNT; m++) { 651 let phi = (f32(m) + 0.5) * dphi; 652 let omega_i = vec3f(cos(phi) * sin_theta, sin(phi) * sin_theta, cos_theta); 653 let domega_i = dtheta * dphi * sin(theta); 654
655 let nu1 = dot(omega_s, omega_i); 656 var incident_radiance = GetScatteringOrder(atm, 657 single_rayleigh_scattering_texture, single_mie_scattering_texture, 658 multiple_scattering_texture, r, omega_i.z, mu_s, nu1, 659 ray_r_theta_intersects_ground, scattering_order - 1); 660 661 let ground_normal = normalize(zenith_direction * r + omega_i * distance_to_ground); 662 let ground_irradiance = GetIrradiance( 663 atm, irradiance_texture, atm.bottom_radius, dot(ground_normal, omega_s)); 664 incident_radiance += transmittance_to_ground * ground_albedo * 665 (1.0 / PI) * ground_irradiance; 666 667 let nu2 = dot(omega, omega_i); 668 669 let rayleigh_density = GetProfileDensity( 670 atm.rayleigh_density, r - atm.bottom_radius); 671 let mie_density = GetProfileDensity( 672 atm.mie_density, r - atm.bottom_radius); 673 674 rayleigh_mie += incident_radiance * ( 675 atm.rayleigh_scattering * rayleigh_density * RayleighPhaseFunction(nu2) + 676 atm.mie_scattering * mie_density * MiePhaseFunction(atm.mie_phase_function_g, nu2)) * 677 domega_i; 678 } 679 } 680 681 return rayleigh_mie; 682} 683 684fn ComputeMultipleScattering( 685 atm: Atm, 686 transmittance_texture: texture_2d<f32>, 687 scattering_density_texture: texture_3d<f32>, 688 r: f32, mu: f32, mu_s: f32, nu: f32, 689 ray_r_mu_intersects_ground: bool) -> vec3f { 690 const SAMPLE_COUNT: i32 = 50; 691 let dx = DistanceToNearestAtmosphereBoundary( 692 atm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT); 693 694 var rayleigh_mie_sum = vec3f(0.0); 695 696 for (var i: i32 = 0; i <= SAMPLE_COUNT; i++) { 697 let d_i = f32(i) * dx; 698 699 let r_i = ClampRadius(atm, sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r)); 700 let mu_i = ClampCosine((r * mu + d_i) / r_i); 701 let mu_s_i = ClampCosine((r * mu_s + d_i * nu) / r_i); 702 703 let rayleigh_mie_i = 704 GetScatteringDelta(atm, scattering_density_texture, r_i, mu_i, mu_s_i, nu, 705 ray_r_mu_intersects_ground) * 706 GetTransmittance(atm, transmittance_texture, r, mu, d_i, 707 ray_r_mu_intersects_ground) * dx; 708 709 var weight_i: f32 = 1.0; 710 if (i == 0 || i == SAMPLE_COUNT) { 711 weight_i = 0.5; 712 } 713 rayleigh_mie_sum += rayleigh_mie_i * weight_i; 714 } 715 716 return rayleigh_mie_sum; 717} 718 719fn ComputeScatteringDensityTexture( 720 atm: Atm, 721 transmittance_texture: texture_2d<f32>, 722 single_rayleigh_scattering_texture: texture_3d<f32>, 723 single_mie_scattering_texture: texture_3d<f32>, 724 multiple_scattering_texture: texture_3d<f32>, 725 irradiance_texture: texture_2d<f32>, 726 frag_coord: vec3f, scattering_order: i32) -> vec3f { 727 var r: f32; 728 var mu: f32; 729 var mu_s: f32; 730 var nu: f32; 731 var ray_r_mu_intersects_ground: bool; 732 GetRMuMuSNuFromScatteringTextureFragCoord( 733 atm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground); 734 735 return ComputeScatteringDensity(atm, transmittance_texture, 736 single_rayleigh_scattering_texture, single_mie_scattering_texture, 737 multiple_scattering_texture, irradiance_texture, r, mu, mu_s, nu, 738 scattering_order); 739} 740 741fn ComputeMultipleScatteringTexture( 742 atm: Atm, 743 transmittance_texture: texture_2d<f32>, 744 scattering_density_texture: texture_3d<f32>, 745 frag_coord: vec3f, nu: ptr<function, f32>) -> vec3f { 746 var r: f32; 747 var mu: f32; 748 var mu_s: f32; 749 var ray_r_mu_intersects_ground: bool; 750 GetRMuMuSNuFromScatteringTextureFragCoord( 751 atm, frag_coord, &r, &mu, &mu_s, nu, &ray_r_mu_intersects_ground); 752 753 return ComputeMultipleScattering(atm, transmittance_texture, 754 scattering_density_texture, r, mu, mu_s, *nu, 755 ray_r_mu_intersects_ground); 756} 757 758 759struct PassParams { 760 luminance_from_radiance: mat3x3f, 761 blend: vec4f, 762 layer: i32, 763 scattering_order: i32, 764} 765 766fn RadianceToLuminance(pass_params: PassParams, rad: vec3f) -> vec3f { 767 return pass_params.luminance_from_radiance * rad; 768} 769 770@group(0) @binding(0) var<uniform> atm: Atm; 771@group(0) @binding(1) var<uniform> pass_params: PassParams; 772${e} 773`,Mg=hs(` 774@group(0) @binding(2) var out_transmittance: texture_storage_2d<rgba32float, write>; 775`)+` 776@compute @workgroup_size(8, 8, 1) 777fn main(@builtin(global_invocation_id) gid: vec3u) { 778 let coord = vec2i(gid.xy); 779 let frag_coord = vec2f(coord) + vec2f(0.5, 0.5); 780 textureStore(out_transmittance, coord, 781 vec4f(ComputeTransmittanceToTopAtmosphereBoundaryTexture(atm, frag_coord), 1.0)); 782} 783`,Cg=hs(` 784@group(0) @binding(2) var irradiance_read: texture_2d<f32>; 785@group(0) @binding(3) var out_irradiance: texture_storage_2d<rgba32float, write>; 786@group(0) @binding(4) var out_delta_irradiance: texture_storage_2d<rgba32float, write>; 787@group(0) @binding(5) var transmittance: texture_2d<f32>; 788`)+` 789@compute @workgroup_size(8, 8, 1) 790fn main(@builtin(global_invocation_id) gid: vec3u) { 791 let coord = vec2i(gid.xy); 792 let frag_coord = vec2f(coord) + vec2f(0.5, 0.5); 793 794 textureStore(out_delta_irradiance, coord, 795 vec4f(ComputeDirectIrradianceTexture(atm, transmittance, frag_coord), 1.0)); 796 797 var result = vec4f(0.0, 0.0, 0.0, 1.0); 798 if (pass_params.blend[1] == 1.0) { 799 result += textureLoad(irradiance_read, coord, 0); 800 } 801 textureStore(out_irradiance, coord, result); 802} 803`,Rg=hs(` 804@group(0) @binding(2) var out_delta_rayleigh: texture_storage_3d<rgba32float, write>; 805@group(0) @binding(3) var out_delta_mie: texture_storage_3d<rgba32float, write>; 806@group(0) @binding(4) var scattering_read: texture_3d<f32>; 807@group(0) @binding(5) var out_scattering: texture_storage_3d<rgba16float, write>; 808@group(0) @binding(6) var transmittance: texture_2d<f32>; 809`)+` 810@compute @workgroup_size(8, 8, 1) 811fn main(@builtin(global_invocation_id) gid: vec3u) { 812 var coord = vec3i(gid); 813 coord.z = pass_params.layer; 814 let frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5); 815 816 var delta_rayleigh: vec3f; 817 var delta_mie: vec3f; 818 ComputeSingleScatteringTexture(atm, transmittance, frag_coord, 819 &delta_rayleigh, &delta_mie); 820 821 textureStore(out_delta_rayleigh, coord, vec4f(delta_rayleigh, 1.0)); 822 textureStore(out_delta_mie, coord, vec4f(delta_mie, 1.0)); 823 824 var scattering = vec4f( 825 RadianceToLuminance(pass_params, delta_rayleigh), 826 RadianceToLuminance(pass_params, delta_mie).r); 827 if (pass_params.blend[2] == 1.0) { 828 scattering += textureLoad(scattering_read, coord, 0); 829 } 830 textureStore(out_scattering, coord, scattering); 831} 832`,zg=hs(` 833@group(0) @binding(2) var out_delta_scattering_density: texture_storage_3d<rgba32float, write>; 834@group(0) @binding(3) var transmittance: texture_2d<f32>; 835@group(0) @binding(4) var single_rayleigh_scattering: texture_3d<f32>; 836@group(0) @binding(5) var single_mie_scattering: texture_3d<f32>; 837@group(0) @binding(6) var multiple_scattering: texture_3d<f32>; 838@group(0) @binding(7) var irradiance: texture_2d<f32>; 839`)+` 840@compute @workgroup_size(8, 8, 1) 841fn main(@builtin(global_invocation_id) gid: vec3u) { 842 var coord = vec3i(gid); 843 coord.z = pass_params.layer; 844 let frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5); 845 846 let scattering_density = ComputeScatteringDensityTexture( 847 atm, transmittance, single_rayleigh_scattering, single_mie_scattering, 848 multiple_scattering, irradiance, frag_coord, pass_params.scattering_order); 849 850 textureStore(out_delta_scattering_density, coord, vec4f(scattering_density, 1.0)); 851} 852`,kg=hs(` 853@group(0) @binding(2) var out_delta_irradiance: texture_storage_2d<rgba32float, write>; 854@group(0) @binding(3) var irradiance_read: texture_2d<f32>; 855@group(0) @binding(4) var out_irradiance: texture_storage_2d<rgba32float, write>; 856@group(0) @binding(5) var single_rayleigh_scattering: texture_3d<f32>; 857@group(0) @binding(6) var single_mie_scattering: texture_3d<f32>; 858@group(0) @binding(7) var multiple_scattering: texture_3d<f32>; 859`)+` 860@compute @workgroup_size(8, 8, 1) 861fn main(@builtin(global_invocation_id) gid: vec3u) { 862 let coord = vec2i(gid.xy); 863 let frag_coord = vec2f(coord) + vec2f(0.5, 0.5); 864 865 let delta_irradiance_value = ComputeIndirectIrradianceTexture( 866 atm, single_rayleigh_scattering, single_mie_scattering, 867 multiple_scattering, frag_coord, pass_params.scattering_order); 868 textureStore(out_delta_irradiance, coord, vec4f(delta_irradiance_value, 1.0)); 869 870 var irradiance = vec4f(RadianceToLuminance(pass_params, delta_irradiance_value), 1.0); 871 if (pass_params.blend[1] == 1.0) { 872 irradiance += textureLoad(irradiance_read, coord, 0); 873 } 874 textureStore(out_irradiance, coord, irradiance); 875} 876`,Ag=hs(` 877@group(0) @binding(2) var out_delta_multiple_scattering: texture_storage_3d<rgba32float, write>; 878@group(0) @binding(3) var scattering_read: texture_3d<f32>; 879@group(0) @binding(4) var out_scattering: texture_storage_3d<rgba16float, write>; 880@group(0) @binding(5) var transmittance: texture_2d<f32>; 881@group(0) @binding(6) var delta_scattering_density: texture_3d<f32>; 882`)+` 883@compute @workgroup_size(8, 8, 1) 884fn main(@builtin(global_invocation_id) gid: vec3u) { 885 var coord = vec3i(gid); 886 coord.z = pass_params.layer; 887 let frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5); 888 889 var nu: f32; 890 let delta_multiple_scattering_value = ComputeMultipleScatteringTexture( 891 atm, transmittance, delta_scattering_density, frag_coord, &nu); 892 893 textureStore(out_delta_multiple_scattering, coord, 894 vec4f(delta_multiple_scattering_value, 1.0)); 895 896 var scattering = vec4f( 897 RadianceToLuminance(pass_params, delta_multiple_scattering_value) / 898 RayleighPhaseFunction(nu), 899 0.0); 900 if (pass_params.blend[1] == 1.0) { 901 scattering += textureLoad(scattering_read, coord, 0); 902 } 903 textureStore(out_scattering, coord, scattering); 904} 905`;function Ph(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function sr(e,t){e.initTexture(t);let a=e.backend.get(t);
vendor: 4,601 bytes, lines 905-933
905if(!a?.texture)throw new Error("[spline/sky] three did not allocate a GPU texture");return a.texture}function zi(e,t,a,r){let s=new nc(e,t);return s.type=a,s.minFilter=Oe,s.magFilter=Oe,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function zs(e,t,a,r,s,i){let n=new ts(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var ki=256,Pg={transmittance:{code:Mg,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Cg,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:Rg,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:zg,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:kg,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:Ag,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function $r(e,t,a,r,s,i){let n=Ph(e),l=sr(e,t),o=a*(i?8:16),u=256*Math.ceil(o/256),d=n.createBuffer({size:u*r*s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),m=n.createCommandEncoder();m.copyTextureToBuffer({texture:l},{buffer:d,bytesPerRow:u,rowsPerImage:r},{width:a,height:r,depthOrArrayLayers:s}),n.queue.submit([m.finish()]),await d.mapAsync(GPUMapMode.READ);let h=d.getMappedRange(),f=new Float32Array(a*r*s*4);for(let p=0;p<s;p++)for(let _=0;_<r;_++){let y=(p*r+_)*u;if(i){let g=new Uint16Array(h,y,4*a);for(let x=0;x<4*a;x++)f[(p*r+_)*a*4+x]=Eg(g[x])}else{let g=new Float32Array(h,y,4*a);f.set(g,(p*r+_)*a*4)}}return d.unmap(),d.destroy(),f}function Eg(e){let t=(32768&e)>>15,a=(31744&e)>>10,r=1023&e;return a===0?(t?-1:1)*Math.pow(2,-14)*(r/1024):a===31?r?NaN:1/0*(t?-1:1):(t?-1:1)*Math.pow(2,a-15)*(1+r/1024)}function Zi(e,t){return .5/t+e*(1-1/t)}function Eh(e,t,a,r,s){let i=Math.min(Math.max(r*t-.5,0),t-1),n=Math.min(Math.max(s*a-.5,0),a-1),l=Math.floor(i),o=Math.floor(n),u=Math.min(l+1,t-1),d=Math.min(o+1,a-1),m=i-l,h=n-o,f=[0,0,0];for(let p=0;p<3;p++){let _=e[4*(o*t+l)+p],y=e[4*(o*t+u)+p],g=e[4*(d*t+l)+p],x=e[4*(d*t+u)+p];f[p]=(_*(1-m)+y*m)*(1-h)+(g*(1-m)+x*m)*h}return f}function Ng(e,t,a,r){let s=e.bottomRadius/a,i=-Math.sqrt(Math.max(0,1-s*s)),n=(function(o,u,d){let m=Math.min(1,Math.max(0,(d-o)/(u-o)));return m*m*(3-2*m)})(-s*e.sunAngularRadius,s*e.sunAngularRadius,r-i),l=(function(o,u,d,m){let h=Math.sqrt(o.topRadius*o.topRadius-o.bottomRadius*o.bottomRadius),f=Math.sqrt(Math.max(0,d*d-o.bottomRadius*o.bottomRadius)),p=(function(g,x,v){let V=x*x*(v*v-1)+g.topRadius*g.topRadius;return Math.max(0,-x*v+Math.sqrt(Math.max(0,V)))})(o,d,m),_=o.topRadius-d,y=f/h;return Eh(u,256,64,Zi((p-_)/(f+h-_),256),Zi(y,64))})(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function ks(e){return .2126*e[0]+.7152*e[1]+.0722*e[2]}function Lu(e,t,a,r){let s=Ng(e,t.transmittance,a,r),i=e.sunSpectralRadianceToLuminance;return[e.solarIrradiance[0]*s[0]*i[0],e.solarIrradiance[1]*s[1]*i[1],e.solarIrradiance[2]*s[2]*i[2]]}function Iu(e,t,a,r){let s=(function(n,l,o,u){let d=(o-n.bottomRadius)/(n.topRadius-n.bottomRadius);return Eh(l,64,16,Zi(.5*u+.5,64),Zi(d,16))})(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var Yi="6.0e4",Du=` 906fn GetExtrapolatedSingleMieScattering(atm: Atm, scattering: vec4f) -> vec3f { 907 if (scattering.r == 0.0) { 908 return vec3f(0.0); 909 } 910 return scattering.rgb * scattering.a / scattering.r * 911 (atm.rayleigh_scattering.r / atm.mie_scattering.r) * 912 (atm.mie_scattering / atm.rayleigh_scattering); 913} 914 915fn GetCombinedScattering( 916 atm: Atm, 917 scattering_texture: texture_3d<f32>, 918 scattering_sampler: sampler, 919 r: f32, mu: f32, mu_s: f32, nu: f32, 920 ray_r_mu_intersects_ground: bool, 921 single_mie_scattering: ptr<function, vec3f>) -> vec3f { 922 let uvwz = GetScatteringTextureUvwzFromRMuMuSNu( 923 atm, r, mu, mu_s, nu, ray_r_mu_intersects_ground); 924 925 let tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1); 926 let tex_x = floor(tex_coord_x); 927 let lerp = tex_coord_x - tex_x; 928 929 let uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w); 930 let uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w); 931 932 let combined_scattering = 933 textureSampleLevel(scattering_texture, scattering_sampler, uvw0, 0.0
933) * (1.0 - lerp) + 934 textureSampleLevel(scattering_texture, scattering_sampler, uvw1, 0.0) * lerp; 935 let scattering = combined_scattering.xyz; 936 *single_mie_scattering = GetExtrapolatedSingleMieScattering(atm, combined_scattering); 937 938 return scattering; 939} 940 941// GLSL relies on sqrt(negative) = NaN making both branch conditions false; 942// WGSL leaves that indeterminate, so the discriminant is tested explicitly â 943// same control flow for every defined input. 944fn GetSkyRadiance( 945 atm: Atm, 946 transmittance_texture: texture_2d<f32>, 947 scattering_texture: texture_3d<f32>, 948 scattering_sampler: sampler, 949 camera_in: vec3f, view_ray: vec3f, shadow_length: f32, 950 sun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f { 951 var camera = camera_in; 952 var r = length(camera); 953 var rmu = dot(camera, view_ray); 954 let disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius; 955 var distance_to_top_atmosphere_boundary = -1.0; 956 if (disc >= 0.0) { 957 distance_to_top_atmosphere_boundary = -rmu - sqrt(disc); 958 } 959 960 if (distance_to_top_atmosphere_boundary > 0.0) { 961 camera = camera + view_ray * distance_to_top_atmosphere_boundary;
962 r = atm.top_radius; 963 rmu += distance_to_top_atmosphere_boundary; 964 } else if (r > atm.top_radius) { 965 *transmittance = vec3f(0.0); 966 return vec3f(0.0); 967 } 968 969 let mu = rmu / r; 970 let mu_s = dot(camera, sun_direction) / r; 971 let nu = dot(view_ray, sun_direction); 972 let ray_r_mu_intersects_ground = RayIntersectsGround(atm, r, mu); 973 974 if (ray_r_mu_intersects_ground) { 975 *transmittance = vec3f(0.0); 976 } else { 977 *transmittance = GetTransmittanceToTopAtmosphereBoundary( 978 atm, transmittance_texture, r, mu); 979 } 980 981 var single_mie_scattering: vec3f; 982 var scattering: vec3f; 983 984 if (shadow_length == 0.0) { 985 scattering = GetCombinedScattering( 986 atm, scattering_texture, scattering_sampler, 987 r, mu, mu_s, nu, ray_r_mu_intersects_ground, 988 &single_mie_scattering); 989 } else { 990 let d = shadow_length; 991 let r_p = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r)); 992 let mu_p = (r * mu + d) / r_p; 993 let mu_s_p = (r * mu_s + d * nu) / r_p; 994 995 scattering = GetCombinedScattering( 996 atm, scattering_texture, scattering_sampler, 997 r_p, mu_p, mu_s_p, nu, ray_r_mu_intersects_ground, 998 &single_mie_scattering); 999 1000 let shadow_transmittance = GetTransmittance( 1001 atm, transmittance_texture, r, mu, shadow_length, 1002 ray_r_mu_intersects_ground); 1003 1004 scattering = scattering * shadow_transmittance; 1005 single_mie_scattering = single_mie_scattering * shadow_transmittance; 1006 } 1007 1008 return scattering * RayleighPhaseFunction(nu) + single_mie_scattering * 1009 MiePhaseFunction(atm.mie_phase_function_g, nu); 1010} 1011 1012/** 1013 * The transmittance half of GetSkyRadiance, without the radiance. 1014 * 1015 * The clouds march calls GetSkyRadiance once per LIT step purely for its 1016 * transmittance out-param and drops the returned radiance on the floor â 1017 * paying two 3D scattering-LUT samples, the single-Mie extrapolation and 1018 * both phase functions (a pow among them) for a value nothing reads. Whether a 1019 * driver's optimizer notices is up to the driver; this is the same control 1020 * flow and the same lookup with the dead half deleted, so the value is 1021 * bit-identical either way. 1022 */ 1023fn GetSkyTransmittance( 1024 atm: Atm, 1025 transmittance_texture: texture_2d<f32>, 1026 camera_in: vec3f, view_ray: vec3f) -> vec3f { 1027 var camera = camera_in; 1028 var r = length(camera); 1029 var rmu = dot(camera, view_ray);
1030 let disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius; 1031 var distance_to_top_atmosphere_boundary = -1.0; 1032 if (disc >= 0.0) { 1033 distance_to_top_atmosphere_boundary = -rmu - sqrt(disc); 1034 } 1035 1036 if (distance_to_top_atmosphere_boundary > 0.0) { 1037 camera = camera + view_ray * distance_to_top_atmosphere_boundary; 1038 r = atm.top_radius; 1039 rmu += distance_to_top_atmosphere_boundary; 1040 } else if (r > atm.top_radius) { 1041 return vec3f(0.0); 1042 } 1043 1044 let mu = rmu / r; 1045 if (RayIntersectsGround(atm, r, mu)) { 1046 return vec3f(0.0); 1047 } 1048 return GetTransmittanceToTopAtmosphereBoundary( 1049 atm, transmittance_texture, r, mu); 1050} 1051 1052fn GetSunAndSkyIrradiance( 1053 atm: Atm, 1054 transmittance_texture: texture_2d<f32>, 1055 irradiance_texture: texture_2d<f32>, 1056 p: vec3f, normal: vec3f, sun_direction: vec3f, 1057 sky_irradiance: ptr<function, vec3f>) -> vec3f { 1058 let r = length(p); 1059 let mu_s = dot(p, sun_direction) / r; 1060 1061 *sky_irradiance = GetIrradiance(atm, irradiance_texture, r, mu_s) * 1062 (1.0 + dot(normal, p) / r) * 0.5; 1063 1064 return atm.solar_irradiance * 1065 GetTransmittanceToSun(atm, transmittance_texture, r, mu_s) * 1066 max(dot(normal, sun_direction), 0.0); 1067} 1068 1069// atmosphere.glsl wrappers: radiance -> luminance via the spectral factors. 1070fn GetSkyRadianceLum( 1071 atm: Atm, 1072 transmittance_texture: texture_2d<f32>, 1073 scattering_texture: texture_3d<f32>, 1074 scattering_sampler: sampler, 1075 camera: vec3f, view_ray: vec3f, shadow_length: f32, 1076 sun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f { 1077 return GetSkyRadiance(atm, transmittance_texture, scattering_texture, 1078 scattering_sampler, camera, view_ray, shadow_length, sun_direction, 1079 transmittance) * atm.sky_spectral_radiance_to_luminance; 1080} 1081 1082fn GetSunAndSkyIrradianceLum( 1083 atm: Atm, 1084 transmittance_texture: texture_2d<f32>, 1085 irradiance_texture: texture_2d<f32>, 1086 p: vec3f, normal: vec3f, sun_direction: vec3f, 1087 sky_irradiance: ptr<function, vec3f>) -> vec3f { 1088 let sun_irradiance = GetSunAndSkyIrradiance( 1089 atm, transmittance_texture, irradiance_texture, p, normal, 1090 sun_direction, sky_irradiance); 1091 *sky_irradiance = *sky_irradiance * atm.sky_spectral_radiance_to_luminance; 1092 return sun_irradiance * atm.sun_spectral_radiance_to_luminance; 1093} 1094 1095/** 1096 * The sky half of GetSunAndSkyIrradianceLum. Same story as 1097 * GetSkyTransmittance: the clouds march reads only the sky out-param and 1098 * discards the sun return, whose GetTransmittanceToSun is a second manual 1099 * bilinear (four texel loads) plus a smoothstep. Multiplication order is 1100 * kept exactly as the two-function chain evaluates it, so the result is 1101 * bit-identical. 1102 */ 1103fn GetSkyIrradianceLum( 1104 atm: Atm, 1105 irradiance_texture: texture_2d<f32>, 1106 p: vec3f, normal: vec3f, sun_direction: vec3f) -> vec3f { 1107 let r = length(p); 1108 let mu_s = dot(p, sun_direction) / r; 1109 return GetIrradiance(atm, irradiance_texture, r, mu_s) * 1110 (1.0 + dot(normal, p) / r) * 0.5 * 1111 atm.sky_spectral_radiance_to_luminance; 1112} 1113 1114// Rebuild the Atm struct from the packed uniforms the TSL entries receive 1115// (density profiles are precompute-only and stay zeroed). 1116fn UnpackAtm( 1117 solar_irradiance: vec3f, 1118 rayleigh_scattering: vec3f, 1119 mie_scattering: vec3f, 1120 sky_srtl: vec3f, 1121 sun_srtl: vec3f, 1122 // x: sun_angular_radius, y: bottom_radius, z: top_radius, w: mie_phase_g 1123 scalars: vec4f, 1124 mu_s_min: f32) -> Atm { 1125 var atm: Atm; 1126 atm.solar_irradiance = solar_irradiance; 1127 atm.rayleigh_scattering = rayleigh_scattering; 1128 atm.mie_scattering = mie_scattering; 1129 atm.sky_spectral_radiance_to_luminance = sky_srtl; 1130 atm.sun_spectral_radiance_to_luminance = sun_srtl; 1131 atm.sun_angular_radius = scalars.x; 1132 atm.bottom_radius = scalars.y;
1133 atm.top_radius = scalars.z; 1134 atm.mie_phase_function_g = scalars.w; 1135 atm.mu_s_min = mu_s_min; 1136 return atm; 1137} 1138 1139// ray.vert's interpolation, reproduced exactly: the reference normalizes the 1140// corner rays in the VERTEX shader, interpolates the unit vectors, then 1141// renormalizes per fragment â bilinear-mixing the four unit corner rays here 1142// is that same math (not the same as unprojecting the fragment directly). 1143fn SkyViewRay( 1144 uv: vec2f, ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f) -> vec3f { 1145 return normalize(mix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), uv.y)); 1146} 1147`,Bg=` 1148 let atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering, 1149 skySrtl, sunSrtl, atmScalars, muSMin); 1150 let earth_center = vec3f(0.0, -atm.bottom_radius, 0.0); 1151 let camera = cameraPos - earth_center; 1152 let sun_dir = normalize(sunDir); 1153 let view_ray = SkyViewRay(uv, ray00, ray10, ray01, ray11); 1154 1155 var transmittance: vec3f; 1156 let sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, 1157 scatteringSamp, camera, view_ray, 0.0, sun_dir, &transmittance); 1158 1159 return vec4f(min(sky, vec3f(${Yi})), 1.0); 1160`,Nh=` 1161fn mod289v4(x: vec4f) -> vec4f { return x - floor(x * (1.0 / 289.0)) * 289.0; } 1162 1163fn permuteV4(x: vec4f) -> vec4f { return mod289v4(((x * 34.0) + 10.0) * x); } 1164 1165fn taylorInvSqrt(r: vec4f) -> vec4f { return 1.79284291400159 - 0.85373472095314 * r; } 1166 1167fn mod289v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 289.0)) * 289.0; } 1168 1169fn simplexNoise(v: vec3f) -> f32 { 1170 let C = vec2f(1.0 / 6.0, 1.0 / 3.0); 1171 let D = vec4f(0.0, 0.5, 1.0, 2.0); 1172 1173 // First corner 1174 var i = floor(v + dot(v, C.yyy)); 1175 let x0 = v - i + dot(i, C.xxx); 1176 1177 // Other corners 1178 let g = step(x0.yzx, x0.xyz); 1179 let l = 1.0 - g; 1180 let i1 = min(g.xyz, l.zxy); 1181 let i2 = max(g.xyz, l.zxy); 1182 1183 let x1 = x0 - i1 + C.xxx; 1184 let x2 = x0 - i2 + C.yyy; 1185 let x3 = x0 - D.yyy; 1186 1187 // Permutations 1188 i = mod289v3(i); 1189 let p = permuteV4(permuteV4(permuteV4( 1190 i.z + vec4f(0.0, i1.z, i2.z, 1.0)) + 1191 i.y + vec4f(0.0, i1.y, i2.y, 1.0)) + 1192 i.x + vec4f(0.0, i1.x, i2.x, 1.0)); 1193 1194 let n_ = 0.142857142857; 1195 let ns = n_ * D.wyz - D.xzx; 1196 1197 let j = p - 49.0 * floor(p * ns.z * ns.z); 1198 1199 let x_ = floor(j * ns.z); 1200 let y_ = floor(j - 7.0 * x_); 1201 1202 let x = x_ * ns.x + ns.yyyy; 1203 let y = y_ * ns.x + ns.yyyy; 1204 let h = 1.0 - abs(x) - abs(y); 1205 1206 let b0 = vec4f(x.xy, y.xy); 1207 let b1 = vec4f(x.zw, y.zw); 1208 1209 let s0 = floor(b0) * 2.0 + 1.0; 1210 let s1 = floor(b1) * 2.0 + 1.0; 1211 let sh = -step(h, vec4f(0.0)); 1212 1213 let a0 = b0.xzyw + s0.xzyw * sh.xxyy; 1214 let a1 = b1.xzyw + s1.xzyw * sh.zzww; 1215 1216 var p0 = vec3f(a0.xy, h.x); 1217 var p1 = vec3f(a0.zw, h.y); 1218 var p2 = vec3f(a1.xy, h.z); 1219 var p3 = vec3f(a1.zw, h.w); 1220 1221 // Normalise gradients 1222 let norm = taylorInvSqrt(vec4f(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); 1223 p0 *= norm.x; 1224 p1 *= norm.y; 1225 p2 *= norm.z; 1226 p3 *= norm.w; 1227 1228 // Mix final noise value 1229 var m = max(0.5 - vec4f(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec4f(0.0)); 1230 m = m * m; 1231 return 105.0 * dot(m * m, vec4f(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); 1232} 1233 1234fn simplexFBM(x: vec3f, octaves: i32, freq_in: f32) -> f32 { 1235 var final_: f32 = 0.0; 1236 var denom: f32 = 0.0; 1237 var amp: f32 = 1.0; 1238 var freq = freq_in; 1239 1240 for (var i: i32 = 0; i < octaves; i++) { 1241 final_ += amp * simplexNoise(x * freq); 1242 denom += amp; 1243 1244 freq *= 2.0; 1245 amp *= 0.5; 1246 } 1247 1248 return final_ / denom; 1249} 1250 1251fn mod7v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 7.0)) * 7.0; } 1252 1253fn permuteV3(x: vec3f) -> vec3f { return mod289v3((34.0 * x + 10.0) * x); } 1254 1255fn worleyNoise(P: vec3f) -> f32 { 1256 let K = 0.142857142857; 1257 let Ko = 0.428571428571; 1258 let K2 = 0.020408163265306; 1259 let Kz = 0.166666666667; 1260 let Kzo = 0.416666666667; 1261 let jitter = 1.0; 1262 1263 let Pi = mod289v3(floor(P)); 1264 let Pf = fract(P) - 0.5; 1265 1266 let Pfx = Pf.x + vec3f(1.0, 0.0, -1.0); 1267 let Pfy = Pf.y + vec3f(1.0, 0.0, -1.0); 1268 let Pfz = Pf.z + vec3f(1.0, 0.0, -1.0); 1269 1270 let p = permuteV3(Pi.x + vec3f(-1.0, 0.0, 1.0)); 1271 let p1 = permuteV3(p + Pi.y - 1.0); 1272 let p2 = permuteV3(p + Pi.y); 1273 let p3 = permuteV3(p + Pi.y + 1.0); 1274 1275 let p11 = permuteV3(p1 + Pi.z - 1.0); 1276 let p12 = permuteV3(p1 + Pi.z); 1277 let p13 = permuteV3(p1 + Pi.z + 1.0); 1278 1279 let p21 = permuteV3(p2 + Pi.z - 1.0); 1280 let p22 = permuteV3(p2 + Pi.z); 1281 let p23 = permuteV3(p2 + Pi.z + 1.0); 1282 1283 let p31 = permuteV3(p3 + Pi.z - 1.0); 1284 let p32 = permuteV3(p3 + Pi.z); 1285 let p33 = permuteV3(p3 + Pi.z + 1.0); 1286 1287 let ox11 = fract(p11 * K) - Ko; 1288 let oy11 = mod7v3(floor(p11 * K)) * K - Ko; 1289 let oz11 = floor(p11 * K2) * Kz - Kzo; 1290 1291 let ox12 = fract(p12 * K) - Ko; 1292 let oy12 = mod7v3(floor(p12 * K)) * K - Ko; 1293 let oz12 = floor(p12 * K2) * Kz - Kzo; 1294 1295 let ox13 = fract(p13 * K) - Ko; 1296 let oy13 = mod7v3(floor(p13 * K)) * K - Ko; 1297 let oz13 = floor(p13 * K2) * Kz - Kzo; 1298 1299 let ox21 = fract(p21 * K) - Ko; 1300 let oy21 = mod7v3(floor(p21 * K)) * K - Ko; 1301 let oz21 = floor(p21 * K2) * Kz - Kzo; 1302 1303 let ox22 = fract(p22 * K) - Ko; 1304 let oy22 = mod7v3(floor(p22 * K)) * K - Ko; 1305 let oz22 = floor(p22 * K2) * Kz - Kzo; 1306 1307 let ox23 = fract(p23 * K) - Ko; 1308 let oy23 = mod7v3(floor(p23 * K)) * K - Ko; 1309 let oz23 = floor(p23 * K2) * Kz - Kzo; 1310 1311 let ox31 = fract(p31 * K) - Ko; 1312 let oy31 = mod7v3(floor(p31 * K)) * K - Ko; 1313 let oz31 = floor(p31 * K2) * Kz - Kzo; 1314 1315 let ox32 = fract(p32 * K) - Ko; 1316 let oy32 = mod7v3(floor(p32 * K)) * K - Ko; 1317 let oz32 = floor(p32 * K2) * Kz - Kzo; 1318 1319 let ox33 = fract(p33 * K) - Ko; 1320 let oy33 = mod7v3(floor(p33 * K)) * K - Ko; 1321 let oz33 = floor(p33 * K2) * Kz - Kzo; 1322 1323 let dx11 = Pfx + jitter * ox11; 1324 let dy11 = Pfy.x + jitter * oy11; 1325 let dz11 = Pfz.x + jitter * oz11; 1326 1327 let dx12 = Pfx + jitter * ox12; 1328 let dy12 = Pfy.x + jitter * oy12; 1329 let dz12 = Pfz.y + jitter * oz12; 1330 1331 let dx13 = Pfx + jitter * ox13; 1332 let dy13 = Pfy.x + jitter * oy13; 1333 let dz13 = Pfz.z + jitter * oz13; 1334 1335 let dx21 = Pfx + jitter * ox21; 1336 let dy21 = Pfy.y + jitter * oy21; 1337 let dz21 = Pfz.x + jitter * oz21; 1338 1339 let dx22 = Pfx + jitter * ox22; 1340 let dy22 = Pfy.y + jitter * oy22; 1341 let dz22 = Pfz.y + jitter * oz22; 1342 1343 let dx23 = Pfx + jitter * ox23; 1344 let dy23 = Pfy.y + jitter * oy23; 1345 let dz23 = Pfz.z + jitter * oz23; 1346 1347 let dx31 = Pfx + jitter * ox31; 1348 let dy31 = Pfy.z + jitter * oy31; 1349 let dz31 = Pfz.x + jitter * oz31; 1350 1351 let dx32 = Pfx + jitter * ox32; 1352 let dy32 = Pfy.z + jitter * oy32; 1353 let dz32 = Pfz.y + jitter * oz32; 1354 1355 let dx33 = Pfx + jitter * ox33; 1356 let dy33 = Pfy.z + jitter * oy33; 1357 let dz33 = Pfz.z + jitter * oz33; 1358 1359 let d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11; 1360 let d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12; 1361 let d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13; 1362 let d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21; 1363 let d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22; 1364 let d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23; 1365 let d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31; 1366 let d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32; 1367 let d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33; 1368 1369 let d1 = min(min(d11, d12), d13); 1370 let d2 = min(min(d21, d22), d23); 1371 let d3 = min(min(d31, d32), d33); 1372 var d = min(min(d1, d2), d3); 1373 let dx = min(min(d.x, d.y), d.z); 1374 return sqrt(dx); 1375} 1376`,Fg=` 1377 let atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering, 1378 skySrtl, sunSrtl, atmScalars, muSMin); 1379 1380 var ctx: CloudsCtx; 1381 ctx.maxDistance = cloudsParamsA.x; 1382 ctx.sigmaS = cloudsParamsA.y; 1383 ctx.sigmaA = cloudsParamsA.z; 1384 ctx.cloudLayerThickness = cloudsParamsA.w; 1385 ctx.cloudLayerBottom = cloudsParamsB.x; 1386 ctx.highCloudsHeight = cloudsParamsB.y; 1387 ctx.highCloudsScale = cloudsParamsB.z; 1388 ctx.weatherMapScale = cloudsParamsB.w; 1389 ctx.baseNoiseScale = cloudsParamsC.x; 1390 ctx.detailNoiseScale = cloudsParamsC.y; 1391 ctx.cirrusDensity = cloudsParamsC.z; 1392 ctx.altoDensity = cloudsParamsC.w; 1393 ctx.windSpeed = cloudsParamsD.x; 1394 ctx.weatherMapBlend = cloudsParamsD.y; 1395 ctx.time = cloudsParamsD.z; 1396 ctx.minStep = cloudsParamsD.w; 1397 ctx.sigmaT = ctx.sigmaA + ctx.sigmaS; 1398 ctx.fogFactor = ctx.maxDistance / 6.0; 1399 ctx.bottomRadius = atm.bottom_radius; 1400 ctx.sunDir = normalize(sunDir); 1401 ctx.earthCenter = vec3f(0.0, -atm.bottom_radius, 0.0); 1402 1403 let rd = SkyViewRay(uv, ray00, ray10, ray01, ray11); 1404 1405 let volumetric = RaymarchVolumetricCloud(ctx, atm, 1406 transmittanceTex, scatteringTex, scatteringSamp, irradianceTex, 1407 baseNoiseTex, noiseSamp, detailNoiseTex, 1408 weatherCurTex, weatherSamp, weatherNextTex, 1409 cameraPos, rd); 1410 let hightAlt = HighAltitudeCloud(ctx, atm, 1411 transmittanceTex, scatteringTex, scatteringSamp, 1412 highCloudsTex, weatherSamp, 1413 cameraPos, rd); 1414 1415 var cloud = volumetric; 1416 cloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb, 1417 cloud.a + (1.0 - cloud.a) * hightAlt.a); 1418 1419 return vec4f(min(cloud.rgb, vec3f(${Yi})), cloud.a); 1420`,Lg=` 1421 let atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering, 1422 skySrtl, sunSrtl, atmScalars, muSMin); 1423 let earth_center = vec3f(0.0, -atm.bottom_radius, 0.0); 1424 let camera = cameraPos - earth_center; 1425 let sun_dir = normalize(sunDir); 1426 1427 let azimuth = (uv.x - 0.5) * 2.0 * PI; 1428 let latitude = (uv.y - 0.5) * PI; 1429 let cosLat = cos(latitude); 1430 let rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth)); 1431 1432 var transmittance: vec3f; 1433 let sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, 1434 scatteringSamp, camera, rd, 0.0, sun_dir, &transmittance); 1435 1436 var cloud = vec4f(0.0); 1437 if (cloudsOn > 0.5) { 1438 var ctx: CloudsCtx; 1439 ctx.maxDistance = cloudsParamsA.x; 1440 ctx.sigmaS = cloudsParamsA.y; 1441 ctx.sigmaA = cloudsParamsA.z; 1442 ctx.cloudLayerThickness = cloudsParamsA.w; 1443 ctx.cloudLayerBottom = cloudsParamsB.x; 1444 ctx.highCloudsHeight = cloudsParamsB.y; 1445 ctx.highCloudsScale = cloudsParamsB.z; 1446 ctx.weatherMapScale = cloudsParamsB.w; 1447 ctx.baseNoiseScale = cloudsParamsC.x; 1448 ctx.detailNoiseScale = cloudsParamsC.y; 1449 ctx.cirrusDensity = cloudsParamsC.z; 1450 ctx.altoDensity = cloudsParamsC.w; 1451 ctx.windSpeed = cloudsParamsD.x; 1452 ctx.weatherMapBlend = cloudsParamsD.y; 1453 ctx.time = cloudsParamsD.z; 1454 ctx.minStep = cloudsParamsD.w; 1455 ctx.sigmaT = ctx.sigmaA + ctx.sigmaS; 1456 ctx.fogFactor = ctx.maxDistance / 6.0; 1457 ctx.bottomRadius = atm.bottom_radius; 1458 ctx.sunDir = sun_dir; 1459 ctx.earthCenter = earth_center; 1460 1461 let volumetric = RaymarchVolumetricCloud(ctx, atm, 1462 transmittanceTex, scatteringTex, scatteringSamp, irradianceTex, 1463 baseNoiseTex, noiseSamp, detailNoiseTex, 1464 weatherCurTex, weatherSamp, weatherNextTex, 1465 cameraPos, rd); 1466 let hightAlt = HighAltitudeCloud(ctx, atm, 1467 transmittanceTex, scatteringTex, scatteringSamp, 1468 highCloudsTex, weatherSamp, 1469 cameraPos, rd); 1470 cloud = volumetric; 1471 cloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb, 1472 cloud.a + (1.0 - cloud.a) * hightAlt.a); 1473 } 1474 1475 let WHITE_POINT: f32 = 11.07; 1476 var color = min(sky, vec3f(${Yi})) * (1.0 - cloud.a) + 1477 min(cloud.rgb, vec3f(${Yi})); 1478 color = Hable(color, exposure, WHITE_POINT); 1479 color = pow(color, vec3f(1.0 / gamma)); 1480 1481 return vec4f(color, 1.0); 1482`,Uu=` 1483fn HableTonemap(x: vec3f) -> vec3f { 1484 let A = 0.15; 1485 let B = 0.50; 1486 let C = 0.10; 1487 let D = 0.20; 1488 let E = 0.02; 1489 let F = 0.30; 1490 return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; 1491} 1492 1493fn Hable(color: vec3f, exposure: f32, whitePoint: f32) -> vec3f { 1494 return HableTonemap(color * exposure) / HableTonemap(vec3f(whitePoint)); 1495} 1496`,Ig=` 1497${Nh} 1498fn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 { 1499 return min2 + (value - min1) * (max2 - min2) / (max1 - min1); 1500} 1501 1502@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>; 1503 1504// The reference dispatches 8x8x8 workgroups; WebGPU's default 1505// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the 1506// driver dispatches size/4 groups â same texel coverage, same math). 1507@compute @workgroup_size(4, 4, 4) 1508fn main(@builtin(global_invocation_id) gid: vec3u) { 1509 let id = vec3i(gid); 1510 let size = vec3i(textureDimensions(outNoise)); 1511 if (any(id >= size)) { 1512 return; 1513 } 1514 1515 let f = vec3f(id); 1516 1517 let p = simplexFBM(f, 4, 0.25) * 0.5 + 0.5; 1518 let w = 1.0 - worleyNoise(f * 0.125) / 0.866; 1519 1520 var result: vec4f; 1521 result.r = remap(p, 0.0, 1.0, w, 1.0); 1522 result.g = worleyNoise(f * 0.25); 1523 result.b = worleyNoise(f * 0.5); 1524 result.a = worleyNoise(f); 1525 1526 textureStore(outNoise, id, result); 1527} 1528`,Dg=` 1529${Nh} 1530@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>; 1531 1532// The reference dispatches 8x8x8 workgroups; WebGPU's default 1533// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the 1534// driver dispatches size/4 groups â same texel coverage, same math). 1535@compute @workgroup_size(4, 4, 4) 1536fn main(@builtin(global_invocation_id) gid: vec3u) { 1537 let id = vec3i(gid); 1538 let size = vec3i(textureDimensions(outNoise)); 1539 if (any(id >= size)) { 1540 return; 1541 } 1542 1543 let f = vec3f(id); 1544 1545 var result: vec4f; 1546 result.r = 1.0 - worleyNoise(f * 0.25); 1547 result.g = 1.0 - worleyNoise(f * 0.5); 1548 result.b = 1.0 - worleyNoise(f); 1549 result.a = 1.0; 1550 1551 textureStore(outNoise, id, result); 1552} 1553`,Ce=Math.fround,ss=360,Ug=.5*Math.PI/180,kr=1e3,Og=[1.11776,1.14259,1.01249,1.14716,1.72765,1.73054,1.6887,1.61253,1.91198,2.03474,2.02042,2.02212,1.93377,1.95809,1.91686,1.8298,1.8685,1.8931,1.85149,1.8504,1.8341,1.8345,1.8147,1.78158,1.7533,1.6965,1.68194,1.64654,1.6048,1.52143,1.55622,1.5113,1.474,1.4482,1.41018,1.36775,1.34188,1.31429,1.28303,1.26758,1.2367,1.2082,1.18737,1.14683,1.12362,1.1058,1.07124,1.04992],Gg=[118e-29,2182e-31,2818e-31,6636e-31,1527e-30,2763e-30,552e-29,8451e-30,1582e-29,2316e-29,3669e-29,4924e-29,7752e-29,9016e-29,148e-27,1602e-28,2139e-28,2755e-28,3091e-28,35e-26,4266e-28,4672e-28,4398e-28,4701e-28,5019e-28,4305e-28,374e-27,3215e-28,2662e-28,2238e-28,1852e-28,1473e-28,1209e-28,9423e-29,7455e-29,6566e-29,5105e-29,415e-28,4228e-29,3237e-29,2451e-29,2801e-29,2534e-29,1624e-29,1465e-29,2078e-29,1383e-29,7105e-30],Ou=[360,1299e-7,3917e-9,6061e-7,365,2321e-7,6965e-9,.001086,370,4149e-7,1239e-8,.001946,375,7416e-7,2202e-8,.003486,380,.001368,39e-6,.006450001,385,.002236,64e-6,.01054999,390,.004243,12e-5,.02005001,395,.00765,217e-6,.03621,400,.01431,396e-6,.06785001,405,.02319,64e-5,.1102,410,.04351,.00121,.2074,415,.07763,.00218,.3713,420,.13438,.004,.6456,425,.21477,.0073,1.0390501,430,.2839,.0116,1.3856,435,.3285,.01684,1.62296,440,.34828,.023,1.74706,445,.348
vendor: 4,405 bytes, line 1553
155306,.0298,1.7826,450,.3362,.038,1.77211,455,.3187,.048,1.7441,460,.2908,.06,1.6692,465,.2511,.0739,1.5281,470,.19536,.09098,1.28764,475,.1421,.1126,1.0419,480,.09564,.13902,.8129501,485,.05795001,.1693,.6162,490,.03201,.20802,.46518,495,.0147,.2586,.3533,500,.0049,.323,.272,505,.0024,.4073,.2123,510,.0093,.503,.1582,515,.0291,.6082,.1117,520,.06327,.71,.07824999,525,.1096,.7932,.05725001,530,.1655,.862,.04216,535,.2257499,.9148501,.02984,540,.2904,.954,.0203,545,.3597,.9803,.0134,550,.4334499,.9949501,.008749999,555,.5120501,1,.005749999,560,.5945,.995,.0039,565,.6784,.9786,.002749999,570,.7621,.952,.0021,575,.8425,.9154,.0018,580,.9163,.87,.001650001,585,.9786,.8163,.0014,590,1.0263,.757,.0011,595,1.0567,.6949,.001,600,1.0622,.631,8e-4,605,1.0456,.5668,6e-4,610,1.0026,.503,34e-5,615,.9384,.4412,24e-5,620,.8544499,.381,19e-5,625,.7514,.321,1e-4,630,.6424,.265,4999999e-11,635,.5419,.217,3e-5,640,.4479,.175,2e-5,645,.3608,.1382,1e-5,650,.2835,.107,0,655,.2187,.0816,0,660,.1649,.061,0,665,.1212,.04458,0,670,.0874,.032,0,675,.0636,.0232,0,680,.04677,.017,0,685,.0329,.01192,0,690,.0227,.00821,0,695,.01584,.005723,0,700,.01135916,.004102,0,705,.008110916,.002929,0,710,.005790346,.002091,0,715,.004109457,.001484,0,720,.002899327,.001047,0,725,.00204919,74e-5,0,730,.001439971,52e-5,0,735,.0009999493,3611e-7,0,740,.0006900786,2492e-7,0,745,.0004760213,1719e-7,0,750,.0003323011,12e-5,0,755,.0002348261,848e-7,0,760,.0001661505,6e-5,0,765,117413e-9,424e-7,0,770,8307527e-11,3e-5,0,775,5870652e-11,212e-7,0,780,4150994e-11,1499e-8,0,785,2935326e-11,106e-7,0,790,2067383e-11,74657e-10,0,795,1455977e-11,52578e-10,0,800,1025398e-11,37029e-10,0,805,7221456e-12,26078e-10,0,810,5085868e-12,18366e-10,0,815,3581652e-12,12934e-10,0,820,2522525e-12,91093e-11,0,825,1776509e-12,64153e-11,0,830,1251141e-12,45181e-11,0],$a=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],Gu={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Ar(e,t,a){if(a<e[0])return t[0];for(let r=0;r<e.length-1;r++)if(a<e[r+1]){let s=(a-e[r])/(e[r+1]-e[r]);return t[r]*(1-s)+t[r+1]*s}return t[t.length-1]}function Yn(e,t){if(e<=ss||e>=830)return 0;let a=(e-ss)/5,r=Math.floor(a);return a-=r,Ou[4*r+t]*(1-a)+Ou[4*(r+1)+t]*a}function qu(e,t,a){let r=0,s=0,i=0,n=Ar(e,t,680),l=Ar(e,t,550),o=Ar(e,t,440);for(let u=ss;u<830;u+=1){let d=Yn(u,1),m=Yn(u,2),h=Yn(u,3),f=$a[0]*d+$a[1]*m+$a[2]*h,p=$a[3]*d+$a[4]*m+$a[5]*h,_=$a[6]*d+$a[7]*m+$a[8]*h,y=Ar(e,t,u);r+=f*y/n*Math.pow(Ce(u/680),a),s+=p*y/l*Math.pow(Ce(u/550),a),i+=_*y/o*Math.pow(Ce(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Bh=Math.PI/180;function Ai(e,t,a,r,s){return[Ce(e/kr),Ce(t),Ce(a*kr),Ce(r*kr),Ce(s)]}function Wu(e){return new Float32Array([...e,...e])}var Hu=Ce(Bh),qg=Ce(Math.PI),Wg=Ce(2*Math.PI);function ju(e,t=80){let a=Ce(52*Hu),r=Ce(Ce(23.44)*Hu),s=Ce(e%86400/86400),i=Ce(r*Math.sin(Ce(Ce(Ce(2*qg)*(t-80))/365))),n=Ce(Ce(s-.5)*Wg),l=Ce(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=Ce(1-Ce(l*l)),u=Ce(Math.sqrt(o>0?o:0));return[Ce(u*Math.sin(n)),l,Ce(u*Math.cos(n))]}var G=Math.fround,ut=256;function $u(e){return G(e-Math.floor(e))}function Hg(e,t,a){e=G(e+a),t=G(t+a);let r=G(G(e*G(127.1))+G(t*G(311.7))),s=G(G(e*G(269.5))+G(t*G(183.3)));return[$u(G(G(Math.sin(r))*G(43758.5453123))),$u(G(G(Math.sin(s))*G(43758.5453123)))]}function Jn(e,t,a){return G(G(G(G(G(t-e)*G(3-G(2*a)))*a)*a)+e)}var jg=G(G(3.14159265)/2147483648);function Pi(e,t,a,r,s){let[i,n]=(function(u,d,m){let h=u>>>0,f=d>>>0;h=(h^Math.imul(m,2654435761))>>>0,f=(f^Math.imul(m,2246822519))>>>0,h=Math.imul(h,3284157443)>>>0,f=(f^(h<<16|h>>>16))>>>0,f=Math.imul(f,1911520717)>>>0,h=(h^(f<<16|f>>>16))>>>0,h=Math.imul(h,2048419325)>>>0;let p=G(G(h)*jg);return[G(Math.sin(p)),G(Math.cos(p))]})(e,t,s),l=G(a-e),o=G(r-t);return G(G(l*i)+G(o*n))}function $g(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=G(e-r),o=G(t-s),u=Pi(r,s,e,t,a),d=Pi(i,s,e,t,a),m=Jn(u,d,l);u=Pi(r,n,e,t,a),d=Pi(i,n,e,t,a);let h=Jn(u,d,l);return Jn(m,h,o)}function Kr(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=G(n+G(s*$g(G(t*r),G(a*r),i))),l=G(l+s),s=G(.5*s),r=G(2*r);return G(n/l)}function Ku(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=G(e-s),l=G(t-i),o=1e9;for(let u=-1;u<=1;u++)for(let d=-1;d<=1;
1553d++){let m=G(G(G(s+d)+a)%a),h=G(G(G(i+u)+a)%a),[f,p]=Hg(m,h,r),_=G(f+d),y=G(p+u),g=G(_-n),x=G(y-l),v=G(Math.sqrt(G(G(g*g)+G(x*x))));v<o&&(o=v)}return o}function br(e,t,a){let r=G(G(a-e)/G(t-e));return r<0&&(r=0),r>1&&(r=1),G(G(r*r)*G(3-G(2*r)))}function Xu(e,t,a){return G(G(e*G(1-a))+G(t*a))}function As(e){return Math.trunc(e)>>>0}var Fh=new Float32Array(1),Kg=new Uint32Array(Fh.buffer);function el(e){Fh[0]=e;let t=Kg[0],a=t>>>16&32768,r=t>>>23&255,s=8388607&t;if(r===255)return 31744|a|(s!==0?512:0);let i=r-112;return i>=31?31744|a:i<=0?a:(a|i<<10|s>>>13)+(s>>>12&1)}var Tr=new Map;function Xg(e,t){let a=`${e}|${G(t)}`,r=Tr.get(a);if(r!==void 0)return Tr.delete(a),Tr.set(a,r),r;let s=(function(i){let n=new Uint16Array(262144);for(let l=0;l<65536;l++)n[4*l+0]=el(i[3*l+0]),n[4*l+1]=el(i[3*l+1]),n[4*l+2]=el(i[3*l+2]),n[4*l+3]=15360;return n})((function(i,n){switch(n=G(n),i){case"clear":return new Float32Array(196608);case"mostlyClear":return(function(l){let o=new Float32Array(196608),u=As(l);for(let d=0;d<ut;d++)for(let m=0;m<ut;m++){let h=G(d/ut),f=G(m/ut),p=3*(m*ut+d),_=G(G(.5*Kr(3,h,f,24,1,u))+.5);o[p+0]=G(br(G(.45),G(.8),_)*G(.7)),o[p+1]=0,o[p+2]=G(.3)}return o})(n);case"partlyCloudy":return(function(l){let o=new Float32Array(196608),u=G(Math.max(1,As(l)));for(let d=0;d<ut;d++)for(let m=0;m<ut;m++){let h=G(d/ut),f=G(m/ut),p=3*(m*ut+d),_=G(1-Ku(G(24*h),G(24*f),24,l)),y=G(G(.5*Kr(3,h,f,16,u,0))+.5),g=G(y*br(G(.3),1,_)),x=G(Xu(0,G(.35),br(G(.1),G(.4),g))*_);o[p+0]=g,o[p+1]=0,o[p+2]=g<.1?0:x}return o})(n);case"mostlyCloudy":return(function(l){let o=new Float32Array(196608),u=G(Math.max(1,As(l)));for(let d=0;d<ut;d++)for(let m=0;m<ut;m++){let h=G(d/ut),f=G(m/ut),p=3*(m*ut+d),_=G(1-Ku(G(32*h),G(32*f),32,l)),y=G(G(.5*Kr(3,h,f,16,u,0))+.5),g=G(y*br(0,G(.9),_)),x=G(Xu(0,G(.6),br(G(.1),G(.4),g))*_);o[p+0]=g,o[p+1]=0,o[p+2]=g<.1?0:x}return o})(n);case"overcast":return(function(l){let o=new Float32Array(196608),u=As(l);for(let d=0;d<ut;d++)for(let m=0;m<ut;m++){let h=G(d/ut),f=G(m/ut),p=3*(m*ut+d),_=G(G(.5*Kr(3,h,f,16,1,u))+.5);o[p+0]=br(G(.2),1,_),o[p+1]=G(.3),o[p+2]=G(.8)}return o})(n);case"storm":return(function(l){let o=new Float32Array(196608),u=As(l);for(let d=0;d<ut;d++)for(let m=0;m<ut;m++){let h=G(d/ut),f=G(m/ut),p=3*(m*ut+d),_=G(G(.5*Kr(3,h,f,16,1,u))+.5);o[p+0]=br(G(.1),1,_),o[p+1]=G(G(.5*Kr(2,h,f,8,1,u))+.5),o[p+2]=1}return o})(n)}})(e,t));return Tr.size>=8&&Tr.delete(Tr.keys().next().value),Tr.set(a,s),s}var Qg={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function Qu(e){let t=fl(Qg[e]),a=await fetch(t,{mode:"cors"});if(!a.ok)throw new Error(`skyAssets: fetching ${t} failed (${a.status})`);return new Uint8Array(await a.arrayBuffer())}async function Zu(e){let t=512,a=await createImageBitmap(new Blob([e],{type:"image/png"}),{colorSpaceConversion:"none"}),r=new OffscreenCanvas(t,t).getContext("2d");if(!r)throw new Error("skyAssets: no 2d context for PNG decode");r.drawImage(a,0,0,t,t),a.close();let s=r.getImageData(0,0,t,t).data,i=new Uint8Array(t*t);for(let n=0;n<t;n++){let l=511-n;for(let o=0;o<t;o++)i[n*t+o]=s[4*(l*t+o)]}return i}var Yu=` 1554const HDRI_PI: f32 = 3.141592653589793; 1555 1556fn HdriRotateByEuler(dir: vec3f, euler: vec3f) -> vec3f { 1557 let cx = cos(euler.x); let sx = sin(euler.x); 1558 let cy = cos(euler.y); let sy = sin(euler.y); 1559 let cz = cos(euler.z); let sz = sin(euler.z); 1560 1561 let rot = mat3x3f( 1562 cy * cz, cy * sz, -sy, 1563 sx * sy * cz - cx * sz, sx * sy * sz + cx * cz, sx * cy, 1564 cx * sy * cz + sx * sz, cx * sy * sz - sx * cz, cx * cy 1565 ); 1566 return rot * dir; 1567} 1568 1569/** Direction â equirect uv â Hana's compute_equirectangular_uvs with the v 1570 * term flipped for three's flipY image upload (see the header note; u is 1571 * Hana's exact 1 â (long + Ï)/2Ï). */ 1572fn HdriDirToUv(dir0: vec3f, euler: vec3f) -> vec2f { 1573 let dir = HdriRotateByEuler(normalize(dir0), euler); 1574 let longitude = atan2(dir.x, dir.z); 1575 let latitude = asin(clamp(dir.y, -1.0, 1.0)); 1576 let u = 1.0 - (longitude + HDRI_PI) / (2.0 * HDRI_PI); 1577 let v = (latitude + HDRI_PI / 2.0) / HDRI_PI; 1578 return vec2f(u, v); 1579} 1580 1581/** Mip level whose texel footprint covers the given angle. Used per tap by 1582 * HdriSampleBlurred so the gaussian rings never undersample the gaps 1583 * between taps (same LOD-selection idea as the reflection layer's 1584 * cone-width blur). 0 when the footprint is smaller than one texel. */ 1585fn HdriBlurLod(texWidth: f32, footprintAngle: f32) -> f32 { 1586 let texelsPerRadian = texWidth / (2.0 * HDRI_PI); 1587 return clamp(log2(max(footprintAngle * texelsPerRadian, 1.0)), 0.0, 16.0); 1588} 1589 1590/** Interleaved gradient noise (Jimenez) â the same per-pixel hash family 1591 * the reflection layer's blur uses. Deliberately STATIC here (no frame 1592 * animation, no TAA reliance): the blur must look identical whether or 1593 * not temporal AA runs, so the dither is a fixed spatial pattern. */ 1594fn HdriIGN(pix: vec2f) -> f32 { 1595 return fract( 1596 52.9829189 * fract(dot(pix, vec2f(0.06711056, 0.00583715)))); 1597} 1598 1599/** 1600 * Gaussian-blurred equirect sample: a 13-tap disc around the ray â center 1601 * plus two hex rings at 1Ï and 2Ï (Ï = half the blur angle), true gaussian 1602 * ring weights (e^0, e^-0.5, e^-2) â with every tap reading a Ï-footprint 1603 * mip so the rings blend seamlessly. Reads like a gaussian of ~Ï instead 1604 * of the boxy bilinear lozenges a bare mip pick produces at large radii; 1605 * a mip pyramid alone is a stack of 2Ã2 box filters. 1606 * 1607 * jitter (x = disc rotation in radians, y = ring radius scale) 1608 * decorrelates the kernel per pixel: a FIXED sparse disc leaves 1609 * tap-replica and mip-interpolation structure â subtle bands parallel to 1610 * strong source edges. The background pass feeds it static per-pixel IGN 1611 * (structured banding becomes fine, temporally stable spatial noise â 1612 * deliberately NOT frame-animated, so nothing depends on TAA); the tiny 1613 * env re-projection passes (0, 1). 1614 */ 1615fn HdriSampleBlurred( 1616 envTex: texture_2d<f32>
1616, envSamp: sampler, 1617 dir: vec3f, euler: vec3f, blurAngle: f32, jitter: vec2f) -> vec3f { 1618 let st0 = HdriDirToUv(dir, euler); 1619 if (blurAngle <= 0.0) { 1620 return textureSampleLevel(envTex, envSamp, st0, 0.0).rgb; 1621 } 1622 let sigma = blurAngle * 0.5; 1623 let lod = HdriBlurLod(f32(textureDimensions(envTex, 0).x), sigma); 1624 1625 // Tangent frame around the ray (the offsets live on its normal plane). 1626 let axis = select( 1627 vec3f(0.0, 1.0, 0.0), vec3f(1.0, 0.0, 0.0), abs(dir.y) > 0.99); 1628 let t1 = normalize(cross(axis, dir)); 1629 let t2 = cross(dir, t1); 1630 1631 let r1 = sigma * jitter.y; 1632 let r2 = 2.0 * sigma * jitter.y; 1633 let wRing1 = 0.60653066; // e^-0.5, taps at 1Ï 1634 let wRing2 = 0.13533528; // e^-2, taps at 2Ï 1635 var sum = textureSampleLevel(envTex, envSamp, st0, lod).rgb; 1636 var wSum = 1.0; 1637 for (var i = 0u; i < 6u; i = i + 1u) { 1638 // Ring 2 sits on the hex vertices, ring 1 on the rotated midpoints. 1639 let a1 = (f32(i) + 0.5) * (HDRI_PI / 3.0) + jitter.x; 1640 let d1 = normalize(dir + (t1 * cos(a1) + t2 * sin(a1)) * r1); 1641 sum += textureSampleLevel( 1642 envTex, envSamp, HdriDirToUv(d1, euler), lod).rgb * wRing1; 1643 let a2 = f32(i) * (HDRI_PI / 3.0) + jitter.x; 1644 let d2 = normalize(dir + (t1 * cos(a2) + t2 * sin(a2)) * r2); 1645 sum += textureSampleLevel( 1646 envTex, envSamp, HdriDirToUv(d2, euler), lod).rgb * wRing2; 1647 wSum += wRing1 + wRing2; 1648 } 1649 return sum / wSum; 1650} 1651`,rr=64,Ka=32;function tl(e){return Math.pow(e/255,2.2)}var Zg=class{constructor(e,t){this._uRotation=L(new ne),this._uBlurAngle=L(0),this.backgroundMesh=null,this._envTarget=null,this._envQuad=null,this._boundTexture=null,this._lastEnvKey=null,this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1,this._lighting=null,this._lightingKey=null,this._active=!1,this._renderer=e,this._rays=t}get attached(){return this.backgroundMesh?.parent!=null}get active(){return this._active}get environmentTexture(){return this._envTarget?.texture??null}lightingInfo(e){let t=`${e.uuid}|${e.version}`;return t!==this._lightingKey&&(this._lightingKey=t,this._lighting=(function(a){let r;if(Mn(a)){let{data:b,width:M,height:S}=a;r=(C,R)=>{let k=Math.min(M-1,Math.floor((C+.5)/rr*M)),E=Math.min(S-1,Math.floor((R+.5)/Ka*S)),I=4*((S-1-E)*M+k);return[Math.pow(Math.max(Cn.fromHalfFloat(b[I]),0),2.2),Math.pow(Math.max(Cn.fromHalfFloat(b[I+1]),0),2.2),Math.pow(Math.max(Cn.fromHalfFloat(b[I+2]),0),2.2)]}}else{if(typeof document>"u")return null;let b=document.createElement("canvas");b.width=rr,b.height=Ka;let M,S=b.getContext("2d",{willReadFrequently:!0});if(S===null)return null;try{S.drawImage(a,0,0,rr,Ka),M=S.getImageData(0,0,rr,Ka).data}catch{return null}r=(C,R)=>{let k=4*(R*rr+C);return[tl(M[k]),tl(M[k+1]),tl(M[k+2])]}}let s=b=>.2126*b[0]+.7152*b[1]+.0722*b[2],i=(b,M)=>{let S=(M+.5)/Ka*Math.PI,C=Math.PI-(b+.5)/rr*2*Math.PI,R=Math.sin(S);return[R*Math.sin(C),Math.cos(S),R*Math.cos(C)]},n=[0,0,0],l=[0,0,0],o=0,u=0,d=0;for(let b=0;b<Ka;b++){let M=Math.sin((b+.5)/Ka*Math.PI),S=b<16;for(let C=0;C<rr;C++){let R=r(C,b);d=Math.max(d,s(R));let k=S?n:l;k[0]+=R[0]*M,k[1]+=R[1]*M,k[2]+=R[2]*M,S?o+=M:u+=M}}let m=[n[0]/o,n[1]/o,n[2]/o],h=[l[0]/u,l[1]/u,l[2]/u],f=s(m),p=s(h),_=(f*o+p*u)/Math.max(o+u,1e-6),y=.9*d,g=[0,0,0],x=[0,0,0],v=0;for(let b=0;b<Ka;b++){let M=Math.sin((b+.5)/Ka*Math.PI);for(let S=0;S<rr;S++){let C=r(S,b),R=s(C);if(R<y)continue;let k=i(S,b),E=M*R;g[0]+=k[0]*E,g[1]+=k[1]*E,g[2]+=k[2]*E,x[0]+=C[0]*M,x[1]+=C[1]*M,x[2]+=C[2]*M,v+=M}}let V=Math.hypot(g[0],g[1],g[2]),T=v>0?[x[0]/v,x[1]/v,x[2]/v]:[1,1,1],z=s(T);return{skyColor:m,skyLum:f,groundColor:h,groundLum:p,meanLum:_,sunDir:V>1e-4?[g[0]/V,g[1]/V,g[2]/V]:[0,1,0],sunColor:T,sunLum:z,sunPeak:_>1e-6?z/_:1}})(e.image)),this._lighting}_ensureSampleTexture(e){if(this._sampleTexture===null||this._sourceTexture!==e){this._sampleTexture?.dispose();let t=Mn(e.image)?rp(e.image):new Lt(e.image);t.name="sky-hdri-source",t.wrapS=wa,t.wrapT=ns,t.minFilter=Oa,t.magFilter=Ve,t.generateMipmaps=!0,t.flipY=!Mn(e.image),t.needsUpdate=!0,this._sampleTexture=t,this._sourceTexture=e,this._sourceVersion=e.version}else e.version!==this._sourceVersion&&(this._sampleTexture.image=e.image,this._sampleTexture.needsUpdate=!0,this._sourceVersion=e.version);return this._sampleTexture}
1651_buildBackgroundNode(e){return ir(`fn hdriBackground( 1652 uv: vec2f, 1653 ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f, 1654 rotation: vec3f, blurAngle: f32, 1655 resolution: vec2f, 1656 envTex: texture_2d<f32>, envSamp: sampler) -> vec4f { 1657 let ray = normalize( 1658 mix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), 1.0 - uv.y)); 1659 // Static per-pixel disc rotation + radius scale â the hex ring is 1660 // 60°-symmetric so a third of a turn covers the full phase. 1661 let pix = uv * resolution; 1662 let rotJitter = HdriIGN(pix) * (HDRI_PI / 3.0); 1663 let radJitter = 0.85 + 0.3 * HdriIGN(pix + vec2f(59.0, 37.0)); 1664 return vec4f( 1665 HdriSampleBlurred( 1666 envTex, envSamp, ray, rotation, blurAngle, 1667 vec2f(rotJitter, radJitter)), 1668 1.0); 1669}`,[Jr(Yu)])({uv:Fa,ray00:this._rays.ray00,ray10:this._rays.ray10,ray01:this._rays.ray01,ray11:this._rays.ray11,rotation:this._uRotation,blurAngle:this._uBlurAngle,resolution:W.resolution,envTex:re(e),envSamp:Yr(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new bd;t.setAttribute("position",new Td(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new ke;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=ir(`fn hdriBackgroundVertex(position: vec3f) -> vec4f { 1670 return vec4f(position.xy, 0.5, 1.0); 1671}`);a.vertexNode=r({position:jl});let s=new wd(t,a);return s.name="SplineSkyHdriBackground",s.userData.splineSkyBackground=!0,s.frustumCulled=!1,s.renderOrder=-1e9,s.matrixAutoUpdate=!1,s.raycast=()=>{},this.backgroundMesh=s,s}_ensureEnvQuad(e){let t=ir(`fn hdriEnvPass( 1672 uv: vec2f, 1673 rotation: vec3f, blurAngle: f32, 1674 envTex: texture_2d<f32>, envSamp: sampler) -> vec4f { 1675 let azimuth = (uv.x - 0.5) * 2.0 * HDRI_PI; 1676 let latitude = (uv.y - 0.5) * HDRI_PI; 1677 let cosLat = cos(latitude); 1678 let rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth)); 1679 return vec4f( 1680 HdriSampleBlurred( 1681 envTex, envSamp, rd, rotation, blurAngle, vec2f(0.0, 1.0)), 1682 1.0); 1683}`,[Jr(Yu)])({uv:Ie(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:re(e),envSamp:Yr(e)});if(this._envQuad===null){let a=new ke;a.name="SplineSkyHdriEnvironmentPass",a.lights=!1,a.fragmentNode=t,this._envQuad=new kt(a)}else{let a=this._envQuad.material;a.fragmentNode=t,a.needsUpdate=!0}}_bindTexture(e){if(this._boundTexture!==e)if(this._boundTexture=e,this._ensureEnvQuad(e),this.backgroundMesh){let t=this.backgroundMesh.material;t.colorNode=this._buildBackgroundNode(e),t.needsUpdate=!0}else this._ensureBackgroundMesh(e)}update(e,t,a,r,s=!0){if(t===null)return void this.detach();this._active=!0,this._uRotation.value.set(0,a??0,0),this._uBlurAngle.value=r;let i=this._ensureSampleTexture(t);this._bindTexture(i);let n=this._ensureBackgroundMesh(i);if(this._envTarget===null){this._envTarget=new Ee(256,128,{type:At,depthBuffer:!1});let u=this._envTarget.texture;u.name="sky-hdri-environment",u.generateMipmaps=!0,u.minFilter=Oa,u.magFilter=Ve,u.wrapS=wa}let l=this._uRotation.value,o=`${i.uuid}|${i.version}|${l.x},${l.y},${l.z}|${r}`;if(o!==this._lastEnvKey){this._lastEnvKey=o;let u=this._renderer,d=u.getRenderTarget();u.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),u.setRenderTarget(d)}s?n.parent!==e&&(n.parent?.remove(n),e.add(n)):n.parent?.remove(n)}detach(){this._active=!1,this.backgroundMesh?.parent?.remove(this.backgroundMesh)}dispose(){this.detach(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this._envQuad=null,this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._boundTexture=null,this._sampleTexture?.dispose(),this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1}},Yg=new gt,Ju=new ve,Jg=new at,e_=new at,Ps={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},Qr=.3,Zr=.3,ed={clear:[0,0],mostlyClear:[Qr,Zr],partlyCloudy:[Qr,Zr],mostlyCloudy:[Qr,Zr],overcast:[Qr,Zr],storm:[Qr,Zr]},Lh=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");e!==null&&e!==""&&Number.isFinite(Number(e))&&(Lh=Math.max(0,Number(e)))}catch{}var Ei=.62,t_={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},a_={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},r_={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},Ih=` 1684 uv: vec2f, 1685 ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f, 1686 cameraPos: vec3f, sunDir: vec3f,
1687 solarIrradiance: vec3f, rayleighScattering: vec3f, mieScattering: vec3f, 1688 skySrtl: vec3f, sunSrtl: vec3f, atmScalars: vec4f, muSMin: f32, 1689 transmittanceTex: texture_2d<f32>, 1690 scatteringTex: texture_3d<f32>, scatteringSamp: sampler`,td=`${Ih}, 1691 irradianceTex: texture_2d<f32>, 1692 baseNoiseTex: texture_3d<f32>, noiseSamp: sampler, 1693 detailNoiseTex: texture_3d<f32>, 1694 weatherCurTex: texture_2d<f32>, weatherSamp: sampler, 1695 weatherNextTex: texture_2d<f32>, 1696 highCloudsTex: texture_2d<f32>, 1697 cloudsParamsA: vec4f, cloudsParamsB: vec4f, 1698 cloudsParamsC: vec4f, cloudsParamsD: vec4f`,s_=class{constructor(e){this._luts=null,this._baseNoise=null,this._detailNoise=null,this._highCloudsReady=!1,this._skyTarget=null,this._cloudsTarget=null,this._skyQuad=null,this._cloudsQuad=null,this._envTarget=null,this._envQuad=null,this._lastEnvKey=null,this.backgroundMesh=null,this._auxMesh=null,this._auxHidden=[],this._hdri=null,this._uRay00=L(new ne),this._uRay10=L(new ne),this._uRay01=L(new ne),this._uRay11=L(new ne),this._uCameraPos=L(new ne(0,.1,0)),this._uSunDir=L(new ne(0,1,0)),this._uCloudsParamsC=L(new at(Ps.baseNoiseScale,Ps.detailNoiseScale,Qr,Zr)),this._uCloudsParamsD=L(new at(0,1,0,0)),this._uExposure=L(5e-4),this._uGamma=L(2.2),this._uEnvCloudsOn=L(0),this._lastPage=null,this._lastVersion=-1,this._appliedWeather=null,this._appliedSeed=0,this._blendStart=0,this._blendFrom=1,this._presetFrom="partlyCloudy",this._presetTo="partlyCloudy",this._windOffsetKm=0,this._lastFrameTime=null,this._cloudsEnabled=!0,this._cloudsTargetCleared=!1,this._animating=!1,this._lastSkyPassKey=null,this._lastCloudsPassKey=null,this._sunLight=null,this._iblHdriTexture=null,this._iblRotationY=0,this._pmremBumpAt=0,this._pmremPending=!1,this._skyHemi=null,this._userAmbientSuppressed=!1,this._lightingLuts=null,this._lightingLutsRequested=!1,this._noonSunLum=0,this._noonSkyLum=0,this._noonSunRgb=null,this._lightingPage=null,this._lightingOn=!1,this.assetsReady=Promise.resolve(),this.fixedSkySize=null,this.fixedCloudsSize=null,this.fixedTimeSeconds=null,this.numScatteringOrdersOverride=null,this.highCloudDensityOverride=null,this.minStepKmOverride=null,this._cloudsArgs=null,this._cloudsLib=null,this._renderer=e,this._auxiliary=e.auxiliary===!0,this._atmosphereUniforms=(function(a){let r=(function(o){let u=[],d=[],m=[],h=[],f=[],p=[],_=[];for(let y=ss;y<=830;y+=10){let g=.001*y,x=o.mieAngstromBeta/o.mieScaleHeight*Math.pow(g,-0);u.push(y),d.push(Og[(y-ss)/10]),m.push(o.rayleigh*Math.pow(g,-4)),h.push(x*o.mieSingleScatteringAlbedo),f.push(x),p.push(o.maxOzoneNumberDensity*Gg[(y-ss)/10]),_.push(o.groundAlbedo)}return{wavelengths:u,solarIrradiance:d,rayleighScattering:m,mieScattering:h,mieExtinction:f,absorptionExtinction:p,groundAlbedo:_}})(a),{wavelengths:s}=r,i=qu(s,r.solarIrradiance,-3),n=qu(s,r.solarIrradiance,0),l=(o,u)=>[Ce(Ar(s,o,680)*u),Ce(Ar(s,o,550)*u),Ce(Ar(s,o,440)*u)];return{solarIrradiance:l(r.solarIrradiance,1),rayleighScattering:l(r.rayleighScattering,kr),mieScattering:l(r.mieScattering,kr),mieExtinction:l(r.mieExtinction,kr),absorptionExtinction:l(r.absorptionExtinction,kr),groundAlbedo:l(r.groundAlbedo,1),skySpectralRadianceToLuminance:[Ce(i[0]),Ce(i[1]),Ce(i[2])],sunSpectralRadianceToLuminance:[Ce(n[0]),Ce(n[1]),Ce(n[2])],bottomRadius:6360,topRadius:6420,muSMin:Ce(Math.cos(120*Bh)),sunAngularRadius:Ce(Ug),miePhaseG:Ce(a.miePhaseFunctionG),rayleighDensity:Wu(Ai(0,1,-1/a.rayleighScaleHeight,0,0)),mieDensity:Wu(Ai(0,1,-1/a.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...Ai(25e3,0,0,1/15e3,-2/3),...Ai(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}})(Gu);let t=a=>{let r=new fr(new Uint16Array(262144),ut,ut,Sd,At);return r.wrapS=wa,r.wrapT=wa,r.minFilter=Ve,r.magFilter=Ve,r.name=a,r.needsUpdate=!0,r};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new fr(new Uint8Array(524288),512,512,vd,Bi),this._highClouds.wrapS=wa,this._highClouds.wrapT=wa,this._highClouds.minFilter=Ve,this._highClouds.magFilter=Ve,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=(async function(){let[a,r]=await Promise.all([Qu("cirrus").then(Zu),Qu("alto").then(Zu)]),s=262144,i=new Uint8Array(2*s);for(let n=0;n<s;n++)i[2*n+0]=a[n],i[2*n+1]=r[n];return i})().then(a=>{this._highClouds.image.data.set(a),this._highClouds.needsUpdate=!0,this._highCloudsReady=!0},()=>{})}get attached(){return this.backgroundMesh?.parent!=null||this._hdri?.active===!0}get animationActive(){return this.attached&&(this._animating||this._pmremPending)}get luts(){return this._luts}readbackLut(e){let t=this._luts;return t?e==="transmittance"?$r(this._renderer,t.transmittance,256,64,1,!1):e==="irradiance"?$r(this._renderer,t.irradiance,64,16,1,!1):$r(this._renderer,t.scattering,256,128,32,!0):Promise.reject(new Error("sky LUTs not ready"))}readbackNoise(e){let t=e==="base"?this._baseNoise:this._detailNoise;if(!t)return Promise.reject(new Error("sky noise not ready"));let a=e==="base"?128:32;return $r(this._renderer,t,a,a,a,!0)}get skyTexture(){return this._skyTarget?.texture??null}get cloudsTexture(){return this._cloudsTarget?.texture??null}get environmentTexture(){return this._hdri?.active===!0?this._hdri.environmentTexture:this._envTarget?.texture??null}get iblTexture(){return this._lightingOn?this._hdri?.active===!0?this._iblHdriTexture:this._envTarget?.texture??null:null}get iblRotationY(){return this._hdri?.active===!0?this._iblRotationY:0}_requestEnvPmrem(e){let t=this._envTarget?.texture;t!==void 0&&(e-this._pmremBumpAt>=150?(this._pmremBumpAt=e,this._pmremPending=!1,t.needsPMREMUpdate=!0):this._pmremPending=!0)}get weatherTextureData(){return{current:this._weatherCur.image.data,next:this._weatherNext.image.data}}_ensureLuts(){this._luts||(this._luts=(function(e,t,a){let r=Ph(e),s=zi(256,64,Xt,"sky-lut-transmittance"),i=[zi(64,16,Xt,"sky-lut-irradiance-a"),zi(64,16,Xt,"sky-lut-irradiance-b")],n=[zs(256,128,32,At,"sky-lut-scattering-a",Ve),zs(256,128,32,At,"sky-lut-scattering-b",Ve)],l=zi(64,16,Xt,"sky-delta-irradiance"),o=zs(256,128,32,Xt,"sky-delta-rayleigh",Oe),u=zs(256,
vendor: 5,883 bytes, line 1698
1698128,32,Xt,"sky-delta-mie",Oe),d=zs(256,128,32,Xt,"sky-delta-density",Oe),m={transmittance:sr(e,s),irr:i.map(E=>sr(e,E)),scat:n.map(E=>sr(e,E)),deltaIrradiance:sr(e,l),deltaRayleigh:sr(e,o),deltaMie:sr(e,u),deltaDensity:sr(e,d)},h=m.deltaRayleigh,f=(function(E){let I=new Float32Array(80),D=0,H=(K,O)=>{I[D++]=K[0],I[D++]=K[1],I[D++]=K[2],I[D++]=O};H(E.solarIrradiance,E.sunAngularRadius),H(E.rayleighScattering,E.bottomRadius),H(E.mieScattering,E.topRadius),H(E.mieExtinction,E.miePhaseG),H(E.absorptionExtinction,E.muSMin),H(E.groundAlbedo,0),H(E.skySpectralRadianceToLuminance,0),H(E.sunSpectralRadianceToLuminance,0);for(let K of[E.rayleighDensity,E.mieDensity,E.absorptionDensity])for(let O=0;O<2;O++){for(let j=0;j<5;j++)I[D++]=K[5*O+j];D+=3}return I})(t),p=r.createBuffer({label:"sky-atm-uniforms",size:f.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(p,0,f.buffer,0,f.byteLength);let _=[],y=E=>(_.push(E),(_.length-1)*ki),g=new Map;for(let[E,I]of Object.entries(Pg)){let D=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform",hasDynamicOffset:!0}}];I.entries.forEach((O,j)=>{"sampled"in O?D.push({binding:2+j,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"unfilterable-float",viewDimension:O.sampled}}):D.push({binding:2+j,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:O.format,viewDimension:O.storage}})});let H=r.createBindGroupLayout({label:`sky-${E}-bgl`,entries:D}),K=r.createComputePipeline({label:`sky-${E}`,layout:r.createPipelineLayout({bindGroupLayouts:[H]}),compute:{module:r.createShaderModule({label:`sky-${E}-wgsl`,code:I.code}),entryPoint:"main"}});g.set(E,{pipeline:K,layout:H})}let x=[],v=0,V=0,T=(E,I)=>[E/8,I/8,1];x.push([{kernel:"transmittance",textures:[m.transmittance],slotOffset:y({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:T(256,64)}]),x.push([{kernel:"directIrradiance",textures:[m.irr[v],m.irr[1-v],m.deltaIrradiance,m.transmittance],slotOffset:y({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:T(64,16)}]),v=1-v;{let E=[];for(let I=0;I<32;I++)E.push({kernel:"singleScattering",textures:[m.deltaRayleigh,m.deltaMie,m.scat[V],m.scat[1-V],m.transmittance],slotOffset:y({blend:[0,0,0,0],layer:I,scatteringOrder:0}),groups:T(256,128)});x.push(E),V=1-V}for(let E=2;E<=a;E++){{let I=[];for(let D=0;D<32;D++)I.push({kernel:"scatteringDensity",textures:[m.deltaDensity,m.transmittance,m.deltaRayleigh,m.deltaMie,h,m.deltaIrradiance],slotOffset:y({blend:[0,0,0,0],layer:D,scatteringOrder:E}),groups:T(256,128)});x.push(I)}x.push([{kernel:"indirectIrradiance",textures:[m.deltaIrradiance,m.irr[v],m.irr[1-v],m.deltaRayleigh,m.deltaMie,h],slotOffset:y({blend:[0,1,0,0],layer:0,scatteringOrder:E-1}),groups:T(64,16)}]),v=1-v;{let I=[];for(let D=0;D<32;D++)I.push({kernel:"multipleScattering",textures:[h,m.scat[V],m.scat[1-V],m.transmittance,m.deltaDensity],slotOffset:y({blend:[0,1,0,0],layer:D,scatteringOrder:E}),groups:T(256,128)});x.push(I),V=1-V}}let z=new Float32Array(_.length*ki/4);_.forEach((E,I)=>(function(D,H,K){let O=H;D[O+0]=1,D[O+5]=1,D[O+10]=1,D[O+12]=K.blend[0],D[O+13]=K.blend[1],D[O+14]=K.blend[2],D[O+15]=K.blend[3],new Int32Array(D.buffer,D.byteOffset+4*(O+16),2).set([K.layer,K.scatteringOrder])})(z,I*ki/4,E));let b=r.createBuffer({label:"sky-pass-params",size:z.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(b,0,z.buffer,0,z.byteLength);let M=new Map,S=E=>{let I=M.get(E);return I||(I=E.createView({mipLevelCount:1}),M.set(E,I)),I};for(let E of x){let I=r.createCommandEncoder({label:"sky-precompute"}),D=I.beginComputePass();for(let H of E){let{pipeline:K,layout:O}=g.get(H.kernel),j=[{binding:0,resource:{buffer:p}},{binding:1,resource:{buffer:b,size:ki}}];H.textures.forEach(($,me)=>{j.push({binding:2+me,resource:S($)})});let Z=r.createBindGroup({layout:O,entries:j});D.setPipeline(K),D.setBindGroup(0,Z,[H.slotOffset]),D.dispatchWorkgroups(...H.groups)}D.end(),r.queue.submit([I.finish()])}let C=i[v],R=n[V],k=[i[1-v],n[1-V],l,o,u,d];for(let E of k)E.dispose();return p.destroy(),b.destroy(),{transmittance:s,scattering:R,irradiance:C,dispose(){s.dispose(),R.dispose(),C.dispose()}}})(this._renderer,this._atmosphereUniforms,this.numScatteringOrdersOverride??Gu.numScatteringOrders))}_ensureNoise(){if(this._baseNoise)return;let e=this._renderer.backend.device;if(!e)throw new Error("[spline/sky] WebGPU device unavailable");let t=(r,s)=>{let i=new ts(r,r,r);return i.type=At,i.minFilter=Ve,i.magFilter=Ve,i.wrapS=wa,i.wrapT=wa,i.wrapR=wa,i.generateMipmaps=!1,i.mipmapsAutoUpdate=!1,i.name=s,i};this._baseNoise=t(128,"sky-base-noise"),this._detailNoise=t(32,"sky-detail-noise");let a=(r,s,i)=>{this._renderer.initTexture(s);let n=this._renderer.backend.get(s).texture,l=e.createShaderModule({code:r}),o=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba16float",viewDimension:"3d"}}]}),u=e.createComputePipeline({layout:e.createPipelineLayout({bindGroupLayouts:[o]}),compute:{module:l,entryPoint:"main"}}),d=e.createCommandEncoder({label:"sky-noise"}),m=d.beginComputePass();m.setPipeline(u),m.setBindGroup(0,e.createBindGroup({layout:o,entries:[{binding:0,resource:n.createView({mipLevelCount:1})}]}));let h=i/4;m.dispatchWorkgroups(h,h,h),m.end(),e.queue.submit([d.finish()])};a(Ig,this._baseNoise,128),a(Dg,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:L(new ne(...e.solarIrradiance)),rayleighScattering:L(new ne(...e.rayleighScattering)),mieScattering:L(new ne(...e.mieScattering)),skySrtl:L(new ne(...e.skySpectralRadianceToLuminance)),sunSrtl:L(new ne(...e.sunSpectralRadianceToLuminance)),atmScalars:L(new at(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:L(e.muSMin)}}
1698_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:Ie(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:re(e.transmittance),scatteringTex:nr(e.scattering),scatteringSamp:Yr(e.scattering)},a=Jr(Gl+Du),r=ir(`fn skyPass(${Ih}) -> vec4f {${Bg}}`,[a]),s=new ke;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new kt(s);let i=Jr(Gl+Du+` 1699fn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 { 1700 return min2 + (value - min1) * (max2 - min2) / (max1 - min1); 1701} 1702 1703fn saturateF(x: f32) -> f32 { 1704 return clamp(x, 0.0, 1.0); 1705} 1706 1707fn triplanarSample( 1708 t: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f { 1709 var blend = abs(n); 1710 blend = pow(blend, vec3f(4.0)); 1711 blend /= dot(blend, vec3f(1.0)); 1712 1713 let cx = textureSampleLevel(t, s, p.yz * scale, 0.0); 1714 let cy = textureSampleLevel(t, s, p.xz * scale, 0.0); 1715 let cz = textureSampleLevel(t, s, p.xy * scale, 0.0); 1716 1717 return cx * blend.x + cy * blend.y + cz * blend.z; 1718} 1719 1720/** Weight below which a triplanar axis is dropped instead of sampled. 1721 * 1722 * The weights are normalized pow(|n|, 4). Inside the cloud shell n is the 1723 * planet's up vector at the sample, and the march reaches at most 1724 * CLOUDS_PARAMS.maxDistance (128 km) over a 6360 km radius: |n.x| and |n.z| 1725 * stay under sin(128 / 6363) = 0.021, so their weights stay under 2e-7 â 1726 * four orders of magnitude under the fp16 quantum of the [0, 1] weather 1727 * channels they scale. The threshold sits well above that worst case on 1728 * purpose: it keeps the branch UNIFORM across the pass (every ray in the 1729 * layer drops the same two axes) instead of flickering per texel, and it 1730 * bounds the error at one threshold per dropped axis. */ 1731const TRIPLANAR_WEIGHT_EPS: f32 = 1.0e-5; 1732 1733/** 1734 * triplanarSample with negligible axes skipped â three texture samples down 1735 * to one for any sample inside the cloud shell. This is the hot one: the 1736 * weather map is read once per density sample (twice mid-transition) and there 1737 * are up to seven density samples per lit step, so between this and the blend 1738 * branch below the weather taps go from six per density sample to one. When 1739 * all three axes clear the threshold the accumulation matches triplanarSample 1740 * exactly (adding into a zero-initialized vec4 is exact). 1741 */ 1742fn triplanarSampleAdaptive( 1743 t: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f { 1744 var blend = abs(n); 1745 blend = pow(blend, vec3f(4.0)); 1746 blend /= dot(blend, vec3f(1.0)); 1747 1748 var c = vec4f(0.0); 1749 if (blend.x > TRIPLANAR_WEIGHT_EPS) { 1750 c += textureSampleLevel(t, s, p.yz * scale, 0.0) * blend.x; 1751 } 1752 if (blend.y > TRIPLANAR_WEIGHT_EPS) { 1753 c += textureSampleLevel(t, s, p.xz * scale, 0.0) * blend.y; 1754 } 1755 if (blend.z > TRIPLANAR_WEIGHT_EPS) { 1756 c += textureSampleLevel(t, s, p.xy * scale, 0.0) * blend.z; 1757 } 1758 return c; 1759} 1760 1761fn raySphereIntersectFar(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 { 1762 let a = dot(rd, rd); 1763 let s0_r0 = r0 - s0; 1764 let b = 2.0 * dot(rd, s0_r0); 1765 let c = dot(s0_r0, s0_r0) - (sr * sr); 1766 1767 let d = b * b - 4.0 * a * c; 1768 if (d < 0.0) { 1769 return -1.0; 1770 } 1771 1772 return (-b + sqrt(d)) / (2.0 * a); 1773} 1774 1775fn raySphereIntersect(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 { 1776 let a = dot(rd, rd); 1777 let s0_r0 = r0 - s0; 1778 let b = 2.0 * dot(rd, s0_r0); 1779 let c = dot(s0_r0, s0_r0) - (sr * sr); 1780 1781 let d = b * b - 4.0 * a * c; 1782 if (d < 0.0) { 1783 return -1.0; 1784 } 1785 1786 let sqrtD = sqrt(d); 1787 1788 let t0 = (-b - sqrtD) / (2.0 * a); 1789 if (t0 > 0.0) { 1790 return t0; 1791 } 1792 1793 let t1 = (-b + sqrtD) / (2.0 * a); 1794 if (t1 > 0.0) { 1795 return t1; 1796 } 1797 1798 return -1.0; 1799} 1800 1801const CLOUD_RAY_STEPS: i32 = 160; 1802const LIGHT_RAY_STEPS: i32 = 6; 1803 1804const cirrusSpeedFactor: f32 = 3.5; 1805const altoSpeedFactor: f32 = 2.0; 1806const detailStrength: f32 = 0.1; 1807const CLOUD_EPS: f32 = 1e-5; 1808 1809struct CloudsCtx { 1810 maxDistance: f32, 1811 sigmaS: f32, 1812 sigmaA: f32, 1813 cloudLayerThickness: f32, 1814 cloudLayerBottom: f32, 1815 highCloudsHeight: f32, 1816 highCloudsScale: f32, 1817 weatherMapScale: f32, 1818 baseNoiseScale: f32, 1819 detailNoiseScale: f32, 1820 cirrusDensity: f32, 1821 altoDensity: f32, 1822 windSpeed: f32, 1823 weatherMapBlend: f32, 1824 time: f32, 1825 /** Floor on the march step length, km. 0 = the reference's fixed 1826 * CLOUD_RAY_STEPS division of the span (see RaymarchVolumetricCloud). */ 1827 minStep: f32, 1828 sigmaT: f32, 1829 fogFactor: f32, 1830 bottomRadius: f32, 1831 sunDir: vec3f, 1832 earthCenter: vec3f, 1833} 1834 1835fn HenyeyGreenstein(g: f32, costh: f32) -> f32 { 1836 return (1.0 - g * g) / (4.0 * PI * pow(1.0 + g * g - 2.0 * g * costh, 1.5)); 1837} 1838 1839fn HeightGradient(h: f32, cloudType: f32) -> f32 { 1840 let stratus = smoothstepGl(0.0, 0.07, h) * smoothstepGl(0.2, 0.07, h); 1841 let cumulus = smoothstepGl(0.0, 0.2, h) * smoothstepGl(0.65, 0.35, h); 1842 let cumulonimbus = smoothstepGl(0.0, 0.1, h) * smoothstepGl(0.95, 0.4, h); 1843 1844 let a = 1.0 - cloudType; 1845 let wS = a * a; 1846 let wCu = 2.0 * cloudType * a; 1847 let wCb = cloudType * cloudType; 1848 1849 return wS * stratus + wCu * cumulus + wCb * cumulonimbus; 1850} 1851 1852fn SampleDensity( 1853 ctx: CloudsCtx, 1854 baseNoise: texture_3d<f32>, noiseSamp: sampler, 1855 detailNoise: texture_3d<f32>, 1856 currentWeatherMap: texture_2d<f32>, weatherSamp: sampler, 1857 nextWeatherMap: texture_2d<f32>, 1858 pos: vec3f) -> f32 { 1859 let heightFraction = (length(pos - ctx.earthCenter) - ctx.bottomRadius - ctx.cloudLayerBottom) / 1860 ctx.cloudLayerThickness; 1861 if (heightFraction < 0.0 || heightFraction > 1.0) { 1862 return 0.0; 1863 } 1864 1865 let n = normalize(pos - ctx.earthCenter); 1866 // triplanar fixes 2d texture stretching on sphere 1867 let weatherPos = pos + ctx.time * ctx.windSpeed; 1868 let weatherScale = 1.0 / ctx.weatherMapScale; 1869 // The blend sits pinned at 1 except during the 2 s preset transition, and 1870 // mix(a, b, 1) is b â so outside a transition the "current" map's taps are 1871 // dead weight on every density sample. The blend is a uniform, so this 1872 // branch is coherent across the whole pass; a driver cannot fold it away 1873 // on its own. (At the endpoints the result differs from the mix by at most 1874 // one ulp, and only if the implementation lowers mix to an fma.) 1875 var weather: vec3f; 1876 if (ctx.weatherMapBlend >= 1.0) { 1877 weather = triplanarSampleAdaptive(nextWeatherMap, weatherSamp, 1878 weatherPos, n, weatherScale).rgb; 1879 } else if (ctx.weatherMapBlend <= 0.0) { 1880 weather = triplanarSampleAdaptive(currentWeatherMap, weatherSamp, 1881 weatherPos, n, weatherScale).rgb; 1882 } else { 1883 let weather0 = triplanarSampleAdaptive(currentWeatherMap, weatherSamp, 1884 weatherPos, n, weatherScale).rgb; 1885 let weather1 = triplanarSampleAdaptive(nextWeatherMap, weatherSamp, 1886 weatherPos, n, weatherScale).rgb; 1887 weather = mix(weather0, weather1, ctx.weatherMapBlend); 1888 } 1889 1890 let coverage = weather.r; 1891 let precipitation = weather.g; 1892 let cloudType = weather.b; 1893 let heightGradient = HeightGradient(heightFraction, cloudType); 1894 1895 // Zero coverage: the reference's remap below divides by zero and the 1896 // resulting NaN dies in GLSL's NaN-hostile clamp/compares (density 0). 1897 // WGSL's min/max SWALLOW NaN â saturate(NaN) becomes 1.0, a full-density 1898 // phantom cloud â so the "no coverage, no cloud" outcome is made 1899 // explicit here instead of riding on NaN semantics. 1900 // (Negated form so NaN coverage â the upstream partlyCloudy/seed-0 1901 // weather-map quirk â also lands here instead of resurrecting.) 1902 if (!(coverage > 0.0)) { 1903 return 0.0; 1904 } 1905 1906 // === base form === 1907 let base_uv = pos / ctx.baseNoiseScale + ctx.time * ctx.windSpeed / ctx.baseNoiseScale; 1908 let baseN = textureSampleLevel(baseNoise, noiseSamp, base_uv, 0.0); 1909 let lowFBM = baseN.g * 0.625 + baseN.b * 0.25 + baseN.a * 0.125; 1910 var baseCloud = remap(baseN.r, -(1.0 - lowFBM), 1.0, 0.0, 1.0); 1911 1912 // === compose === 1913 baseCloud = remap(baseCloud, 1.0 - coverage, 1.0, 0.0, 1.0); 1914 baseCloud *= coverage; 1915 baseCloud *= heightGradient; 1916 1917 if (baseCloud < 0.0) { 1918 return 0.0; 1919 } 1920 1921 // === details === 1922 let detail_uv = pos / ctx.detailNoiseScale + ctx.time * ctx.windSpeed / ctx.detailNoiseScale; 1923 let detailN = textureSampleLevel(detailNoise, noiseSamp, detail_uv, 0.0).rgb; 1924 let detailFBM = dot(detailN, vec3f(0.625, 0.25, 0.125)); 1925 let detailCloud = remap(baseCloud, detailFBM * detailStrength, 1.0, 0.0, 1.0); 1926 1927 // Detail erosion can push detailCloud negative;
1927 pow(<0, e) is NaN and 1928 // WGSL's NaN-swallowing saturate below would resurrect it to FULL 1929 // density (the GLSL NaN dies in the reference's clamp/compares â 1930 // effective density 0). Negated compare so NaN input lands here too. 1931 if (!(detailCloud > 0.0)) { 1932 return 0.0; 1933 } 1934 1935 let density = pow(detailCloud, mix(1.0, 0.5, precipitation)); 1936 1937 return saturateF(density); 1938} 1939 1940const SCATTERING_OCTAVES: i32 = 4; 1941 1942/** 1943 * The per-octave phase terms of MultipleOctaveScattering. 1944 * 1945 * They depend only on mu (the view/sun cosine) and a fixed geometric 1946 * sequence â nothing that varies along a ray. The reference nonetheless 1947 * recomputes all eight Henyey-Greenstein lobes, each with a pow, inside the 1948 * light march: once per LIT step, up to CLOUD_RAY_STEPS times per pixel. 1949 * Hoisted to once per pixel here; same values, same order, so the sum below 1950 * is bit-identical. 1951 */ 1952fn OctaveScatteringPhases(mu: f32) -> vec4f { 1953 let phaseAttenuation = 0.2; 1954 1955 var c: f32 = 1.0; 1956 var phases = vec4f(0.0); 1957 1958 for (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) { 1959 phases[i] = mix( 1960 HenyeyGreenstein(-0.2 * c, mu), HenyeyGreenstein(0.8 * c, mu), 0.3); 1961 c *= phaseAttenuation; 1962 } 1963 1964 return phases; 1965} 1966 1967fn MultipleOctaveScattering( 1968 ctx: CloudsCtx, density: f32, phases: vec4f) -> f32 { 1969 let attenuation = 0.5; 1970 let contribution = 0.6; 1971 1972 var a: f32 = 1.0; 1973 var b: f32 = 1.0; 1974 1975 var luminance: f32 = 0.0; 1976 1977 for (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) { 1978 luminance += b * phases[i] * exp(-ctx.sigmaT * density * a); 1979 1980 a *= attenuation; 1981 b *= contribution; 1982 } 1983 1984 return luminance; 1985} 1986 1987fn IntersectCloudLayer( 1988 ctx: CloudsCtx, ro: vec3f, rd: vec3f, 1989 tEnter: ptr<function, f32>, tExit: ptr<function, f32>) -> bool { 1990 let innerRadius = ctx.bottomRadius + ctx.cloudLayerBottom; 1991 let outerRadius = ctx.bottomRadius + ctx.cloudLayerBottom + ctx.cloudLayerThickness; 1992 1993 let tInnerNear = raySphereIntersect(ro, rd, ctx.earthCenter, innerRadius); 1994 let tInnerFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, innerRadius); 1995 let tOuterNear = raySphereIntersect(ro, rd, ctx.earthCenter, outerRadius); 1996 let tOuterFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, outerRadius); 1997 1998 let distToCenter = length(ro - ctx.earthCenter); 1999 2000 if (distToCenter < innerRadius) { // cam below layer 2001 *tEnter = tInnerFar; 2002 *tExit = tOuterFar; 2003 } else if (distToCenter < outerRadius) { // cam inside layer 2004 *tEnter = 0.0; 2005 if (tInnerNear > 0.0) { 2006 *tExit = tInnerNear; 2007 } else { 2008 *tExit = tOuterFar; 2009 } 2010 } else { // cam above layer 2011 if (tOuterNear < 0.0) { 2012 return false; 2013 } 2014 *tEnter = tOuterNear; 2015 if (tInnerNear > 0.0) { 2016 *tExit = tInnerNear; 2017 } else { 2018 *tExit = tOuterFar; 2019 } 2020 } 2021 2022 if (*tExit < 0.0 || *tEnter >= *tExit) { 2023 return false; 2024 } 2025 2026 *tEnter = max(*tEnter, 0.0); 2027 return true; 2028} 2029 2030fn ComputeLightVisibility( 2031 ctx: CloudsCtx, 2032 baseNoise: texture_3d<f32>, noiseSamp: sampler, 2033 detailNoise: texture_3d<f32>, 2034 currentWeatherMap: texture_2d<f32>, weatherSamp: sampler, 2035 nextWeatherMap: texture_2d<f32>, 2036 pos: vec3f, lightDir: vec3f, phases: vec4f) -> f32 { 2037 var tLightEnter: f32; 2038 var tLightExit: f32; 2039 if (!IntersectCloudLayer(ctx, pos, lightDir, &tLightEnter, &tLightExit)) { 2040 return 0.0; 2041 } 2042 2043 tLightExit = min(tLightExit, ctx.cloudLayerThickness * 1.0); 2044 2045 let dt = (tLightExit - tLightEnter) / f32(LIGHT_RAY_STEPS); 2046 let startPos = pos + lightDir * tLightEnter; 2047 var d: f32 = 0.0; 2048 2049 for (var i: i32 = 0; i < LIGHT_RAY_STEPS; i++) { 2050 d += SampleDensity(ctx, baseNoise, noiseSamp, detailNoise, 2051 currentWeatherMap, weatherSamp, nextWeatherMap, 2052 startPos + lightDir * dt * f32(i)); 2053 } 2054 d *= dt; 2055 2056 return MultipleOctaveScattering(ctx, d, phases); 2057} 2058 2059fn RaymarchVolumetricCloud( 2060 ctx: CloudsCtx, atm: Atm, 2061 transmittanceTex: texture_2d<f32>, 2062 scatteringTex: texture_3d<f32>, scatteringSamp: sampler, 2063 irradianceTex: texture_2d<f32>, 2064 baseNoise: texture_3d<f32>, noiseSamp: sampler, 2065 detailNoise: texture_3d<f32>, 2066 currentWeatherMap: texture_2d<f32>, weatherSamp: sampler, 2067 nextWeatherMap: texture_2d<f32>, 2068 ro: vec3f, rd: vec3f) -> vec4f { 2069 var tEnter: f32; 2070 var tExit: f32; 2071 2072 if (!IntersectCloudLayer(ctx, ro, rd, &tEnter, &tExit)) { 2073 return vec4f(0.0); 2074 } 2075 2076 tExit = min(tExit, ctx.maxDistance); 2077 let span = tExit - tEnter; 2078 2079 // The reference always divides the span into CLOUD_RAY_STEPS, so the step 2080 // length swings with the ray's elevation: a near-vertical ray crosses the 2081 // 4 km shell in 25 m steps â 8x finer than the 195 m base-noise texel it is 2082 // sampling, so runs of those samples re-read one texel â while a grazing 2083 // 128 km ray gets 800 m and is the case the step budget is actually FOR. A 2084 // floor on the step length spends the full budget on the grazing rays and 2085 // stops over-marching the steep ones. ctx.minStep = 0 reproduces the 2086 // reference exactly (?dbgskystep=0, and CI pins it via minStepKmOverride); 2087 // see MIN_MARCH_STEP_KM for the measured cost/benefit. 2088 let refDt = span / f32(CLOUD_RAY_STEPS); 2089 let dt = max(refDt, ctx.minStep); 2090 let steps = select( 2091 min(CLOUD_RAY_STEPS, i32(ceil(span / dt))), 2092 CLOUD_RAY_STEPS, 2093 ctx.minStep <= 0.0); 2094 2095 var t = max(tEnter, 0.0); 2096 var pos = ro + rd * t; 2097 2098 var radiance = vec3f(0.0); 2099 var totalTransmittance = vec3f(1.0); 2100 2101 let mu = dot(rd, ctx.sunDir); 2102 let horizDist = length(pos - ro); 2103 // Loop-invariant for the whole march (see OctaveScatteringPhases). 2104 let phases = OctaveScatteringPhases(mu); 2105 2106 var sky_transmittance: vec3f; 2107 var sunLight: vec3f; 2108 var skyIrradiance: vec3f; 2109 2110 for (var i: i32 = 0; i < steps; i++) { 2111 if (t > tExit) { 2112 break; 2113 } 2114 2115 pos = ro + rd * t; 2116 2117 if (horizDist * horizDist > ctx.maxDistance * ctx.maxDistance) { 2118 break; 2119 } 2120 2121 let density = SampleDensity(ctx, baseNoise, noiseSamp, detailNoise, 2122 currentWeatherMap, weatherSamp, nextWeatherMap, pos); 2123 2124 if (density > 0.0) { 2125 // get lightning â only the sun-ward transmittance and the sky 2126 // irradiance are read, so both lookups take the halved variants
2127 // (same values, see GetSkyTransmittance / GetSkyIrradianceLum). 2128 sky_transmittance = GetSkyTransmittance( 2129 atm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir); 2130 skyIrradiance = GetSkyIrradianceLum(atm, irradianceTex, 2131 pos - ctx.earthCenter, normalize(pos - ctx.earthCenter), ctx.sunDir); 2132 sunLight = sky_transmittance * atm.sun_spectral_radiance_to_luminance; 2133 // night 2134 skyIrradiance = max(vec3f(10.0), skyIrradiance); 2135 sunLight = max(vec3f(100.0), sunLight); 2136 2137 let vis = ComputeLightVisibility(ctx, baseNoise, noiseSamp, detailNoise, 2138 currentWeatherMap, weatherSamp, nextWeatherMap, pos, ctx.sunDir, 2139 phases); 2140 2141 let sampleSigmaS = ctx.sigmaS * density; 2142 let sampleSigmaT = max(ctx.sigmaT * density, CLOUD_EPS); 2143 2144 let powder = exp(-density * sampleSigmaT); 2145 let powderEffect = mix(1.0, powder, smoothstepGl(0.5, -0.5, mu)); 2146 var inscatter = (sunLight * vis + skyIrradiance) * sampleSigmaS; 2147 inscatter *= powderEffect; 2148 2149 let transmittance = exp(-sampleSigmaT * dt); 2150 2151 // Energy conserving 2152 radiance += totalTransmittance * (inscatter - inscatter * transmittance) / sampleSigmaT; 2153 totalTransmittance *= transmittance; 2154 2155 if (length(totalTransmittance) <= 0.1) { 2156 totalTransmittance = vec3f(0.0); 2157 break; 2158 } 2159 } 2160 2161 t += dt; 2162 } 2163 2164 // Convert transmittance to alpha 2165 let alpha = 1.0 - dot(totalTransmittance, vec3f(0.2126, 0.7152, 0.0722)); 2166 2167 let fog = exp(-horizDist / ctx.fogFactor); // ! hack probably should use bruneton transmittance 2168 2169 return vec4f(radiance, alpha) * fog; 2170} 2171 2172// High-altitude clouds (above the volumetric) 2D 2173fn HighAltitudeCloud( 2174 ctx: CloudsCtx, atm: Atm, 2175 transmittanceTex: texture_2d<f32>, 2176 scatteringTex: texture_3d<f32>, scatteringSamp: sampler, 2177 highCloudsMap: texture_2d<f32>, weatherSamp: sampler, 2178 ro: vec3f, rd: vec3f) -> vec4f { 2179 if (abs(rd.y) < CLOUD_EPS) { 2180 return vec4f(0.0); 2181 } 2182 2183 var result = vec4f(0.0); 2184 2185 let t = raySphereIntersect(ro, rd, ctx.earthCenter, ctx.bottomRadius + ctx.highCloudsHeight); 2186 if (t < 0.0) { 2187 return result; 2188 } 2189 2190 let pos = ro + rd * t; 2191 let normal = normalize(pos - ctx.earthCenter); 2192 let mu = dot(-rd, ctx.sunDir); 2193 let phase = mix(HenyeyGreenstein(-0.1, mu), HenyeyGreenstein(0.2, mu), 0.2); 2194 2195 // Sun-ward: transmittance only (the radiance return was discarded). 2196 let trans = GetSkyTransmittance( 2197 atm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir); 2198 let sunLight = trans * atm.sun_spectral_radiance_to_luminance; 2199 var zenithTrans: vec3f; 2200 let skyLight = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, scatteringSamp, 2201 pos - ctx.earthCenter, vec3f(0.0, 1.0, 0.0), 0.0, ctx.sunDir, &zenithTrans); 2202 2203 let scatter = sunLight * phase + skyLight; 2204 2205 // === Cirrus (R) === 2206 let cirrusDensity = triplanarSample(highCloudsMap, weatherSamp, 2207 pos + ctx.time * ctx.windSpeed * cirrusSpeedFactor, normal, 2208 1.0 / ctx.highCloudsScale).r; 2209 2210 if (cirrusDensity > CLOUD_EPS) { 2211 let alpha = cirrusDensity * ctx.cirrusDensity; 2212 result = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha, 2213 result.a + (1.0 - result.a) * alpha); 2214 } 2215 2216 // === Alto (G) === 2217 let altoDensity = triplanarSample(highCloudsMap, weatherSamp, 2218 pos + ctx.time * ctx.windSpeed * altoSpeedFactor, normal, 2219 1.0 / ctx.highCloudsScale).g; 2220 2221 if (altoDensity > CLOUD_EPS) { 2222 let alpha = altoDensity * ctx.altoDensity; 2223 result = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha, 2224 result.a + (1.0 - result.a) * alpha); 2225 } 2226 2227 let fog = exp(-length((ro + rd * t) - ro) / ctx.fogFactor); 2228 return result * fog; 2229} 2230`),n=ir(`fn cloudsPass(${td}) -> vec4f {${Fg}}`,[i]),l=Ps,o={...t,irradianceTex:re(e.irradiance),baseNoiseTex:nr(this._baseNoise),noiseSamp:Yr(this._baseNoise),detailNoiseTex:nr(this._detailNoise),weatherCurTex:re(this._weatherCur),weatherSamp:Yr(this._weatherCur),weatherNextTex:re(this._weatherNext),highCloudsTex:re(this._highClouds),cloudsParamsA:L(new at(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:L(new at(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new ke;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new kt(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=ir(`fn skyEnvPass(${td}, 2231 exposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${Lg}}`,[Jr(Uu),this._cloudsLib]),t=new ke;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new kt(t)}
2231_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new bd;a.setAttribute("position",new Td(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new ke;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=ir(`fn skyBackgroundVertex(position: vec3f) -> vec4f { 2232 return vec4f(position.xy, 0.5, 1.0); 2233}`);r.vertexNode=s({position:jl});let i=new wd(a,r);return i.name="SplineSkyBackground",i.userData.splineSkyBackground=!0,i.frustumCulled=!1,i.renderOrder=-1e9,i.matrixAutoUpdate=!1,i.raycast=()=>{},this.backgroundMesh=i,i}_syncState(e){let t=e.skyState,a=e!==this._lastPage;if(!a&&e.skyStateVersion===this._lastVersion)return;this._lastPage=e,this._lastVersion=e.skyStateVersion;let r=t.weather;if(r!==this._appliedWeather||t.seed!==this._appliedSeed||a){let s=Xg(r,t.seed);if(this._appliedWeather===null||a)this._weatherCur.image.data.set(s),this._weatherNext.image.data.set(s),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendFrom=1,this._blendStart=0,this._presetFrom=r,this._presetTo=r;else{let i=this._weatherCur.image.data,n=this._weatherNext.image.data;i.set(n),n.set(s),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendStart=performance.now(),this._blendFrom=0,this._presetFrom=this._presetTo,this._presetTo=r}this._appliedWeather=r,this._appliedSeed=t.seed}this._uExposure.value=5e-4*t.exposure,this._cloudsEnabled=t.clouds}_cornerRay(e,t,a,r){let s=Jg.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=e_.set(e,t,-1,0).applyMatrix4(a.matrixWorld);return r.set(s.x,s.y,s.z).normalize()}_updateCornerRays(e,t){let a=e;if(e.projectionMatrix.elements[11]!==-1){let r=typeof a.fov=="number"&&a.fov>0?a.fov:45,s=Math.tan(r*Math.PI/360),i=s*t;return this._eyeRayToWorld(-i,-s,e,this._uRay00.value),this._eyeRayToWorld(i,-s,e,this._uRay10.value),this._eyeRayToWorld(-i,s,e,this._uRay01.value),void this._eyeRayToWorld(i,s,e,this._uRay11.value)}this._cornerRay(-1,-1,e,this._uRay00.value),this._cornerRay(1,-1,e,this._uRay10.value),this._cornerRay(-1,1,e,this._uRay01.value),this._cornerRay(1,1,e,this._uRay11.value)}update(e,t){if(this._auxiliary&&this.endFrame(),e.skyState?.mode==="hdri")return void this._updateHdri(e,t,e.skyState);this._hdri?.active===!0&&this._hdri.detach(),this._ensurePasses(),this._syncState(e);let a=e.skyState,r=performance.now(),s=this._lastFrameTime===null?0:(r-this._lastFrameTime)/1e3;this._lastFrameTime=r;let i=a.animateWind&&this._renderer.skyAnimationAllowed===!0&&this.fixedTimeSeconds===null;i&&(this._windOffsetKm+=a.windSpeed/1e3*300*Math.min(s,.25),this._windOffsetKm%=9600);let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=ju(n);this._uSunDir.value.set(l[0],l[1],l[2]);let o=1;this._blendStart>0&&(o=Math.min(1,this._blendFrom+(r-this._blendStart)/1e3/2),o>=1&&(this._blendStart=0));let u=this.minStepKmOverride??Lh??.05;this.fixedTimeSeconds!==null?this._uCloudsParamsD.value.set(a.windSpeed/1e3,o,this.fixedTimeSeconds,u):this._uCloudsParamsD.value.set(1,o,this._windOffsetKm,u);let d=this.highCloudDensityOverride,m=ed[this._presetFrom],h=ed[this._presetTo];this._uCloudsParamsC.value.set(Ps.baseNoiseScale,Ps.detailNoiseScale,d!==null?d[0]:m[0]+(h[0]-m[0])*o,d!==null?d[1]:m[1]+(h[1]-m[1])*o),this._animating=this._cloudsEnabled&&(this._blendStart>0||i&&a.windSpeed!==0),this._lightingOn=a.lighting===!0,a.lighting!==!0||this._auxiliary?this._lightingPage!==null&&this._teardownLighting():(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1));let f=this._renderer.getDrawingBufferSize(Ju);this._updateCornerRays(t,f.y>0?f.x/f.y:1);let p=Math.max(1,Math.round(this.fixedSkySize?.x??f.x)),_=Math.max(1,Math.round(this.fixedSkySize?.y??f.y)),y=Math.max(1,Math.round(this.fixedCloudsSize?.x??f.x/4)),g=Math.max(1,Math.round(this.fixedCloudsSize?.y??f.y/4)),x=(O,j,Z,$)=>{if(O&&O.width===j&&O.height===Z)return O;this._renderer.retireRenderTarget!==void 0?this._renderer.retireRenderTarget(O):O?.dispose();let me=new Ee(j,Z,{type:At,depthBuffer:!1});return me.texture.name=$,me},v=this._skyTarget,V=this._cloudsTarget;this._skyTarget=x(this._skyTarget,p,_,"sky-pass"),this._cloudsTarget=x(this._cloudsTarget,y,g,"sky-clouds-pass"),V!==this._cloudsTarget&&(this._cloudsTargetCleared=!1);let T=this._renderer,z=T.getRenderTarget(),b=this._uCloudsParamsD.value,M=this._uCloudsParamsC.value,S=this._uRay00.value,C=this._uRay10.value,R=this._uRay01.value,k=this._uRay11.value,E=`${n}|${S.x},${S.y},${S.z}|${C.x},${C.y},${C.z}|${R.x},${R.y},${R.z}|${k.x},${k.y},${k.z}`,I=E===this._lastSkyPassKey&&v===this._skyTarget;this._lastSkyPassKey=E,I||(T.setRenderTarget(this._skyTarget),this._skyQuad.render(this._renderer));let D=this._cloudsEnabled?`${E}|${b.x},${b.y},${b.z},${b.w}|${M.z},${M.w}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`:"off",H=D===this._lastCloudsPassKey&&V===this._cloudsTarget;if(this._lastCloudsPassKey=D,T.setRenderTarget(this._cloudsTarget),this._cloudsEnabled)H||this._cloudsQuad.render(this._renderer),this._cloudsTargetCleared=!1;else if(!this._cloudsTargetCleared){let O=T.getClearColor(Yg),j=T.getClearAlpha();T.setClearColor(0,0),T.clear(!0,!1,!1),T.setClearColor(O,j),this._cloudsTargetCleared=!0}if(this._renderer.skyEnvironmentNeeded!==!1){if(this._ensureEnvPass(),this._envTarget===null){this._envTarget=new Ee(256,128,{type:At,depthBuffer:!1});let $=this._envTarget.texture;$.name="sky-environment",$.generateMipmaps=!0,$.minFilter=Oa,$.magFilter=Ve,$.wrapS=wa}this._uEnvCloudsOn.value=this._cloudsEnabled?1:0;let O=i?.25*Math.round(b.z/.25):b.z,j=this._blendStart>0?Math.floor(16*o)/16:o,Z=`${n}|${this._uExposure.value}|${this._uGamma.value}|${this._cloudsEnabled}|${b.x},${j},${O},${b.w}|${this._presetFrom}>${this._presetTo}|${d??""}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`;Z!==this._lastEnvKey?(this._lastEnvKey=Z,T.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),this._requestEnvPmrem(r)):this._pmremPending&&this._requestEnvPmrem(r)}T.setRenderTarget(z);
2233let K=this._ensureBackgroundMesh(this._skyTarget.texture,this._cloudsTarget.texture);(v!==this._skyTarget||V!==this._cloudsTarget)&&this._rebindComposeTextures(),K.parent!==e&&(K.parent?.remove(K),e.add(K)),this._auxiliary&&this._auxBorrowPage(e,K)}_auxBorrowPage(e,t){this._auxMesh=t!==null&&t.parent===e?t:null;for(let a of e.children)a!==t&&a.visible&&a.userData.splineSkyBackground===!0&&(a.visible=!1,this._auxHidden.push(a))}endFrame(){if(this._auxiliary){this._auxMesh?.parent?.remove(this._auxMesh),this._auxMesh=null;for(let e of this._auxHidden)e.visible=!0;this._auxHidden.length=0}}_updateHdri(e,t,a){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._animating=!1;let r=this._renderer.getDrawingBufferSize(Ju);this._updateCornerRays(t,r.y>0?r.x/r.y:1),this._hdri===null&&(this._hdri=new Zg(this._renderer,{ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11}));let s=e.skyHdriHolder,i=s!==null&&s.loaded?s.getTexture(1001):null;this._iblHdriTexture=i,this._iblRotationY=a.hdri?.rotation??0,this._lightingOn=a.lighting===!0&&i!==null;let n=t.fov,l=typeof n=="number"&&n>0?n:45,o=r.y/(this._renderer.getPixelRatio?.()??1),u=l*Math.PI/180/Math.max(1,o),d=(a.hdri?.blur??0)*u;if(this._hdri.update(e,i,a.hdri?.rotation,d,a.hdri?.showBackground!==!1),this._auxiliary)return void this._auxBorrowPage(e,this._hdri.backgroundMesh);let m=a.lighting===!0&&i!==null?this._hdri.lightingInfo(i):null;m!==null?this._updateHdriLighting(e,m,a.hdri?.rotation??0,a.lightingIntensity??1):this._lightingPage!==null&&this._teardownLighting()}_updateHdriLighting(e,t,a,r){this._lightingPage!==null&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let s=y=>{let g=Math.max(y[0],y[1],y[2],1e-6);return[y[0]/g,y[1]/g,y[2]/g]},i=this._sunLight;i===null&&(i=new To(16777215,0),i.name="SplineSkySun",i.layers.enable(3),i.raycast=()=>{},this._sunLight=i),i.parent!==e&&e.add(i),i.userData.splineDiffuseOnly=!0;let n=Math.cos(a),l=Math.sin(a),o=t.sunDir;i.position.set(n*o[0]-l*o[2],o[1],l*o[0]+n*o[2]).multiplyScalar(1e5);let u=s(t.sunColor);i.color.setRGB(u[0],u[1],u[2]);let d=Math.min(Math.max((t.sunPeak-1)/2,0),1);i.intensity=1*Math.PI*Math.min(t.sunLum,1)*d*r;let m=e.ambientLight;m!=null&&(m.parent!==null&&m.removeFromParent(),this._userAmbientSuppressed=!0);let h=this._skyHemi;h===null&&(h=new gl(16777215,8947848,0),h.name="SplineSkyAmbient",h.layers.enable(3),h.raycast=()=>{},this._skyHemi=h),h.parent!==e&&e.add(h);let f=s(t.skyColor);h.color.setRGB(f[0],f[1],f[2]);let p=s(t.groundColor),_=t.skyLum>1e-6?Math.min(t.groundLum/t.skyLum,1):Ei;h.groundColor.setRGB(p[0]*_,p[1]*_,p[2]*_),h.intensity=.75*Math.PI*(t.skyLum/.5)*r}_ensureLightingLuts(){if(this._lightingLutsRequested||this._luts===null)return;this._lightingLutsRequested=!0;let e=this._luts;Promise.all([$r(this._renderer,e.transmittance,256,64,1,!1),$r(this._renderer,e.irradiance,64,16,1,!1)]).then(([t,a])=>{this._lightingLuts={transmittance:t,irradiance:a};let r=this._atmosphereUniforms,s=r.bottomRadius+.1,i=ju(43200)[1],n=Lu(r,this._lightingLuts,s,i);this._noonSunRgb=[n[0],n[1],n[2]],this._noonSunLum=ks(n),this._noonSkyLum=ks(Iu(r,this._lightingLuts,s,i))},()=>{this._lightingLutsRequested=!1})}_updateLighting(e,t,a,r){let s=this._lightingLuts,i=this._noonSunRgb;if(s===null||i===null||this._noonSunLum<=0||this._noonSkyLum<=0)return;this._lightingPage!==null&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let n=this._atmosphereUniforms,l=n.bottomRadius+.1,o=this._uSunDir.value,u=o.y,d=b=>b[this._presetFrom]+(b[this._presetTo]-b[this._presetFrom])*t,m=(b,M)=>{let S=[b[0]/Math.max(i[0],1e-12),b[1]/Math.max(i[1],1e-12),b[2]/Math.max(i[2],1e-12)],C=ks(S),R=[C+(S[0]-C)*M,C+(S[1]-C)*M,C+(S[2]-C)*M],k=Math.max(R[0],R[1],R[2],1e-12);return[R[0]/k,R[1]/k,R[2]/k]},h=d(t_),f=Lu(n,s,l,u),p=ks(f),_=this._sunLight;if(_===null&&(_=new To(16777215,0),_.name="SplineSkySun",_.layers.enable(3),_.raycast=()=>{},this._sunLight=_),_.parent!==e&&e.add(_),_.userData.splineDiffuseOnly=!1,_.position.set(o.x,o.y,o.z).multiplyScalar(1e5),p>0){let b=m(f,h);_.color.setRGB(b[0],b[1],b[2])}_.intensity=1*Math.PI*(p/this._noonSunLum)*d(a_)*a*r;let y=e.ambientLight;y!=null&&(y.parent!==null&&y.removeFromParent(),this._userAmbientSuppressed=!0);let g=this._skyHemi;g===null&&(g=new gl(16777215,8947848,0),g.name="SplineSkyAmbient",g.layers.enable(3),g.raycast=()=>{},this._skyHemi=g),g.parent!==e&&e.add(g);let x=Iu(n,s,l,u),v=ks(x),[V,T,z]=m(x,h);g.color.setRGB(V,T,z),g.groundColor.setRGB(V*Ei,T*Ei,z*Ei),g.intensity=.75*Math.PI*(v/this._noonSkyLum)*d(r_)*a*r}_teardownLighting(){let e=this._lightingPage;if(this._lightingPage=null,this._sunLight?.parent?.remove(this._sunLight),this._skyHemi?.parent?.remove(this._skyHemi),this._userAmbientSuppressed){this._userAmbientSuppressed=!1;let t=e?.ambientLight,a=e?.data?.ambient?.enabled;t&&a!==!1&&e.add(t)}}_buildComposeNode(e,t){return ir(`fn skyCompose( 2234 uv: vec2f, 2235 skyTex: texture_2d<f32>, skySamp: sampler, 2236 cloudsTex: texture_2d<f32>,
2237 exposure: f32, gamma: f32) -> vec4f { 2238 let WHITE_POINT: f32 = 11.07; 2239 // three's screenUV is GL-style bottom-origin while the pass targets hold 2240 // top-row-first content â flip v to line the compose up with the view. 2241 let uvFlipped = vec2f(uv.x, 1.0 - uv.y); 2242 let sky = textureSampleLevel(skyTex, skySamp, uvFlipped, 0.0).rgb; 2243 let clouds = textureSampleLevel(cloudsTex, skySamp, uvFlipped, 0.0); 2244 2245 var color = vec4f(sky * (1.0 - clouds.a) + clouds.rgb, 1.0); 2246 color = vec4f(Hable(color.rgb, exposure, WHITE_POINT), color.a); 2247 color = vec4f(pow(color.rgb, vec3f(1.0 / gamma)), color.a); 2248 2249 return color; 2250}`,[Jr(Uu)])({uv:Fa,skyTex:re(e),skySamp:Yr(e),cloudsTex:re(t),exposure:this._uExposure,gamma:this._uGamma})}_rebindComposeTextures(){let e=this.backgroundMesh?.material;!e||!this._skyTarget||!this._cloudsTarget||(e.colorNode=this._buildComposeNode(this._skyTarget.texture,this._cloudsTarget.texture),e.needsUpdate=!0)}detach(){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._hdri?.detach(),this._teardownLighting(),this._lightingOn=!1}dispose(){this.detach(),this._hdri?.dispose(),this._hdri=null,this._sunLight?.dispose(),this._sunLight=null,this._skyHemi?.dispose(),this._skyHemi=null,this._luts?.dispose(),this._luts=null,this._baseNoise?.dispose(),this._detailNoise?.dispose(),this._weatherCur.dispose(),this._weatherNext.dispose(),this._highClouds.dispose(),this._skyTarget?.dispose(),this._cloudsTarget?.dispose(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._skyQuad=null,this._cloudsQuad=null,this._envQuad=null,this._cloudsArgs=null,this._cloudsLib=null,this._lastSkyPassKey=null,this._lastCloudsPassKey=null}};qd=e=>new s_(e);var i_=e=>e,al=mt("vec4","vSplatColor"),rl=mt("vec2","vSplatPosition");function sl(e,t,a){return e.element(t).element(a)}var n_=class extends ke{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=re(new Lt),this._centersColorsTex=re(new Lt),this._meshMatrixWorldsTex=re(new Lt),this._focal=L(new ve),this._viewport=L(new ve),this._basisViewport=L(new ve),this._covariancesTextureSize=L(new ve(1024,1024)),this._centersColorsTextureSize=L(new ve(1024,1024)),this._orthoZoom=L(-1),this._velocityMRT=Hs({velocity:P(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=is,this.lights=!1;let t=s=>({get value(){return s.value},set value(i){i&&i.isTexture&&(s.value=i)}}),a=s=>({get value(){return s.value},set value(i){s.value=i}}),r=s=>({value:s});this.uniforms={covariancesTexture:t(this._covariancesTex),centersColorsTexture:t(this._centersColorsTex),meshMatrixWorldsTexture:t(this._meshMatrixWorldsTex),focal:a(this._focal),viewport:a(this._viewport),basisViewport:a(this._basisViewport),covariancesTextureSize:a(this._covariancesTextureSize),centersColorsTextureSize:a(this._centersColorsTextureSize),orthoZoom:a(this._orthoZoom),meshIndexIntervals:r(e),debugColor:r(new gt)},this._buildGraph(e)}_buildGraph(e){let t=this._covariancesTex,a=this._centersColorsTex,r=this._meshMatrixWorldsTex,s=this._focal,i=this._basisViewport,n=this._covariancesTextureSize,l=this._centersColorsTextureSize,o=this._orthoZoom,u=U(()=>{let m=Er("splatIndex","uint"),h=(De,qt,bt)=>{let Fe=m.mul(Le(De)).add(Le(qt)).toFloat().div(bt.x);return A(Ae(Fe),J(Fe).div(bt.y))},f=a.sample(h(1,0,l)).toVar(),p=vc(bc(f.y,f.z,f.w),"vec3").toVar(),_=f.x;al.assign(P(_.bitAnd(Le(255)).toFloat(),_.shiftRight(Le(8)).bitAnd(Le(255)).toFloat(),_.shiftRight(Le(16)).bitAnd(Le(255)).toFloat(),_.shiftRight(Le(24)).bitAnd(Le(255)).toFloat()).mul(1/255));let y=Er("position","vec3").xy.mul(2).toVar();rl.assign(y);let g=c(0);for(let De=1;De<e.length-1;De++)g=i_(g.add(m.greaterThanEqual(Le(e[De])).select(c(1),c(0))));let x=g.mul(4).toVar(),v=De=>r.sample(A(x.add(De).div(1024),0)),V=gd(v(0),v(1),v(2),v(3)),T=La.mul(V).toVar(),z=T.mul(P(p,1)).toVar(),b=Js.mul(z).toVar(),M=t.sample(h(3,0,n)).xy.toVar(),S=t.sample(h(3,1,n)).xy.toVar(),C=t.sample(h(3,2,n)).xy.toVar(),R=M.x,k=M.y,E=S.x,I=S.y,D=C.x,H=C.y,K=Pr(R,k,E,k,I,D,E,D,H),O=c(1).div(z.z.mul(z.z)).toVar(),j=T,Z=Pr(j.element
2250(0).xyz,j.element(1).xyz,j.element(2).xyz).transpose(),$=Pr(s.x.div(z.z),0,s.x.mul(z.x).negate().mul(O),0,s.y.div(z.z),s.y.mul(z.y).negate().mul(O),0,0,0),me=De=>{let qt=De.transpose().mul(K).mul(De);return P(sl(qt,0,0).add(.3),sl(qt,0,1),sl(qt,1,1).add(.3),0).xyz},ue=o.greaterThan(0),ce=ue.select(me(Z),me(Z.mul($))).toVar(),Me=b.xyz.div(b.w).toVar(),fe=ce.x,Te=ce.z,Be=ce.y,$e=fe.mul(Te).sub(Be.mul(Be)),Ge=fe.add(Te),Ye=Ge.mul(.5),Ue=Ea(Q(Ge.mul(Ge).div(4).sub($e),0)).toVar(),wt=Ye.add(Ue).toVar(),Yt=Q(Ye.sub(Ue),0).toVar(),rt=ae(A(Be,wt.sub(fe))).toVar(),yt=A(rt.y,rt.x.negate()).toVar(),It=rt.mul(xe(Ea(wt.mul(2)),1024)).toVar(),Re=yt.mul(xe(Ea(Yt.mul(2)),1024)).toVar(),st=It.mul(y.x).add(Re.mul(y.y)).mul(i).toVar();return st.assign(ue.select(st.mul(o),st)),P(Me.xy.add(st),Me.z,1)}),d=U(()=>{let m=rl.dot(rl).negate().toVar();m.lessThan(-4).discard();let h=Ql(m).mul(al.w);return P(al.xyz,h)});this.vertexNode=u(),this.colorNode=d(),this.needsUpdate=!0}setup(e){let t=e.renderer.getMRT?.();this.mrtNode=t?this._velocityMRT:null,super.setup(e)}nodeMaterialDispose(){this.dispose()}};function V_(){let e=L(1),t=L(.6),a=L(1),r=L(1),s=L(new gt(16603997)),i=L(new gt(2857471)),n=L(new gt(3728051)),l=L(9),o=L(new ve),u=new ke;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=Se(l.equal(10),n,i),m=Se(l.equal(8),n,s),h=Se(Ws.x.equal(o.x),d,Se(Ws.z.equal(o.y),m,w(.5)));u.colorNode=h;let f=cr.z.negate(),p=Ze(a.mul(500),a.mul(4500),f).mul(r);u.opacityNode=X(e.mul(t),c(0),p);let _={get value(){return r.value===0?1/0:a.value},set value(y){Number.isFinite(y)?(a.value=y,r.value=1):r.value=0}};return u.uniforms={angleFadeFactor:e,opacityFactor:t,gridScale:_,red:s,blue:i,green:n,mode:l,offset:o},u}function M_(){return typeof navigator<"u"&&navigator.gpu!==void 0}sp({createSplatMaterial:e=>new n_(e)}),ip({createRootMaterial:(e,t)=>new es(e,t),createSharedMaterial:(e,t,a)=>new dg(e,t,a)}),ap({tsl:Hl,NodeMaterial:ke,MeshBasicNodeMaterial:_c,MeshStandardNodeMaterial:gc,MeshPhysicalNodeMaterial:fc,MeshPhongNodeMaterial:pc,MeshLambertNodeMaterial:cc,MeshToonNodeMaterial:mc,MeshMatcapNodeMaterial:hc,MeshNormalNodeMaterial:dc,SpriteNodeMaterial:uc,PointsNodeMaterial:ol,LineBasicNodeMaterial:oc,LineDashedNodeMaterial:lc,Color:gt,Vector2:ve,Vector3:ne,Vector4:at,Matrix3:en,Matrix4:Ra,Texture:Lt,CanvasTexture:mp,DataTexture:fr,VideoTexture:hp,FrontSide:pl,BackSide:cl,DoubleSide:is,NormalBlending:dp,AdditiveBlending:up,MultiplyBlending:op,SubtractiveBlending:lp,RepeatWrapping:wa,ClampToEdgeWrapping:ns,MirroredRepeatWrapping:np,NearestFilter:Oe,LinearFilter:Ve,LinearMipmapLinearFilter:Oa,SRGBColorSpace:Yl,LinearSRGBColorSpace:ml}),cp(()=>{let e=new xc;return e.depthWrite=!1,e.opacity=.5,e});var l_=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function C_(e={}){let t=!1;try{t=new URLSearchParams(window.location.search).get("dbglimits")==="default"}catch{}let a=t?{}:e.requiredLimits??await(async function(s){if(!(s.forceWebGL||typeof navigator>"u"||navigator.gpu===void 0))try{let i=await navigator.gpu.requestAdapter({powerPreference:s.powerPreference,featureLevel:"compatibility"});if(!i)return;let n={},l=i.limits;for(let o of l_){let u=l[o];typeof u=="number"&&Number.isFinite(u)&&(n[o]=u)}return n}catch{return}})(e),r=new ah({...e,requiredLimits:a});await r.init();try{let s=new URLSearchParams(window.location.search);if(s.get("taa")==="off"&&(r.temporalAAEnabled=!1),s.get("nojit")==="1"){let i=r.taaHistory;i.beginJitter=()=>{},i.endJitter=()=>{}}s.get("dbghdt")==="1"&&(r.hdTransmission=!0)}catch{}return r}export{b_ as SPE_BLENDING_MULTIPLY,v_ as SPE_BLENDING_NORMAL,w_ as SPE_BLENDING_OVERLAY,T_ as SPE_BLENDING_SCREEN,ef as TSLLayerParams,es as TSLRootMaterial,dg as TSLSharedMaterial,Ed as WebGPUPostPipeline,ah as WebGPUSplineRenderer,V_ as createEditorGridNodeMaterial,C_ as createWebGPUSplineRenderer,rf as getTSLLayerBuilder,S_ as hasTSLLayerBuilder,M_ as isWebGPUSupported,lu as ownUniformValue,Qt as registerTSLLayer,sh as setRenderUniformValue,ei as simpleCalpha,qn as speBlend,to as speObjectNormal,ga as speObjectPosition,rh as splitUniformValueSlots,Qa as standardCalpha,af as unsupportedTSLLayerBuilder,W as webgpuGlobals};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.