class RegionParticlesTSL{constructor(e,w,x,A,k){const i=window.TSL,{float:B,int:_,bool:N,vec2:y,vec3:c,vec4:m,uniform:s,uniformArray:$,texture:l,texture3D:p,Fn:E,If:a,Loop:I,Break:Q,select:C,mix:pt,smoothstep:ut,clamp:nt,max:j,min:rt,abs:at,exp:St,ceil:Ct,length:D,dot:it,cross:Tt,normalize:ct,sqrt:Dt,pow:Ht,hash:dt}=i;this.region=e,this.renderer=x,this.count=w;const F=!!e.flowTex.fill;this.chamber=F;const mt=e.meta.fields,Rt=F?e.flowTex.fill:e.flowTex.flow,zt=F?e.flowTex.eject:e.flowTex.flow,{positions:Lt}=_sampleInside(e.insideSection,e.origin,e.h,w);this.posBuf=i.instancedArray(Lt,"vec4"),this.offBuf=i.instancedArray(w,"vec3"),this.drawBuf=i.instancedArray(w,"vec3"),this.swirl={axis:new THREE.Vector3(0,1,0),center:_insideCentroid(e),omega:0,gain:0},this.swirlU=new THREE.Vector4(0,1,0,0),this.swirlC=this.swirl.center;const G=[];for(const[o,n]of[["outlets",1],["inlets",-1]])for(const u of e.meta.bounds[o]||[])G.length<8&&G.push(new THREE.Vector4(u.center[0],u.center[1],u.center[2],n*Math.max(u.radius||.5,.3)));const kt=G.length;for(;G.length<8;)G.push(new THREE.Vector4(0,0,0,0));const t=this.U={uFlowA:p(Rt),uFlowB:p(zt),uDist:p(e.dist),uInside:p(e.inside),uOrigin:s(new THREE.Vector3(...e.origin)),uSize:s(new THREE.Vector3(...e.size)),uUmaxA:s(F?mt.fill.umax:mt.flow.umax),uUmaxB:s(F?mt.eject.umax:0),uHasB:s(F?1:0),uQa:s(0),uQb:s(0),uDt:s(0),uTime:s(0),uH:s(e.h),uVolScale:s(1),uJetA:s(new THREE.Vector4),uJetAN:s(new THREE.Vector4),uJetB:s(new THREE.Vector4),uJetBN:s(new THREE.Vector4),uJetLen:s(BLOOD.jetLenCm),uWallCm:s(BLOOD.wallCm),uPorts:$(G,"vec4"),uNPorts:s(kt,"int"),uSwirl:s(this.swirlU),uSwirlC:s(this.swirlC),uSwirlMax:s(BLOOD.swirlMaxCm),uInertia:s(BLOOD.inertiaSec),uCurlAmp:s(BLOOD.curlAmp),uCurlFloor:s(F?BLOOD.curlFloor:BLOOD.curlFloor*.5),uCurlScale:s(BLOOD.curlScale),uInlet:l(e.inlet.tex),uOutlet:l(e.outlet.tex),uNInlet:s(e.inlet.n),uNOutlet:s(e.outlet.n),uVolRemain:s(0),uStuckSec:s(BLOOD.stuckSec)};this.posVar={material:{uniforms:t}};const h=bloodFieldFnsTSL(t),Mt=bloodNoiseFnsTSL(),X=this.posBuf,ot=this.offBuf,vt=this.drawBuf;this.velCompute=E(()=>{const o=i.instanceIndex,n=X.element(o).toVar(),u=ot.element(o).toVar(),H=c(0).toVar();a(n.w.greaterThanEqual(-.5),()=>{const d=n.xyz,b=h.fieldAt(d).toVar(),f=c(0).toVar();a(t.uSwirl.w.greaterThan(0),()=>{const O=Tt(t.uSwirl.xyz,d.sub(t.uSwirlC)),g=D(O),S=rt(t.uSwirl.w.mul(g),t.uSwirlMax);a(g.greaterThan(1e-5),()=>{f.assign(O.mul(S.div(g)))})});const T=h.distAt(d).toVar(),v=ut(0,.25,T);f.mulAssign(v);const V=B(1).toVar();I(8,({i:O})=>{a(O.greaterThanEqual(t.uNPorts),()=>{Q()});const g=t.uPorts.element(O),S=at(g.w);V.assign(rt(V,ut(S.mul(1.2),S.mul(1.2).add(1.2),D(d.sub(g.xyz)))))});const r=t.uCurlAmp.mul(D(b).add(D(f))).add(t.uCurlFloor).mul(v).mul(V),R=Mt.curlNoise(d.mul(t.uCurlScale).add(c(0,t.uTime.mul(.12),0))).mul(.25).mul(r),z=B(1).sub(St(t.uDt.div(t.uInertia).negate())),P=b.add(pt(u,f.add(R),z)).toVar();a(T.lessThan(t.uWallCm.mul(3)),()=>{const O=h.gradDist(d).toVar(),g=D(O);a(g.greaterThan(1e-4),()=>{O.divAssign(g);const S=it(P,O);a(S.lessThan(0),()=>{P.subAssign(O.mul(S).mul(B(1).sub(ut(t.uWallCm,t.uWallCm.mul(3),T))))})})}),H.assign(P.sub(b))}),ot.element(o).assign(H)})().compute(w);const gt=(o,n,u)=>o.sample(y(i.floor(u.mul(n)).add(.5).div(n),.5)).xyz,Nt=E(([o,n])=>{const u=N(!1).toVar();return I(8,({i:H})=>{a(H.greaterThanEqual(t.uNPorts),()=>{Q()});const d=t.uPorts.element(H),b=d.w.greaterThan(0),f=b.and(n.greaterThan(0)).or(b.not().and(t.uQa.lessThan(0)));a(f.and(D(o.sub(d.xyz)).lessThan(at(d.w).mul(1.8).add(.6))),()=>{u.assign(!0)})}),u});this.posCompute=E(()=>{const o=i.instanceIndex,n=X.element(o).toVar(),u=B(o).mul(.618).add(t.uTime.mul(97.13)),H=dt(u),d=dt(u.add(13.7)),b=dt(u.add(41.3)),f=j(t.uQa,0),T=C(t.uHasB.greaterThan(.5),j(t.uQb.negate(),0),j(t.uQa.negate(),0)),v=m(0).toVar();a(n.w.lessThan(-.5),()=>{const V=n.w.negate().sub(1).sub(f.add(T).mul(t.uDt));a(V.lessThanEqual(0).and(f.add(T).greaterThan(0)),()=>{const r=H.mul(f.add(T)).lessThan(f),R=C(r,gt(t.uInlet,t.uNInlet,d),gt(t.uOutlet,t.uNOutlet,d)).add(c(H,d,b).sub(.5).mul(t.uH)).toVar(),z=R.add(h.fieldAt(R).mul(t.uDt).mul(b));v.assign(m(C(h.insideAt(z).greaterThan(.1),z,R),0))}).Else(()=>{v.assign(m(n.xyz,B(-1).sub(j(V,0))))})}).Else(()=>{const V=n.w.toVar(),r=n.xyz.toVar(),R=ot.element(o).toVar(),z=h.fieldAt(r).toVar(),P=z.add(R),O=D(P),g=D(z),S=C(t.uHasB.greaterThan(.5),t.uQb,t.uQa),et=_(nt(Ct(O.mul(1.5).mul(t.uDt).div(t.uH)),1,32)).toVar(),K=t.uDt.div(B(et)),J=N(!1).toVar();I(32,({i:U})=>{a(U.greaterThanEqual(et),()=>{Q()});const st=h.fieldAt(r).add(R),wt=r.add(st.mul(K.mul(.5)));r.addAssign(st.mul(K));const L=h.insideAt(wt),W=h.insideAt(r),M=S.greaterThan(0).and(L.lessThan(.4).and(L.greaterThan(.1)).or(W.lessThan(.4).and(W.greaterThan(.1)))),Ut=t.uQa.lessThan(0).and(L.lessThan(.7).and(L.greaterThan(.4)).or(W.lessThan(.7).and(W.greaterThan(.4))));a(M.or(Ut),()=>{J.assign(!0),Q()});const yt=h.distAt(r);a(W.lessThan(.1).or(yt.lessThan(t.uWallCm)),()=>{const bt=h.gradDist(r),Ot=D(bt);a(Ot.greaterThan(1e-4),()=>{r.addAssign(bt.div(Ot).mul(t.uWallCm.sub(yt).add(.02)))})})}),a(J,()=>{v.assign(m(r,B(-1).sub(t.uVolRemain)))}).Else(()=>{const U=N(!1).toVar();a(h.insideAt(r).lessThan(.1),()=>{a(Nt(r,S),()=>{v.assign(m(r,B(-1).sub(t.uVolRemain))),U.assign(!0)}).Else(()=>{r.assign(n.xyz),a(h.insideAt(r).lessThan(.1),()=>{v.assign(m(r,B(-1).sub(t.uVolRemain))),U.assign(!0)})})}),a(U.not(),()=>{a(g.lessThan(.03).and(at(t.uQa).add(at(t.uQb)).greaterThan(2)),()=>{V.addAssign(t.uDt)}).Else(()=>{V.assign(0)}),a(V.greaterThan(t.uStuckSec),()=>{v.assign(m(r,-1))}).Else(()=>{v.assign(m(r,rt(V,9.9)))})})})}),X.element(o).assign(v)})().compute(w),this.drawCompute=E(()=>{const o=i.instanceIndex,n=X.element(o).toVar(),u=ot.element(o).toVar();vt.element(o).assign(C(n.w.lessThan(-.5),c(0),h.fieldAt(n.xyz).add(u)))})().compute(w),F&&this._setupSwirl(e);const Y=new THREE.InstancedBufferGeometry;Y.setAttribute("position",new THREE.Float32BufferAttribute([0,0,0,0,0,0,0,0,0,0,0,0],3)),Y.setAttribute("corner",new THREE.Float32BufferAttribute([0,-1,1,-1,1,1,0,1],2)),Y.setIndex([0,1,2,0,2,3]),Y.instanceCount=w;const lt=e.meta.deform.keys.filter(o=>e.deform[o]);this.keys=lt;const It=lt.map(o=>p(e.deform[o]));this.uW=lt.map(()=>s(0));const Ft=s(new THREE.Vector3(...e.meta.deform.origin)),Pt=s(new THREE.Vector3(...e.meta.deform.dims.map(o=>o*e.meta.deform.h))),ht=s(BLOOD.streakWidthCm),xt=s(BLOOD.streakSec),At=s(BLOOD.streakMinCm),Bt=s(BLOOD.streakMaxCm),Et=s(new THREE.Color(k)),ft=s(new THREE.Vector3(.35,.6,.72).normalize()),q=i.varyingProperty("vec2","vStreakUv"),Z=i.varyingProperty("float","vStreakLen"),tt=new THREE.MeshBasicNodeMaterial({transparent:!1,depthWrite:!0,side:THREE.DoubleSide,fog:!1});tt.vertexNode=E(()=>{const o=i.instanceIndex,n=X.element(o).toVar(),u=i.attribute("corner","vec2"),H=m(2,2,2,1),d=m(0).toVar();return q.assign(y(0)),Z.assign(0),a(n.w.lessThan(-.5),()=>{d.assign(H)}).Else(()=>{const b=vt.element(o).toVar(),f=D(b),T=nt(f.mul(xt),At,Bt).toVar(),v=C(f.greaterThan(1e-4),b.div(f),c(0,1,0)),V=ht.mul(.5),r=V.add(.04);a(h.distAt(n.xyz).lessThan(r),()=>{d.assign(H)}).Else(()=>{I(6,()=>{const M=T.add(V.mul(2));a(h.distAt(n.xyz.sub(v.mul(M))).lessThan(r).or(h.distAt(n.xyz.sub(v.mul(M.mul(.5)))).lessThan(r)),()=>{T.mulAssign(.5)}).Else(()=>{Q()})}),a(h.distAt(n.xyz.sub(v.mul(T.add(V.mul(2))))).lessThan(r),()=>{T.assign(0)});const R=n.xyz.sub(Ft).div(Pt),z=c(0).toVar();for(let M=0;M<lt.length;M++)z.addAssign(It[M].sample(R).xyz.mul(this.uW[M]));const P=n.xyz.add(z),O=P.sub(v.mul(T)),g=i.modelViewMatrix.mul(m(P,1)).xyz.toVar(),S=i.modelViewMatrix.mul(m(O,1)).xyz.toVar(),et=g.sub(S),K=D(et),J=C(K.greaterThan(1e-5),et.div(K),c(1,0,0)),U=Tt(J,ct(g)),st=D(U),wt=C(st.greaterThan(1e-4),U.div(st),c(0,1,0)),L=ht.mul(D(i.modelViewMatrix.element(0).xyz)).mul(.5);g.subAssign(J.mul(L)),S.subAssign(J.mul(L));const W=pt(S,g,u.x).add(wt.mul(L.mul(u.y))).add(J.mul(L.mul(u.x.mul(2).sub(1))));d.assign(i.cameraProjectionMatrix.mul(m(W,1))),q.assign(u),Z.assign(K.div(L))})}),d})(),tt.colorNode=E(()=>{const o=q.x.mul(Z.add(2)).sub(1),n=o.sub(nt(o,0,Z)),u=n.mul(n).add(q.y.mul(q.y));i.Discard(u.greaterThan(1));const H=Dt(B(1).sub(u)),d=ct(c(n.mul(.6),q.y,H)),b=j(0,it(d,ft)),f=Ht(j(0,it(ct(ft.add(c(0,0,1))),d)),24),T=nt(o.div(j(Z,.001)),0,1);return Et.mul(b.mul(.75).add(.28)).mul(T.mul(.45).add(.55)).add(c(f.mul(.25).mul(T)))})(),tt.uniforms={uColor:Et,uLight:ft,uWidthCm:ht,uStreakSec:xt,uStreakMin:At,uStreakMax:Bt},this.mat=tt,this.points=new THREE.Mesh(Y,tt),this.points.name=e.name+"_blood",this.points.frustumCulled=!1,this.points.raycast=()=>{},this.points.castShadow=!1,this.points.renderOrder=2;const Vt=o=>{const n=(e.meta.bounds[o]||[]).find(u=>u.kind==="valve");return n?{valve:n.valve,c:new THREE.Vector3(...n.center),n:new THREE.Vector3(...n.axis).normalize(),r:n.radius}:null};this.portA=Vt("inlets"),this.portB=Vt("outlets"),this.jetA=null,this.jetB=null}_setupSwirl(e){RegionParticles.prototype._setupSwirl.call(this,e)}setState(e){const w=e&&e.valveMod||{},x=this.region,A=this.U,k=l=>{const p=l&&w[l];return p&&p.open!=null?`${l}_open`:null},i=(l,p)=>{const E=k(p),a=E&&x.flowTex[`${l}@${E}`]?`${l}@${E}`:l;return[x.flowTex[a],x.meta.fields[a].umax,a]},B=k(this.portA&&this.portA.valve),_=k(this.portB&&this.portB.valve),N=B&&x.inlets[B]||x.inlet,y=_&&x.outlets[_]||x.outlet,c=this.chamber?i("fill",this.portA&&this.portA.valve):i("flow",this.portA&&this.portA.valve),m=this.chamber?i("eject",this.portB&&this.portB.valve):c;A.uFlowA.value=c[0],A.uUmaxA.value=c[1],A.uFlowB.value=m[0],A.uUmaxB.value=m[1],A.uInlet.value=N.tex,A.uNInlet.value=N.n,A.uOutlet.value=y.tex,A.uNOutlet.value=y.n;const s=(l,p,E)=>{const a=l&&w[l.valve],I=a&&a[E];if(!l||I==null||I>=.98)return null;const Q=Math.min(l.r,1.4),C=Q*Math.sqrt(I);return{c:l.c.clone().addScaledVector(l.n,p*C*.3),n:l.n.clone().multiplyScalar(p),rT:C,area:Math.PI*C*C}};this.jetA=s(this.portA,1,"open"),this.jetB=s(this.portB,-1,"leak");const $=(l,p,E)=>{l?(p.value.set(l.c.x,l.c.y,l.c.z,l.rT),E.value.set(l.n.x,l.n.y,l.n.z,0)):(p.value.set(0,0,0,0),E.value.set(0,0,0,0))};$(this.jetA,A.uJetA,A.uJetAN),$(this.jetB,A.uJetB,A.uJetBN)}update(e,w,x,A,k,i,B){if(this.chamber&&this.swirl.gain>0){const c=Math.max(w,0)+Math.max(-x,0),m=this.swirl.gain*c/Math.max(this.region.meta.volume_ml,1),s=this.swirl,$=m>s.omega?BLOOD.swirlUp:x>5?BLOOD.swirlBrake:BLOOD.swirlDown;e>0&&(s.omega+=(m-s.omega)*(1-Math.exp(-e/$))),this.swirlU.w=s.omega}const _=this.jetA&&w>0?w*k/this.jetA.area:0,N=this.jetB&&this.chamber&&x<0?-x*k/this.jetB.area:0,y=this.U;y.uQa.value=w,y.uQb.value=x,y.uVolScale.value=k,y.uDt.value=e,y.uTime.value=i%1e3,y.uJetAN.value.w=_,y.uJetBN.value.w=N,y.uVolRemain.value=A,this.renderer.compute(this.velCompute),this.renderer.compute(this.posCompute),this.renderer.compute(this.drawCompute);for(let c=0;c<this.keys.length;c++)this.uW[c].value=B[this.keys[c]]||0}async readPositions(){const e=await this.renderer.getArrayBufferAsync(this.posBuf.value);return e instanceof ArrayBuffer?new Float32Array(e):e.buffer?new Float32Array(e.buffer,e.byteOffset,e.byteLength/4):e}dispose(){this.points.geometry.dispose(),this.mat.dispose()}}Object.assign(window,{RegionParticlesTSL});
