typegpu 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,7 +31,7 @@ const main = () => {
31
31
  return neighborhood(1.1, 0.5);
32
32
  };
33
33
 
34
- const wgsl = tgpu.resolve({ externals: { main } });
34
+ const wgsl = tgpu.resolve([main]);
35
35
  // ^? string
36
36
 
37
37
  //
@@ -0,0 +1,2 @@
1
+ import{n as Q,o as K,p as j,q as a,s as U,t as Y}from"./chunk-EHLRP4V2.js";import{Ab as R,Bb as H,Cc as p,La as t,N as _,O as S,_a as l,a as q,cb as f,db as r,eb as N,fa as $,fb as I,ga as z,gb as P,hb as c,jb as d,kb as i,lb as T,nb as y,ob as C,pb as A,r as h,rb as Z,sb as v,tb as k,ub as V,v as L,wb as W,xb as m,yb as M,zb as x}from"./chunk-SHSILTWI.js";var s=e=>({argTypes:[e],returnType:e}),E=(...e)=>{let n=l(e)??e;return{argTypes:n,returnType:n[0]}};function J(e){return(n,...o)=>{let u=n;for(let w of o)u=e(u,w);return u}}function X(e){return(n,...o)=>{let u=t`${n}`;for(let w of o)u=t`${e}(${u}, ${w})`;return u}}function te(e){return typeof e=="number"?Math.abs(e):a.abs[e.kind](e)}var fn=r({name:"abs",signature:s,normalImpl:te,codegenImpl:e=>t`abs(${e})`});function re(e){return typeof e=="number"?Math.acos(e):a.acos[e.kind](e)}var dn=r({name:"acos",signature:s,normalImpl:re,codegenImpl:e=>t`acos(${e})`});function oe(e){return typeof e=="number"?Math.acosh(e):a.acosh[e.kind](e)}var yn=r({name:"acosh",signature:s,normalImpl:oe,codegenImpl:e=>t`acosh(${e})`});function ae(e){return typeof e=="number"?Math.asin(e):a.asin[e.kind](e)}var bn=r({name:"asin",signature:s,normalImpl:ae,codegenImpl:e=>t`asin(${e})`});function se(e){return typeof e=="number"?Math.asinh(e):a.asinh[e.kind](e)}var gn=r({name:"asinh",signature:s,normalImpl:se,codegenImpl:e=>t`asinh(${e})`});function ue(e){return typeof e=="number"?Math.atan(e):a.atan[e.kind](e)}var In=r({name:"atan",signature:s,normalImpl:ue,codegenImpl:e=>t`atan(${e})`});function ce(e){return typeof e=="number"?Math.atanh(e):a.atanh[e.kind](e)}var xn=r({name:"atanh",signature:s,normalImpl:ce,codegenImpl:e=>t`atanh(${e})`});function ie(e,n){return typeof e=="number"&&typeof n=="number"?Math.atan2(e,n):a.atan2[e.kind](e,n)}var hn=r({name:"atan2",signature:(...e)=>{let n=l(e,[i,T,I])??e;return{argTypes:n,returnType:n[0]}},normalImpl:ie,codegenImpl:(e,n)=>t`atan2(${e}, ${n})`});function pe(e){return typeof e=="number"?Math.ceil(e):a.ceil[e.kind](e)}var An=r({name:"ceil",signature:s,normalImpl:pe,codegenImpl:e=>t`ceil(${e})`});function me(e,n,o){return typeof e=="number"?Math.min(Math.max(n,e),o):a.clamp[e.kind](e,n,o)}var vn=r({name:"clamp",signature:E,normalImpl:me,codegenImpl:(e,n,o)=>t`clamp(${e}, ${n}, ${o})`});function le(e){return typeof e=="number"?Math.cos(e):a.cos[e.kind](e)}var Vn=r({name:"cos",signature:s,normalImpl:le,codegenImpl:e=>t`cos(${e})`});function Te(e){return typeof e=="number"?Math.cosh(e):a.cosh[e.kind](e)}var Fn=r({name:"cosh",signature:s,normalImpl:Te,codegenImpl:e=>t`cosh(${e})`});var wn=r({name:"countLeadingZeros",signature:s,normalImpl:"CPU implementation for countLeadingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`countLeadingZeros(${e})`});var $n=r({name:"countOneBits",signature:s,normalImpl:"CPU implementation for countOneBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`countOneBits(${e})`});var Pn=r({name:"countTrailingZeros",signature:s,normalImpl:"CPU implementation for countTrailingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`countTrailingZeros(${e})`}),Un=r({name:"cross",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:(e,n)=>a.cross[e.kind](e,n),codegenImpl:(e,n)=>t`cross(${e}, ${n})`});function fe(e){if(typeof e=="number")return e*180/Math.PI;throw new f("CPU implementation for degrees on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var Bn=r({name:"degrees",signature:s,normalImpl:fe,codegenImpl:e=>t`degrees(${e})`}),Sn=r({name:"determinant",signature:s,normalImpl:"CPU implementation for determinant not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`determinant(${e})`});function de(e,n){return typeof e=="number"&&typeof n=="number"?Math.abs(e-n):Fe(U(e,n))}var Cn=r({name:"distance",signature:(...e)=>({argTypes:e,returnType:S(e[0])?T:i}),normalImpl:de,codegenImpl:(e,n)=>t`distance(${e}, ${n})`}),ye=r({name:"dot",signature:(...e)=>({argTypes:e,returnType:e[0].primitive}),normalImpl:(e,n)=>a.dot[e.kind](e,n),codegenImpl:(e,n)=>t`dot(${e}, ${n})`}),kn=r({name:"dot4U8Packed",signature:{argTypes:[c,c],returnType:c},normalImpl:"CPU implementation for dot4U8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n)=>t`dot4U8Packed(${e}, ${n})`}),Mn=r({name:"dot4I8Packed",signature:{argTypes:[c,c],returnType:d},normalImpl:"CPU implementation for dot4I8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n)=>t`dot4I8Packed(${e}, ${n})`});function be(e){return typeof e=="number"?Math.exp(e):a.exp[e.kind](e)}var En=r({name:"exp",signature:s,normalImpl:be,codegenImpl:e=>t`exp(${e})`});function ge(e){return typeof e=="number"?2**e:a.exp2[e.kind](e)}var Gn=r({name:"exp2",signature:s,normalImpl:ge,codegenImpl:e=>t`exp2(${e})`});var Ln=r({name:"extractBits",signature:(e,n,o)=>({argTypes:[e,c,c],returnType:e}),normalImpl:"CPU implementation for extractBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n,o)=>t`extractBits(${e}, ${n}, ${o})`}),Nn=r({name:"faceForward",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:"CPU implementation for faceForward not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n,o)=>t`faceForward(${e}, ${n}, ${o})`});var Rn=r({name:"firstLeadingBit",signature:s,normalImpl:"CPU implementation for firstLeadingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`firstLeadingBit(${e})`});var Dn=r({name:"firstTrailingBit",signature:s,normalImpl:"CPU implementation for firstTrailingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`firstTrailingBit(${e})`});function Ie(e){return typeof e=="number"?Math.floor(e):a.floor[e.kind](e)}var On=r({name:"floor",signature:s,normalImpl:Ie,codegenImpl:e=>t`floor(${e})`});function xe(e,n,o){if(typeof e=="number")return e*n+o;throw new f("CPU implementation for fma on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var qn=r({name:"fma",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:xe,codegenImpl:(e,n,o)=>t`fma(${e}, ${n}, ${o})`});function he(e){return typeof e=="number"?e-Math.floor(e):a.fract[e.kind](e)}var _n=r({name:"fract",signature:s,normalImpl:he,codegenImpl:e=>t`fract(${e})`}),Ae={f32:p({fract:i,exp:d}),f16:p({fract:T,exp:d}),abstractFloat:p({fract:I,exp:N}),vec2f:p({fract:y,exp:A}),vec3f:p({fract:v,exp:V}),vec4f:p({fract:m,exp:x}),vec2h:p({fract:C,exp:A}),vec3h:p({fract:k,exp:V}),vec4h:p({fract:M,exp:x})},zn=r({name:"frexp",normalImpl:"CPU implementation for frexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",signature:e=>{let n=Ae[e.type];if(!n)throw new Error(`Unsupported data type for frexp: ${e.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`);return{argTypes:[e],returnType:n}},codegenImpl:e=>t`frexp(${e})`});var Zn=r({name:"insertBits",signature:(e,n,o,u)=>({argTypes:[e,n,c,c],returnType:e}),normalImpl:"CPU implementation for insertBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n,o,u)=>t`insertBits(${e}, ${n}, ${o}, ${u})`});function ve(e){if(typeof e=="number")return 1/Math.sqrt(e);throw new f("CPU implementation for inverseSqrt on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var Wn=r({name:"inverseSqrt",signature:s,normalImpl:ve,codegenImpl:e=>t`inverseSqrt(${e})`});var Hn=r({name:"ldexp",signature:(e,n)=>{switch(e.type){case"abstractFloat":return{argTypes:[e,N],returnType:e};case"f32":case"f16":return{argTypes:[e,d],returnType:e};case"vec2f":case"vec2h":return{argTypes:[e,A],returnType:e};case"vec3f":case"vec3h":return{argTypes:[e,V],returnType:e};case"vec4f":case"vec4h":return{argTypes:[e,x],returnType:e};default:throw new Error(`Unsupported data type for ldexp: ${e.type}. Supported types are abstractFloat, f32, f16, vec2f, vec2h, vec3f, vec3h, vec4f, vec4h.`)}},normalImpl:"CPU implementation for ldexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n)=>t`ldexp(${e}, ${n})`});function Ve(e){return typeof e=="number"?Math.abs(e):a.length[e.kind](e)}var Fe=r({name:"length",signature:e=>({argTypes:[e],returnType:S(e)?T:i}),normalImpl:Ve,codegenImpl:e=>t`length(${e})`});function we(e){return typeof e=="number"?Math.log(e):a.log[e.kind](e)}var Qn=r({name:"log",signature:s,normalImpl:we,codegenImpl:e=>t`log(${e})`});function $e(e){return typeof e=="number"?Math.log2(e):a.log2[e.kind](e)}var Kn=r({name:"log2",signature:s,normalImpl:$e,codegenImpl:e=>t`log2(${e})`});function Pe(e,n){return typeof e=="number"?Math.max(e,n):a.max[e.kind](e,n)}var jn=r({name:"max",signature:E,normalImpl:J(Pe),codegenImpl:X("max")});function Ue(e,n){return typeof e=="number"?Math.min(e,n):a.min[e.kind](e,n)}var Yn=r({name:"min",signature:E,normalImpl:J(Ue),codegenImpl:X("min")});function Be(e,n,o){if(typeof e=="number"){if(typeof o!="number"||typeof n!="number")throw new Error("When e1 and e2 are numbers, the blend factor must be a number.");return e*(1-o)+n*o}if(typeof e=="number"||typeof n=="number")throw new Error("e1 and e2 need to both be vectors of the same kind.");return a.mix[e.kind](e,n,o)}var Jn=r({name:"mix",signature:E,normalImpl:Be,codegenImpl:(e,n,o)=>t`mix(${e}, ${n}, ${o})`}),Se={f32:p({fract:i,whole:i}),f16:p({fract:T,whole:T}),abstractFloat:p({fract:I,whole:I}),vec2f:p({fract:y,whole:y}),vec3f:p({fract:v,whole:v}),vec4f:p({fract:m,whole:m}),vec2h:p({fract:C,whole:C}),vec3h:p({fract:k,whole:k}),vec4h:p({fract:M,whole:M})};var Xn=r({name:"modf",signature:e=>{let n=Se[e.type];if(!n)throw new Error(`Unsupported data type for modf: ${e.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`);return{argTypes:[e],returnType:n}},normalImpl:"CPU implementation for modf not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`modf(${e})`}),et=r({name:"normalize",signature:s,normalImpl:e=>a.normalize[e.kind](e),codegenImpl:e=>t`normalize(${e})`});function Ce(e,n){if(typeof e=="number"&&typeof n=="number")return e**n;if(h(e)&&h(n))return a.pow[e.kind](e,n);throw new Error("Invalid arguments to pow()")}var nt=r({name:"pow",signature:(...e)=>{let n=l(e,[i,T,I])??e;return{argTypes:n,returnType:_(n[0])?n[1]:n[0]}},normalImpl:Ce,codegenImpl:(e,n)=>t`pow(${e}, ${n})`});var tt=r({name:"quantizeToF16",signature:s,normalImpl:"CPU implementation for quantizeToF16 not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`quantizeToF16(${e})`});function ke(e){if(typeof e=="number")return e*Math.PI/180;throw new f("CPU implementation for radians on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var rt=r({name:"radians",signature:(...e)=>{let n=l(e,[i,T,I])??e;return{argTypes:n,returnType:n[0]}},normalImpl:ke,codegenImpl:e=>t`radians(${e})`}),ot=r({name:"reflect",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:(e,n)=>U(e,Y(2*ye(n,e),n)),codegenImpl:(e,n)=>t`reflect(${e}, ${n})`}),at=r({name:"refract",normalImpl:"CPU implementation for refract not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:(e,n,o)=>t`refract(${e}, ${n}, ${o})`,signature:(e,n,o)=>({argTypes:[e,n,S(e)?T:i],returnType:e})});var st=r({name:"reverseBits",signature:s,normalImpl:"CPU implementation for reverseBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`reverseBits(${e})`});function Me(e){if(typeof e=="number")return Math.round(e);throw new f("CPU implementation for round on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var ut=r({name:"round",signature:s,normalImpl:Me,codegenImpl:e=>t`round(${e})`});function Ee(e){if(typeof e=="number")return Math.max(0,Math.min(1,e));throw new f("CPU implementation for saturate on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var ct=r({name:"saturate",signature:s,normalImpl:Ee,codegenImpl:e=>t`saturate(${e})`});function Ge(e){return typeof e=="number"?Math.sign(e):a.sign[e.kind](e)}var it=r({name:"sign",signature:s,normalImpl:Ge,codegenImpl:e=>t`sign(${e})`});function Le(e){return typeof e=="number"?Math.sin(e):a.sin[e.kind](e)}var pt=r({name:"sin",signature:s,normalImpl:Le,codegenImpl:e=>t`sin(${e})`});function Ne(e){if(typeof e=="number")return Math.sinh(e);throw new f("CPU implementation for sinh on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var mt=r({name:"sinh",signature:s,normalImpl:Ne,codegenImpl:e=>t`sinh(${e})`});function Re(e,n,o){return typeof o=="number"?Q(e,n,o):a.smoothstep[o.kind](e,n,o)}var lt=r({name:"smoothstep",signature:(...e)=>({argTypes:e,returnType:e[2]}),normalImpl:Re,codegenImpl:(e,n,o)=>t`smoothstep(${e}, ${n}, ${o})`});function De(e){return typeof e=="number"?Math.sqrt(e):a.sqrt[e.kind](e)}var Tt=r({name:"sqrt",signature:s,normalImpl:De,codegenImpl:e=>t`sqrt(${e})`});function Oe(e,n){if(typeof e=="number")return e<=n?1:0;throw new f("CPU implementation for step on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var ft=r({name:"step",signature:(...e)=>{let n=l(e,[i,T,I])??e;return{argTypes:n,returnType:n[0]}},normalImpl:Oe,codegenImpl:(e,n)=>t`step(${e}, ${n})`});function qe(e){if(typeof e=="number")return Math.tan(e);throw new f("CPU implementation for tan on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues")}var dt=r({name:"tan",signature:s,normalImpl:qe,codegenImpl:e=>t`tan(${e})`});function _e(e){return typeof e=="number"?Math.tanh(e):a.tanh[e.kind](e)}var yt=r({name:"tanh",signature:s,normalImpl:_e,codegenImpl:e=>t`tanh(${e})`}),bt=r({name:"transpose",signature:s,normalImpl:"CPU implementation for transpose not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`transpose(${e})`});var gt=r({name:"trunc",signature:s,normalImpl:"CPU implementation for trunc not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues",codegenImpl:e=>t`trunc(${e})`});var Pt=r({name:"bitcastU32toF32",normalImpl:(e=>typeof e=="number"?K(e):a.bitcastU32toF32[e.kind](e)),codegenImpl:e=>t`bitcast<f32>(${e})`,signature:(...e)=>{let n=l(e,[c])??e;return{argTypes:n,returnType:L(n[0])?n[0].type==="vec2u"?y:n[0].type==="vec3u"?v:m:i}}}),Ut=r({name:"bitcastU32toI32",normalImpl:(e=>typeof e=="number"?j(e):a.bitcastU32toI32[e.kind](e)),codegenImpl:e=>t`bitcast<i32>(${e})`,signature:(...e)=>{let n=l(e,[c])??e;return{argTypes:n,returnType:L(n[0])?n[0].type==="vec2u"?A:n[0].type==="vec3u"?V:x:d}}});import*as b from"typed-binary";var Et=r({name:"unpack2x16float",normalImpl:e=>{let n=new ArrayBuffer(4);new b.BufferWriter(n).writeUint32(e);let u=new b.BufferReader(n);return y(u.readFloat16(),u.readFloat16())},signature:{argTypes:[c],returnType:y},codegenImpl:e=>t`unpack2x16float(${e})`}),Gt=r({name:"pack2x16float",normalImpl:e=>{let n=new ArrayBuffer(4),o=new b.BufferWriter(n);o.writeFloat16(e.x),o.writeFloat16(e.y);let u=new b.BufferReader(n);return c(u.readUint32())},signature:{argTypes:[y],returnType:c},codegenImpl:e=>t`pack2x16float(${e})`}),Lt=r({name:"unpack4x8unorm",normalImpl:e=>{let n=new ArrayBuffer(4);new b.BufferWriter(n).writeUint32(e);let u=new b.BufferReader(n);return m(u.readUint8()/255,u.readUint8()/255,u.readUint8()/255,u.readUint8()/255)},signature:{argTypes:[c],returnType:m},codegenImpl:e=>t`unpack4x8unorm(${e})`}),Nt=r({name:"pack4x8unorm",normalImpl:e=>{let n=new ArrayBuffer(4),o=new b.BufferWriter(n);o.writeUint8(e.x*255),o.writeUint8(e.y*255),o.writeUint8(e.z*255),o.writeUint8(e.w*255);let u=new b.BufferReader(n);return c(u.readUint32())},signature:{argTypes:[m],returnType:c},codegenImpl:e=>t`pack4x8unorm(${e})`});function F(e){return e.type.includes("2")?Z:e.type.includes("3")?W:H}var jt=r({name:"allEq",signature:(...e)=>({argTypes:e,returnType:P}),normalImpl:(e,n)=>O(B(e,n)),codegenImpl:(e,n)=>t`all(${e} == ${n})`}),B=(e,n)=>a.eq[e.kind](e,n),Yt=r({name:"eq",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:B,codegenImpl:(e,n)=>t`(${e} == ${n})`}),Jt=r({name:"ne",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:(e,n)=>g(B(e,n)),codegenImpl:(e,n)=>t`(${e} != ${n})`}),G=(e,n)=>a.lt[e.kind](e,n),Xt=r({name:"lt",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:G,codegenImpl:(e,n)=>t`(${e} < ${n})`}),er=r({name:"le",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:(e,n)=>D(G(e,n),B(e,n)),codegenImpl:(e,n)=>t`(${e} <= ${n})`}),nr=r({name:"gt",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:(e,n)=>ee(g(G(e,n)),g(B(e,n))),codegenImpl:(e,n)=>t`(${e} > ${n})`}),tr=r({name:"ge",signature:(...e)=>({argTypes:e,returnType:F(e[0])}),normalImpl:(e,n)=>g(G(e,n)),codegenImpl:(e,n)=>t`(${e} >= ${n})`}),g=e=>a.neg[e.kind](e),rr=r({name:"not",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:g,codegenImpl:e=>t`!(${e})`}),D=(e,n)=>a.or[e.kind](e,n),or=r({name:"or",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:D,codegenImpl:(e,n)=>t`(${e} | ${n})`}),ee=(e,n)=>g(D(g(e),g(n))),ar=r({name:"and",signature:(...e)=>({argTypes:e,returnType:e[0]}),normalImpl:ee,codegenImpl:(e,n)=>t`(${e} & ${n})`}),O=e=>a.all[e.kind](e),sr=r({name:"all",signature:(...e)=>({argTypes:e,returnType:P}),normalImpl:O,codegenImpl:e=>t`all(${e})`}),ur=r({name:"any",signature:(...e)=>({argTypes:e,returnType:P}),normalImpl:e=>!O(g(e)),codegenImpl:e=>t`any(${e})`}),cr=r({name:"isCloseTo",signature:(...e)=>({argTypes:e,returnType:P}),normalImpl:(e,n,o=.01)=>typeof e=="number"&&typeof n=="number"?Math.abs(e-n)<o:h(e)&&h(n)?a.isCloseToZero[e.kind](U[q].jsImpl(e,n),o):!1,codegenImpl:(e,n,o=z(.01,i,"constant"))=>$(e)&&$(n)?t`(abs(f32(${e}) - f32(${n})) <= ${o})`:!$(e)&&!$(n)?t`all(abs(${e} - ${n}) <= (${e} - ${e}) + ${o})`:"false"});function ze(e,n,o){return typeof o=="boolean"?o?n:e:a.select[e.kind](e,n,o)}var ir=r({name:"select",signature:(e,n,o)=>{let[u,w]=l([e,n])??[e,n];return{argTypes:[u,w,o],returnType:u}},normalImpl:ze,codegenImpl:(e,n,o)=>t`select(${e}, ${n}, ${o})`});var Ze={channelType:i,vectorType:m,sampleTypes:["depth","unfilterable-float"],texelSize:"non-copyable"},We={channelType:i,vectorType:m,sampleTypes:["depth","unfilterable-float"],texelSize:2},He={channelType:i,vectorType:m,sampleTypes:["depth","unfilterable-float"],texelSize:4},Qe={channelType:c,vectorType:R,sampleTypes:["uint"],texelSize:1},ne=new Map;function Ke(e){let n=ne.get(e);return n===void 0&&(n=je(e),ne.set(e,n)),n}function je(e){let n=Xe(e),o=Ye(e),u=e.includes("stencil");return{channelType:n,vectorType:n===c?R:n===d?x:m,texelSize:en(e),sampleTypes:nn(e),canRenderAttachment:Je(e),...o&&{depthAspect:o},...u&&{stencilAspect:Qe}}}function Ye(e){if(e==="depth16unorm")return We;if(e==="depth32float"||e==="depth32float-stencil8")return He;if(e==="depth24plus"||e==="depth24plus-stencil8")return Ze}function Je(e){return!(e.startsWith("bc")||e.startsWith("etc2")||e.startsWith("eac")||e.startsWith("astc")||e==="rgb9e5ufloat")}function Xe(e){return e==="stencil8"?c:e.includes("uint")?c:e.includes("sint")?d:i}function en(e){let[,n,o]=e.match(/^(rgba|bgra|rg|r)(8|16|32)/)??[];return n&&o?n.length*Number(o)/8:e==="stencil8"?1:e==="depth16unorm"?2:e==="depth32float"?4:e==="depth32float-stencil8"?5:e==="depth24plus"||e==="depth24plus-stencil8"?"non-copyable":/^(bc[14]-|etc2-rgb8|eac-r11)/.test(e)?8:/^(bc|astc-|etc2-rgba|eac-rg)/.test(e)?16:4}function nn(e){return e==="stencil8"?["uint"]:e.includes("uint")?["uint"]:e.includes("sint")?["sint"]:e.includes("depth")?["depth","unfilterable-float"]:/^(r|rg|rgba)16(u|s)norm$/.test(e)?["unfilterable-float"]:["float","unfilterable-float"]}var tn=new Set(["r32float","rg32float","rgba32float"]);function Tr(e,n){return tn.has(n)&&!e.features.has("float32-filterable")?["unfilterable-float"]:Ke(n).sampleTypes}var dr=["f16","clip_distances","dual_source_blending","subgroups","primitive_index"],yr={f16:"shader-f16",clip_distances:"clip-distances",dual_source_blending:"dual-source-blending",subgroups:"subgroups",primitive_index:"primitive-index"};export{Ke as a,Tr as b,fn as c,dn as d,yn as e,bn as f,gn as g,In as h,xn as i,hn as j,An as k,vn as l,Vn as m,Fn as n,wn as o,$n as p,Pn as q,Un as r,Bn as s,Sn as t,Cn as u,ye as v,kn as w,Mn as x,En as y,Gn as z,Ln as A,Nn as B,Rn as C,Dn as D,On as E,qn as F,_n as G,zn as H,Zn as I,Wn as J,Hn as K,Fe as L,Qn as M,Kn as N,jn as O,Yn as P,Jn as Q,Xn as R,et as S,nt as T,tt as U,rt as V,ot as W,at as X,st as Y,ut as Z,ct as _,it as $,pt as aa,mt as ba,lt as ca,Tt as da,ft as ea,dt as fa,yt as ga,bt as ha,gt as ia,Pt as ja,Ut as ka,Et as la,Gt as ma,Lt as na,Nt as oa,dr as pa,yr as qa,jt as ra,Yt as sa,Jt as ta,Xt as ua,er as va,nr as wa,tr as xa,rr as ya,or as za,ar as Aa,sr as Ba,ur as Ca,cr as Da,ir as Ea};
2
+ //# sourceMappingURL=chunk-5ABKYSJD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/std/numeric.ts","../src/std/bitcast.ts","../src/std/packing.ts","../src/std/boolean.ts","../src/core/texture/textureFormats.ts","../src/wgslExtensions.ts"],"sourcesContent":["import { dualImpl, MissingCpuImplError } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport type { AnyData } from '../data/dataTypes.ts';\nimport { smoothstepScalar } from '../data/numberOps.ts';\nimport {\n abstractFloat,\n abstractInt,\n f16,\n f32,\n i32,\n u32,\n} from '../data/numeric.ts';\nimport type { Snippet } from '../data/snippet.ts';\nimport { abstruct } from '../data/struct.ts';\nimport {\n vec2f,\n vec2h,\n vec2i,\n vec3f,\n vec3h,\n vec3i,\n vec4f,\n vec4h,\n vec4i,\n} from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport {\n type AnyFloat32VecInstance,\n type AnyFloatVecInstance,\n type AnyIntegerVecInstance,\n type AnyMatInstance,\n type AnyNumericVecInstance,\n type AnySignedVecInstance,\n type AnyWgslData,\n isHalfPrecisionSchema,\n isNumericSchema,\n isVecInstance,\n type v2f,\n type v2h,\n type v2i,\n type v3f,\n type v3h,\n type v3i,\n type v4f,\n type v4h,\n type v4i,\n type VecData,\n} from '../data/wgslTypes.ts';\nimport type { Infer } from '../shared/repr.ts';\nimport { unify } from '../tgsl/conversion.ts';\nimport { mul, sub } from './operators.ts';\n\ntype NumVec = AnyNumericVecInstance;\n\n// helpers\n\nconst unaryIdentitySignature = (arg: AnyData) => {\n return {\n argTypes: [arg],\n returnType: arg,\n };\n};\n\nconst variadicUnifySignature = (...args: AnyData[]) => {\n const uargs = unify(args) ?? args;\n return ({\n argTypes: uargs,\n returnType: uargs[0] as AnyData,\n });\n};\n\nfunction variadicReduce<T>(fn: (a: T, b: T) => T) {\n return (fst: T, ...rest: T[]): T => {\n let acc = fst;\n for (const r of rest) {\n acc = fn(acc, r);\n }\n return acc;\n };\n}\n\nfunction variadicStitch(wrapper: string) {\n return (fst: Snippet, ...rest: Snippet[]): string => {\n let acc = stitch`${fst}`;\n for (const r of rest) {\n acc = stitch`${wrapper}(${acc}, ${r})`;\n }\n return acc;\n };\n}\n\n// std\n\nfunction cpuAbs(value: number): number;\nfunction cpuAbs<T extends NumVec | number>(value: T): T;\nfunction cpuAbs<T extends NumVec | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.abs(value) as T;\n }\n return VectorOps.abs[value.kind](value) as T;\n}\n\nexport const abs = dualImpl({\n name: 'abs',\n signature: unaryIdentitySignature,\n normalImpl: cpuAbs,\n codegenImpl: (value) => stitch`abs(${value})`,\n});\n\nfunction cpuAcos(value: number): number;\nfunction cpuAcos<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAcos<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.acos(value) as T;\n }\n return VectorOps.acos[value.kind](value) as T;\n}\n\nexport const acos = dualImpl({\n name: 'acos',\n signature: unaryIdentitySignature,\n normalImpl: cpuAcos,\n codegenImpl: (value) => stitch`acos(${value})`,\n});\n\nfunction cpuAcosh(value: number): number;\nfunction cpuAcosh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAcosh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.acosh(value) as T;\n }\n return VectorOps.acosh[value.kind](value) as T;\n}\n\nexport const acosh = dualImpl({\n name: 'acosh',\n signature: unaryIdentitySignature,\n normalImpl: cpuAcosh,\n codegenImpl: (value) => stitch`acosh(${value})`,\n});\n\nfunction cpuAsin(value: number): number;\nfunction cpuAsin<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAsin<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.asin(value) as T;\n }\n return VectorOps.asin[value.kind](value) as T;\n}\n\nexport const asin = dualImpl({\n name: 'asin',\n signature: unaryIdentitySignature,\n normalImpl: cpuAsin,\n codegenImpl: (value) => stitch`asin(${value})`,\n});\n\nfunction cpuAsinh(value: number): number;\nfunction cpuAsinh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAsinh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.asinh(value) as T;\n }\n return VectorOps.asinh[value.kind](value) as T;\n}\n\nexport const asinh = dualImpl({\n name: 'asinh',\n signature: unaryIdentitySignature,\n normalImpl: cpuAsinh,\n codegenImpl: (value) => stitch`asinh(${value})`,\n});\n\nfunction cpuAtan(value: number): number;\nfunction cpuAtan<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAtan<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.atan(value) as T;\n }\n return VectorOps.atan[value.kind](value) as T;\n}\n\nexport const atan = dualImpl({\n name: 'atan',\n signature: unaryIdentitySignature,\n normalImpl: cpuAtan,\n codegenImpl: (value) => stitch`atan(${value})`,\n});\n\nfunction cpuAtanh(value: number): number;\nfunction cpuAtanh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuAtanh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.atanh(value) as T;\n }\n return VectorOps.atanh[value.kind](value) as T;\n}\n\nexport const atanh = dualImpl({\n name: 'atanh',\n signature: unaryIdentitySignature,\n normalImpl: cpuAtanh,\n codegenImpl: (value) => stitch`atanh(${value})`,\n});\n\nfunction cpuAtan2(y: number, x: number): number;\nfunction cpuAtan2<T extends AnyFloatVecInstance>(y: T, x: T): T;\nfunction cpuAtan2<T extends AnyFloatVecInstance | number>(y: T, x: T): T {\n if (typeof y === 'number' && typeof x === 'number') {\n return Math.atan2(y, x) as T;\n }\n return VectorOps.atan2[(y as AnyFloatVecInstance).kind](\n y as never,\n x as never,\n ) as T;\n}\n\nexport const atan2 = dualImpl({\n name: 'atan2',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return ({\n argTypes: uargs,\n returnType: uargs[0],\n });\n },\n normalImpl: cpuAtan2,\n codegenImpl: (y, x) => stitch`atan2(${y}, ${x})`,\n});\n\nfunction cpuCeil(value: number): number;\nfunction cpuCeil<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCeil<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.ceil(value) as T;\n }\n return VectorOps.ceil[value.kind](value) as T;\n}\n\nexport const ceil = dualImpl({\n name: 'ceil',\n signature: unaryIdentitySignature,\n normalImpl: cpuCeil,\n codegenImpl: (value) => stitch`ceil(${value})`,\n});\n\nfunction cpuClamp(value: number, low: number, high: number): number;\nfunction cpuClamp<T extends NumVec | number>(value: T, low: T, high: T): T;\nfunction cpuClamp<T extends NumVec | number>(value: T, low: T, high: T): T {\n if (typeof value === 'number') {\n return Math.min(Math.max(low as number, value), high as number) as T;\n }\n return VectorOps.clamp[value.kind](\n value,\n low as NumVec,\n high as NumVec,\n ) as T;\n}\n\nexport const clamp = dualImpl({\n name: 'clamp',\n signature: variadicUnifySignature,\n normalImpl: cpuClamp,\n codegenImpl: (value, low, high) => stitch`clamp(${value}, ${low}, ${high})`,\n});\n\nfunction cpuCos(value: number): number;\nfunction cpuCos<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCos<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.cos(value) as T;\n }\n return VectorOps.cos[value.kind](value) as T;\n}\n\nexport const cos = dualImpl({\n name: 'cos',\n signature: unaryIdentitySignature,\n normalImpl: cpuCos,\n codegenImpl: (value) => stitch`cos(${value})`,\n});\n\nfunction cpuCosh(value: number): number;\nfunction cpuCosh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuCosh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.cosh(value) as T;\n }\n return VectorOps.cosh[value.kind](value) as T;\n}\n\nexport const cosh = dualImpl({\n name: 'cosh',\n signature: unaryIdentitySignature,\n normalImpl: cpuCosh,\n codegenImpl: (value) => stitch`cosh(${value})`,\n});\n\nfunction cpuCountLeadingZeros(value: number): number;\nfunction cpuCountLeadingZeros<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountLeadingZeros<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countLeadingZeros = dualImpl<typeof cpuCountLeadingZeros>({\n name: 'countLeadingZeros',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for countLeadingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countLeadingZeros(${value})`,\n});\n\nfunction cpuCountOneBits(value: number): number;\nfunction cpuCountOneBits<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountOneBits<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countOneBits = dualImpl<typeof cpuCountOneBits>({\n name: 'countOneBits',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for countOneBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countOneBits(${value})`,\n});\n\nfunction cpuCountTrailingZeros(value: number): number;\nfunction cpuCountTrailingZeros<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuCountTrailingZeros<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const countTrailingZeros = dualImpl<typeof cpuCountTrailingZeros>({\n name: 'countTrailingZeros',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for countTrailingZeros not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`countTrailingZeros(${value})`,\n});\n\nexport const cross = dualImpl({\n name: 'cross',\n signature: (...args) => {\n return ({ argTypes: args, returnType: args[0] });\n },\n normalImpl: <T extends v3f | v3h>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n codegenImpl: (a, b) => stitch`cross(${a}, ${b})`,\n});\n\nfunction cpuDegrees(value: number): number;\nfunction cpuDegrees<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuDegrees<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return ((value * 180) / Math.PI) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for degrees on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const degrees = dualImpl<typeof cpuDegrees>({\n name: 'degrees',\n signature: unaryIdentitySignature,\n normalImpl: cpuDegrees,\n codegenImpl: (value) => stitch`degrees(${value})`,\n});\n\nexport const determinant = dualImpl<(value: AnyMatInstance) => number>({\n name: 'determinant',\n // TODO: The return type is potentially wrong here, it should return whatever the matrix element type is.\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for determinant not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`determinant(${value})`,\n});\n\nfunction cpuDistance(a: number, b: number): number;\nfunction cpuDistance<T extends AnyFloatVecInstance>(a: T, b: T): number;\nfunction cpuDistance<T extends AnyFloatVecInstance | number>(\n a: T,\n b: T,\n): number {\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b);\n }\n return length(\n sub(a as AnyFloatVecInstance, b as AnyFloatVecInstance),\n ) as number;\n}\n\nexport const distance = dualImpl({\n name: 'distance',\n signature: (...args) => {\n return ({\n argTypes: args,\n returnType: isHalfPrecisionSchema(args[0]) ? f16 : f32,\n });\n },\n normalImpl: cpuDistance,\n codegenImpl: (a, b) => stitch`distance(${a}, ${b})`,\n});\n\nexport const dot = dualImpl({\n name: 'dot',\n signature: (...args) => ({\n argTypes: args,\n returnType: (args[0] as VecData).primitive,\n }),\n normalImpl: <T extends NumVec>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n codegenImpl: (lhs, rhs) => stitch`dot(${lhs}, ${rhs})`,\n});\n\nexport const dot4U8Packed = dualImpl<(e1: number, e2: number) => number>({\n name: 'dot4U8Packed',\n signature: { argTypes: [u32, u32], returnType: u32 },\n normalImpl:\n 'CPU implementation for dot4U8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`dot4U8Packed(${e1}, ${e2})`,\n});\n\nexport const dot4I8Packed = dualImpl<(e1: number, e2: number) => number>({\n name: 'dot4I8Packed',\n signature: { argTypes: [u32, u32], returnType: i32 },\n normalImpl:\n 'CPU implementation for dot4I8Packed not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`dot4I8Packed(${e1}, ${e2})`,\n});\n\nfunction cpuExp(value: number): number;\nfunction cpuExp<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuExp<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.exp(value) as T;\n }\n return VectorOps.exp[value.kind](value) as T;\n}\n\nexport const exp = dualImpl({\n name: 'exp',\n signature: unaryIdentitySignature,\n normalImpl: cpuExp,\n codegenImpl: (value) => stitch`exp(${value})`,\n});\n\nfunction cpuExp2(value: number): number;\nfunction cpuExp2<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuExp2<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (2 ** value) as T;\n }\n return VectorOps.exp2[value.kind](value) as T;\n}\n\nexport const exp2 = dualImpl({\n name: 'exp2',\n signature: unaryIdentitySignature,\n normalImpl: cpuExp2,\n codegenImpl: (value) => stitch`exp2(${value})`,\n});\n\nfunction cpuExtractBits(e: number, offset: number, count: number): number;\nfunction cpuExtractBits<T extends AnyIntegerVecInstance>(\n e: T,\n offset: number,\n count: number,\n): T;\nfunction cpuExtractBits<T extends AnyIntegerVecInstance | number>(\n e: T,\n offset: number,\n count: number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const extractBits = dualImpl<typeof cpuExtractBits>({\n name: 'extractBits',\n signature: (arg, _offset, _count) => ({\n argTypes: [arg, u32, u32],\n returnType: arg,\n }),\n normalImpl:\n 'CPU implementation for extractBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e, offset, count) =>\n stitch`extractBits(${e}, ${offset}, ${count})`,\n});\n\nexport const faceForward = dualImpl<\n <T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T) => T\n>({\n name: 'faceForward',\n signature: (...args) => {\n return ({\n argTypes: args,\n returnType: args[0],\n });\n },\n normalImpl:\n 'CPU implementation for faceForward not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2, e3) => stitch`faceForward(${e1}, ${e2}, ${e3})`,\n});\n\nfunction cpuFirstLeadingBit(value: number): number;\nfunction cpuFirstLeadingBit<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuFirstLeadingBit<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const firstLeadingBit = dualImpl<typeof cpuFirstLeadingBit>({\n name: 'firstLeadingBit',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for firstLeadingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`firstLeadingBit(${value})`,\n});\n\nfunction cpuFirstTrailingBit(value: number): number;\nfunction cpuFirstTrailingBit<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuFirstTrailingBit<T extends AnyIntegerVecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const firstTrailingBit = dualImpl<typeof cpuFirstTrailingBit>({\n name: 'firstTrailingBit',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for firstTrailingBit not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`firstTrailingBit(${value})`,\n});\n\nfunction cpuFloor(value: number): number;\nfunction cpuFloor<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuFloor<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.floor(value) as T;\n }\n return VectorOps.floor[value.kind](value) as T;\n}\n\nexport const floor = dualImpl({\n name: 'floor',\n signature: unaryIdentitySignature,\n normalImpl: cpuFloor,\n codegenImpl: (arg) => stitch`floor(${arg})`,\n});\n\nfunction cpuFma(e1: number, e2: number, e3: number): number;\nfunction cpuFma<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T): T;\nfunction cpuFma<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: T,\n e3: T,\n): T {\n if (typeof e1 === 'number') {\n return (e1 * (e2 as number) + (e3 as number)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for fma on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const fma = dualImpl({\n name: 'fma',\n signature: (...args) => ({\n argTypes: args,\n returnType: args[0],\n }),\n normalImpl: cpuFma,\n codegenImpl: (e1, e2, e3) => stitch`fma(${e1}, ${e2}, ${e3})`,\n});\n\nfunction cpuFract(value: number): number;\nfunction cpuFract<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuFract<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (value - Math.floor(value)) as T;\n }\n return VectorOps.fract[value.kind](value) as T;\n}\n\nexport const fract = dualImpl({\n name: 'fract',\n signature: unaryIdentitySignature,\n normalImpl: cpuFract,\n codegenImpl: (a) => stitch`fract(${a})`,\n});\n\nconst FrexpResults = {\n f32: abstruct({ fract: f32, exp: i32 }),\n f16: abstruct({ fract: f16, exp: i32 }),\n abstractFloat: abstruct({ fract: abstractFloat, exp: abstractInt }),\n vec2f: abstruct({ fract: vec2f, exp: vec2i }),\n vec3f: abstruct({ fract: vec3f, exp: vec3i }),\n vec4f: abstruct({ fract: vec4f, exp: vec4i }),\n vec2h: abstruct({ fract: vec2h, exp: vec2i }),\n vec3h: abstruct({ fract: vec3h, exp: vec3i }),\n vec4h: abstruct({ fract: vec4h, exp: vec4i }),\n} as const;\n\ntype FrexpOverload = {\n (value: number): Infer<typeof FrexpResults['f32']>;\n <T extends AnyFloatVecInstance>(\n value: T,\n ): Infer<typeof FrexpResults[T['kind']]>;\n};\n\nexport const frexp = dualImpl<FrexpOverload>({\n name: 'frexp',\n normalImpl:\n 'CPU implementation for frexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n signature: (value) => {\n const returnType = FrexpResults[value.type as keyof typeof FrexpResults];\n\n if (!returnType) {\n throw new Error(\n `Unsupported data type for frexp: ${value.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`,\n );\n }\n\n return { argTypes: [value], returnType };\n },\n codegenImpl: (value) => stitch`frexp(${value})`,\n});\n\nfunction cpuInsertBits(\n e: number,\n newbits: number,\n offset: number,\n count: number,\n): number;\nfunction cpuInsertBits<T extends AnyIntegerVecInstance>(\n e: T,\n newbits: T,\n offset: number,\n count: number,\n): T;\nfunction cpuInsertBits<T extends AnyIntegerVecInstance | number>(\n e: T,\n newbits: T,\n offset: number,\n count: number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const insertBits = dualImpl<typeof cpuInsertBits>({\n name: 'insertBits',\n signature: (e, newbits, _offset, _count) => ({\n argTypes: [e, newbits, u32, u32],\n returnType: e,\n }),\n normalImpl:\n 'CPU implementation for insertBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e, newbits, offset, count) =>\n stitch`insertBits(${e}, ${newbits}, ${offset}, ${count})`,\n});\n\nfunction cpuInverseSqrt(value: number): number;\nfunction cpuInverseSqrt<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuInverseSqrt<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return (1 / Math.sqrt(value)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for inverseSqrt on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const inverseSqrt = dualImpl({\n name: 'inverseSqrt',\n signature: unaryIdentitySignature,\n normalImpl: cpuInverseSqrt,\n codegenImpl: (value) => stitch`inverseSqrt(${value})`,\n});\n\nfunction cpuLdexp(e1: number, e2: number): number;\nfunction cpuLdexp<T extends v2f | v2h>(e1: T, e2: v2i): T;\nfunction cpuLdexp<T extends v3f | v3h>(e1: T, e2: v3i): T;\nfunction cpuLdexp<T extends v4f | v4h>(e1: T, e2: v4i): T;\nfunction cpuLdexp<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: AnyIntegerVecInstance | number,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const ldexp = dualImpl<typeof cpuLdexp>({\n name: 'ldexp',\n signature: (e1, _e2) => {\n switch (e1.type) {\n case 'abstractFloat':\n return { argTypes: [e1, abstractInt], returnType: e1 };\n case 'f32':\n case 'f16':\n return { argTypes: [e1, i32], returnType: e1 };\n case 'vec2f':\n case 'vec2h':\n return { argTypes: [e1, vec2i], returnType: e1 };\n case 'vec3f':\n case 'vec3h':\n return { argTypes: [e1, vec3i], returnType: e1 };\n case 'vec4f':\n case 'vec4h':\n return { argTypes: [e1, vec4i], returnType: e1 };\n default:\n throw new Error(\n `Unsupported data type for ldexp: ${e1.type}. Supported types are abstractFloat, f32, f16, vec2f, vec2h, vec3f, vec3h, vec4f, vec4h.`,\n );\n }\n },\n normalImpl:\n 'CPU implementation for ldexp not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2) => stitch`ldexp(${e1}, ${e2})`,\n});\n\nfunction cpuLength(value: number): number;\nfunction cpuLength<T extends AnyFloatVecInstance>(value: T): number;\nfunction cpuLength<T extends AnyFloatVecInstance | number>(value: T): number {\n if (typeof value === 'number') {\n return Math.abs(value);\n }\n return VectorOps.length[value.kind](value);\n}\n\nexport const length = dualImpl({\n name: 'length',\n signature: (arg) => ({\n argTypes: [arg],\n returnType: isHalfPrecisionSchema(arg) ? f16 : f32,\n }),\n normalImpl: cpuLength,\n codegenImpl: (arg) => stitch`length(${arg})`,\n});\n\nfunction cpuLog(value: number): number;\nfunction cpuLog<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuLog<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.log(value) as T;\n }\n return VectorOps.log[value.kind](value) as T;\n}\n\nexport const log = dualImpl({\n name: 'log',\n signature: unaryIdentitySignature,\n normalImpl: cpuLog,\n codegenImpl: (value) => stitch`log(${value})`,\n});\n\nfunction cpuLog2(value: number): number;\nfunction cpuLog2<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuLog2<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.log2(value) as T;\n }\n return VectorOps.log2[value.kind](value) as T;\n}\n\nexport const log2 = dualImpl({\n name: 'log2',\n signature: unaryIdentitySignature,\n normalImpl: cpuLog2,\n codegenImpl: (value) => stitch`log2(${value})`,\n});\n\nfunction cpuMax(a: number, b: number): number;\nfunction cpuMax<T extends NumVec>(a: T, b: T): T;\nfunction cpuMax<T extends NumVec | number>(a: T, b: T): T {\n if (typeof a === 'number') {\n return Math.max(a, b as number) as T;\n }\n return VectorOps.max[a.kind](a, b as NumVec) as T;\n}\n\ntype VariadicOverload = {\n (fst: number, ...rest: number[]): number;\n <T extends NumVec>(fst: T, ...rest: T[]): T;\n};\n\nexport const max = dualImpl({\n name: 'max',\n signature: variadicUnifySignature,\n normalImpl: variadicReduce(cpuMax) as VariadicOverload,\n codegenImpl: variadicStitch('max'),\n});\n\nfunction cpuMin(a: number, b: number): number;\nfunction cpuMin<T extends NumVec>(a: T, b: T): T;\nfunction cpuMin<T extends NumVec | number>(a: T, b: T): T {\n if (typeof a === 'number') {\n return Math.min(a, b as number) as T;\n }\n return VectorOps.min[a.kind](a, b as NumVec) as T;\n}\n\nexport const min = dualImpl({\n name: 'min',\n signature: variadicUnifySignature,\n normalImpl: variadicReduce(cpuMin) as VariadicOverload,\n codegenImpl: variadicStitch('min'),\n});\n\nfunction cpuMix(e1: number, e2: number, e3: number): number;\nfunction cpuMix<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: number): T;\nfunction cpuMix<T extends AnyFloatVecInstance>(e1: T, e2: T, e3: T): T;\nfunction cpuMix<T extends AnyFloatVecInstance | number>(\n e1: T,\n e2: T,\n e3: T,\n): T {\n if (typeof e1 === 'number') {\n if (typeof e3 !== 'number' || typeof e2 !== 'number') {\n throw new Error(\n 'When e1 and e2 are numbers, the blend factor must be a number.',\n );\n }\n return (e1 * (1 - e3) + e2 * e3) as T;\n }\n\n if (typeof e1 === 'number' || typeof e2 === 'number') {\n throw new Error('e1 and e2 need to both be vectors of the same kind.');\n }\n\n return VectorOps.mix[e1.kind](e1, e2, e3) as T;\n}\n\nexport const mix = dualImpl({\n name: 'mix',\n signature: variadicUnifySignature,\n normalImpl: cpuMix,\n codegenImpl: (e1, e2, e3) => stitch`mix(${e1}, ${e2}, ${e3})`,\n});\n\nconst ModfResult = {\n f32: abstruct({ fract: f32, whole: f32 }),\n f16: abstruct({ fract: f16, whole: f16 }),\n abstractFloat: abstruct({ fract: abstractFloat, whole: abstractFloat }),\n vec2f: abstruct({ fract: vec2f, whole: vec2f }),\n vec3f: abstruct({ fract: vec3f, whole: vec3f }),\n vec4f: abstruct({ fract: vec4f, whole: vec4f }),\n vec2h: abstruct({ fract: vec2h, whole: vec2h }),\n vec3h: abstruct({ fract: vec3h, whole: vec3h }),\n vec4h: abstruct({ fract: vec4h, whole: vec4h }),\n} as const;\n\ntype ModfOverload = {\n (value: number): Infer<typeof ModfResult['f32']>;\n <T extends AnyFloatVecInstance>(\n value: T,\n ): Infer<typeof ModfResult[T['kind']]>;\n};\nfunction cpuModf(e: number): Infer<typeof ModfResult['f32']>;\nfunction cpuModf<T extends AnyFloatVecInstance>(\n e: T,\n): Infer<typeof ModfResult[T['kind']]>;\nfunction cpuModf<T extends AnyFloatVecInstance | number>(\n value: T,\n): Infer<typeof ModfResult[keyof typeof ModfResult]> {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const modf: ModfOverload = dualImpl<typeof cpuModf>({\n name: 'modf',\n signature: (e) => {\n const returnType = ModfResult[e.type as keyof typeof ModfResult];\n\n if (!returnType) {\n throw new Error(\n `Unsupported data type for modf: ${e.type}. Supported types are f32, f16, abstractFloat, vec2f, vec3f, vec4f, vec2h, vec3h, vec4h.`,\n );\n }\n\n return { argTypes: [e], returnType };\n },\n normalImpl:\n 'CPU implementation for modf not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`modf(${value})`,\n});\n\nexport const normalize = dualImpl({\n name: 'normalize',\n signature: unaryIdentitySignature,\n normalImpl: <T extends AnyFloatVecInstance>(v: T): T =>\n VectorOps.normalize[v.kind](v),\n codegenImpl: (v) => stitch`normalize(${v})`,\n});\n\nfunction powCpu(base: number, exponent: number): number;\nfunction powCpu<T extends AnyFloatVecInstance>(\n base: T,\n exponent: T,\n): T;\nfunction powCpu<T extends AnyFloatVecInstance | number>(\n base: T,\n exponent: T,\n): T {\n if (typeof base === 'number' && typeof exponent === 'number') {\n return (base ** exponent) as T;\n }\n if (isVecInstance(base) && isVecInstance(exponent)) {\n return VectorOps.pow[base.kind](base, exponent) as T;\n }\n throw new Error('Invalid arguments to pow()');\n}\n\nexport const pow = dualImpl({\n name: 'pow',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return {\n argTypes: uargs,\n returnType: isNumericSchema(uargs[0]) ? uargs[1] : uargs[0],\n };\n },\n normalImpl: powCpu,\n codegenImpl: (lhs, rhs) => stitch`pow(${lhs}, ${rhs})`,\n});\nfunction cpuQuantizeToF16(value: number): number;\nfunction cpuQuantizeToF16<T extends AnyFloat32VecInstance>(value: T): T;\nfunction cpuQuantizeToF16<T extends AnyFloat32VecInstance | number>(\n value: T,\n): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const quantizeToF16 = dualImpl<typeof cpuQuantizeToF16>({\n name: 'quantizeToF16',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for quantizeToF16 not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`quantizeToF16(${value})`,\n});\n\nfunction cpuRadians(value: number): number;\nfunction cpuRadians<T extends AnyFloatVecInstance | number>(value: T): T;\nfunction cpuRadians<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return ((value * Math.PI) / 180) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for radians on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const radians = dualImpl({\n name: 'radians',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return ({ argTypes: uargs, returnType: uargs[0] });\n },\n normalImpl: cpuRadians,\n codegenImpl: (value) => stitch`radians(${value})`,\n});\n\nexport const reflect = dualImpl({\n name: 'reflect',\n signature: (...args) => ({ argTypes: args, returnType: args[0] }),\n normalImpl: <T extends AnyFloatVecInstance>(e1: T, e2: T): T =>\n sub(e1, mul(2 * dot(e2, e1), e2)),\n codegenImpl: (e1, e2) => stitch`reflect(${e1}, ${e2})`,\n});\n\nexport const refract = dualImpl<\n <T extends AnyFloatVecInstance>(e1: T, e2: T, e3: number) => T\n>({\n name: 'refract',\n normalImpl:\n 'CPU implementation for refract not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e1, e2, e3) => stitch`refract(${e1}, ${e2}, ${e3})`,\n signature: (e1, e2, _e3) => ({\n argTypes: [\n e1 as AnyWgslData,\n e2 as AnyWgslData,\n isHalfPrecisionSchema(e1) ? f16 : f32,\n ],\n returnType: e1,\n }),\n});\nfunction cpuReverseBits(value: number): number;\nfunction cpuReverseBits<T extends AnyIntegerVecInstance>(value: T): T;\nfunction cpuReverseBits<T extends AnyIntegerVecInstance | number>(value: T): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const reverseBits = dualImpl<typeof cpuReverseBits>({\n name: 'reverseBits',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for reverseBits not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`reverseBits(${value})`,\n});\n\nfunction cpuRound(value: number): number;\nfunction cpuRound<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuRound<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.round(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for round on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const round = dualImpl({\n name: 'round',\n signature: unaryIdentitySignature,\n normalImpl: cpuRound,\n codegenImpl: (value) => stitch`round(${value})`,\n});\n\nfunction cpuSaturate(value: number): number;\nfunction cpuSaturate<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSaturate<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.max(0, Math.min(1, value)) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for saturate on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const saturate = dualImpl({\n name: 'saturate',\n signature: unaryIdentitySignature,\n normalImpl: cpuSaturate,\n codegenImpl: (value) => stitch`saturate(${value})`,\n});\n\nfunction cpuSign(e: number): number;\nfunction cpuSign<T extends AnySignedVecInstance>(e: T): T;\nfunction cpuSign<T extends AnySignedVecInstance | number>(e: T): T {\n if (typeof e === 'number') {\n return Math.sign(e) as T;\n }\n return VectorOps.sign[e.kind](e) as T;\n}\n\nexport const sign = dualImpl({\n name: 'sign',\n signature: unaryIdentitySignature,\n normalImpl: cpuSign,\n codegenImpl: (e) => stitch`sign(${e})`,\n});\n\nfunction cpuSin(value: number): number;\nfunction cpuSin<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSin<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sin(value) as T;\n }\n return VectorOps.sin[value.kind](value) as T;\n}\n\nexport const sin = dualImpl({\n name: 'sin',\n signature: unaryIdentitySignature,\n normalImpl: cpuSin,\n codegenImpl: (value) => stitch`sin(${value})`,\n});\n\nfunction cpuSinh(value: number): number;\nfunction cpuSinh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSinh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sinh(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for sinh on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const sinh = dualImpl({\n name: 'sinh',\n signature: unaryIdentitySignature,\n normalImpl: cpuSinh,\n codegenImpl: (value) => stitch`sinh(${value})`,\n});\n\nfunction cpuSmoothstep(edge0: number, edge1: number, x: number): number;\nfunction cpuSmoothstep<T extends AnyFloatVecInstance>(\n edge0: T,\n edge1: T,\n x: T,\n): T;\nfunction cpuSmoothstep<T extends AnyFloatVecInstance | number>(\n edge0: T,\n edge1: T,\n x: T,\n): T {\n if (typeof x === 'number') {\n return smoothstepScalar(\n edge0 as number,\n edge1 as number,\n x as number,\n ) as T;\n }\n return VectorOps.smoothstep[x.kind](\n edge0 as AnyFloatVecInstance,\n edge1 as AnyFloatVecInstance,\n x as AnyFloatVecInstance,\n ) as T;\n}\n\nexport const smoothstep = dualImpl({\n name: 'smoothstep',\n signature: (...args) => ({\n argTypes: args,\n returnType: args[2],\n }),\n normalImpl: cpuSmoothstep,\n codegenImpl: (edge0, edge1, x) =>\n stitch`smoothstep(${edge0}, ${edge1}, ${x})`,\n});\n\nfunction cpuSqrt(value: number): number;\nfunction cpuSqrt<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuSqrt<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.sqrt(value) as T;\n }\n return VectorOps.sqrt[value.kind](value) as T;\n}\n\nexport const sqrt = dualImpl({\n name: 'sqrt',\n signature: unaryIdentitySignature,\n normalImpl: cpuSqrt,\n codegenImpl: (value) => stitch`sqrt(${value})`,\n});\n\nfunction cpuStep(edge: number, x: number): number;\nfunction cpuStep<T extends AnyFloatVecInstance | number>(edge: T, x: T): T;\nfunction cpuStep<T extends AnyFloatVecInstance | number>(edge: T, x: T): T {\n if (typeof edge === 'number') {\n return (edge <= (x as number) ? 1.0 : 0.0) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for step on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const step = dualImpl({\n name: 'step',\n signature: (...args) => {\n const uargs = unify(args, [f32, f16, abstractFloat]) ?? args;\n return { argTypes: uargs, returnType: uargs[0] };\n },\n normalImpl: cpuStep,\n codegenImpl: (edge, x) => stitch`step(${edge}, ${x})`,\n});\n\nfunction cpuTan(value: number): number;\nfunction cpuTan<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTan<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.tan(value) as T;\n }\n throw new MissingCpuImplError(\n 'CPU implementation for tan on vectors not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n );\n}\n\nexport const tan = dualImpl({\n name: 'tan',\n signature: unaryIdentitySignature,\n normalImpl: cpuTan,\n codegenImpl: (value) => stitch`tan(${value})`,\n});\n\nfunction cpuTanh(value: number): number;\nfunction cpuTanh<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTanh<T extends AnyFloatVecInstance | number>(value: T): T {\n if (typeof value === 'number') {\n return Math.tanh(value) as T;\n }\n return VectorOps.tanh[value.kind](value) as T;\n}\n\nexport const tanh = dualImpl({\n name: 'tanh',\n signature: unaryIdentitySignature,\n normalImpl: cpuTanh,\n codegenImpl: (value) => stitch`tanh(${value})`,\n});\n\nexport const transpose = dualImpl<<T extends AnyMatInstance>(e: T) => T>({\n name: 'transpose',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for transpose not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (e) => stitch`transpose(${e})`,\n});\n\nfunction cpuTrunc(value: number): number;\nfunction cpuTrunc<T extends AnyFloatVecInstance>(value: T): T;\nfunction cpuTrunc<T extends AnyFloatVecInstance | number>(value: T): T {\n throw new Error('Unreachable code. The function is only used for the type.');\n}\n\nexport const trunc = dualImpl<typeof cpuTrunc>({\n name: 'trunc',\n signature: unaryIdentitySignature,\n normalImpl:\n 'CPU implementation for trunc not implemented yet. Please submit an issue at https://github.com/software-mansion/TypeGPU/issues',\n codegenImpl: (value) => stitch`trunc(${value})`,\n});\n","import { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { bitcastU32toF32Impl, bitcastU32toI32Impl } from '../data/numberOps.ts';\nimport { f32, i32, u32 } from '../data/numeric.ts';\nimport { isVec } from '../data/wgslTypes.ts';\nimport { vec2f, vec2i, vec3f, vec3i, vec4f, vec4i } from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport type {\n v2f,\n v2i,\n v2u,\n v3f,\n v3i,\n v3u,\n v4f,\n v4i,\n v4u,\n} from '../data/wgslTypes.ts';\nimport { unify } from '../tgsl/conversion.ts';\n\nexport type BitcastU32toF32Overload =\n & ((value: number) => number)\n & ((value: v2u) => v2f)\n & ((value: v3u) => v3f)\n & ((value: v4u) => v4f);\n\nexport const bitcastU32toF32 = dualImpl({\n name: 'bitcastU32toF32',\n normalImpl: ((value) => {\n if (typeof value === 'number') {\n return bitcastU32toF32Impl(value);\n }\n return VectorOps.bitcastU32toF32[value.kind](value);\n }) as BitcastU32toF32Overload,\n codegenImpl: (n) => stitch`bitcast<f32>(${n})`,\n signature: (...arg) => {\n const uargs = unify(arg, [u32]) ?? arg;\n return {\n argTypes: uargs,\n returnType: isVec(uargs[0])\n ? uargs[0].type === 'vec2u'\n ? vec2f\n : uargs[0].type === 'vec3u'\n ? vec3f\n : vec4f\n : f32,\n };\n },\n});\n\nexport type BitcastU32toI32Overload =\n & ((value: number) => number)\n & ((value: v2u) => v2i)\n & ((value: v3u) => v3i)\n & ((value: v4u) => v4i);\n\nexport const bitcastU32toI32 = dualImpl({\n name: 'bitcastU32toI32',\n normalImpl: ((value) => {\n if (typeof value === 'number') {\n return bitcastU32toI32Impl(value);\n }\n return VectorOps.bitcastU32toI32[value.kind](value);\n }) as BitcastU32toI32Overload,\n codegenImpl: (n) => stitch`bitcast<i32>(${n})`,\n signature: (...arg) => {\n const uargs = unify(arg, [u32]) ?? arg;\n return {\n argTypes: uargs,\n returnType: isVec(uargs[0])\n ? uargs[0].type === 'vec2u'\n ? vec2i\n : uargs[0].type === 'vec3u'\n ? vec3i\n : vec4i\n : i32,\n };\n },\n});\n","import * as TB from 'typed-binary';\nimport { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { u32 } from '../data/numeric.ts';\nimport { vec2f, vec4f } from '../data/vector.ts';\nimport type { v2f, v4f } from '../data/wgslTypes.ts';\n\n/**\n * @privateRemarks\n * https://gpuweb.github.io/gpuweb/wgsl/#unpack2x16float-builtin\n */\nexport const unpack2x16float = dualImpl({\n name: 'unpack2x16float',\n normalImpl: (e: number): v2f => {\n const buffer = new ArrayBuffer(4);\n const writer = new TB.BufferWriter(buffer);\n writer.writeUint32(e);\n const reader = new TB.BufferReader(buffer);\n return vec2f(reader.readFloat16(), reader.readFloat16());\n },\n signature: { argTypes: [u32], returnType: vec2f },\n codegenImpl: (e) => stitch`unpack2x16float(${e})`,\n});\n\n/**\n * @privateRemarks\n * https://gpuweb.github.io/gpuweb/wgsl/#pack2x16float-builtin\n */\nexport const pack2x16float = dualImpl({\n name: 'pack2x16float',\n normalImpl: (e: v2f): number => {\n const buffer = new ArrayBuffer(4);\n const writer = new TB.BufferWriter(buffer);\n writer.writeFloat16(e.x);\n writer.writeFloat16(e.y);\n const reader = new TB.BufferReader(buffer);\n return u32(reader.readUint32());\n },\n signature: { argTypes: [vec2f], returnType: u32 },\n codegenImpl: (e) => stitch`pack2x16float(${e})`,\n});\n\n/**\n * @privateRemarks\n * https://gpuweb.github.io/gpuweb/wgsl/#unpack4x8unorm-builtin\n */\nexport const unpack4x8unorm = dualImpl({\n name: 'unpack4x8unorm',\n normalImpl: (e: number): v4f => {\n const buffer = new ArrayBuffer(4);\n const writer = new TB.BufferWriter(buffer);\n writer.writeUint32(e);\n const reader = new TB.BufferReader(buffer);\n return vec4f(\n reader.readUint8() / 255,\n reader.readUint8() / 255,\n reader.readUint8() / 255,\n reader.readUint8() / 255,\n );\n },\n signature: { argTypes: [u32], returnType: vec4f },\n codegenImpl: (e) => stitch`unpack4x8unorm(${e})`,\n});\n\n/**\n * @privateRemarks\n * https://gpuweb.github.io/gpuweb/wgsl/#pack4x8unorm-builtin\n */\nexport const pack4x8unorm = dualImpl({\n name: 'pack4x8unorm',\n normalImpl: (e: v4f): number => {\n const buffer = new ArrayBuffer(4);\n const writer = new TB.BufferWriter(buffer);\n writer.writeUint8(e.x * 255);\n writer.writeUint8(e.y * 255);\n writer.writeUint8(e.z * 255);\n writer.writeUint8(e.w * 255);\n const reader = new TB.BufferReader(buffer);\n return u32(reader.readUint32());\n },\n signature: { argTypes: [vec4f], returnType: u32 },\n codegenImpl: (e) => stitch`pack4x8unorm(${e})`,\n});\n","import { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport type { AnyData } from '../data/dataTypes.ts';\nimport { bool, f32 } from '../data/numeric.ts';\nimport { isSnippetNumeric, snip } from '../data/snippet.ts';\nimport { vec2b, vec3b, vec4b } from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport {\n type AnyBooleanVecInstance,\n type AnyFloatVecInstance,\n type AnyNumericVecInstance,\n type AnyVec2Instance,\n type AnyVec3Instance,\n type AnyVecInstance,\n type AnyWgslData,\n isVecInstance,\n type v2b,\n type v3b,\n type v4b,\n} from '../data/wgslTypes.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { unify } from '../tgsl/conversion.ts';\nimport { sub } from './operators.ts';\n\nfunction correspondingBooleanVectorSchema(dataType: AnyData) {\n if (dataType.type.includes('2')) {\n return vec2b;\n }\n if (dataType.type.includes('3')) {\n return vec3b;\n }\n return vec4b;\n}\n\n// comparison\n\n/**\n * Checks whether `lhs == rhs` on all components.\n * Equivalent to `all(eq(lhs, rhs))`.\n * @example\n * allEq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns false\n * allEq(vec3u(0, 1, 2), vec3u(0, 1, 2)) // returns true\n */\nexport const allEq = dualImpl({\n name: 'allEq',\n signature: (...argTypes) => ({ argTypes, returnType: bool }),\n normalImpl: <T extends AnyVecInstance>(lhs: T, rhs: T) =>\n cpuAll(cpuEq(lhs, rhs)),\n codegenImpl: (lhs, rhs) => stitch`all(${lhs} == ${rhs})`,\n});\n\nconst cpuEq = <T extends AnyVecInstance>(lhs: T, rhs: T) =>\n VectorOps.eq[lhs.kind](lhs, rhs);\n\n/**\n * Checks **component-wise** whether `lhs == rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `all`, or use `allEq`.\n * @example\n * eq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(true, false)\n * eq(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, false)\n * all(eq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1))) // returns true\n * allEq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1)) // returns true\n */\nexport const eq = dualImpl({\n name: 'eq',\n signature: (...argTypes) => ({\n argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: cpuEq,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} == ${rhs})`,\n});\n\n/**\n * Checks **component-wise** whether `lhs != rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `any`.\n * @example\n * ne(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(false, true)\n * ne(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, true)\n * any(ne(vec4i(4, 3, 2, 1), vec4i(4, 2, 2, 1))) // returns true\n */\nexport const ne = dualImpl({\n name: 'ne',\n signature: (...argTypes) => ({\n argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: <T extends AnyVecInstance>(lhs: T, rhs: T) =>\n cpuNot(cpuEq(lhs, rhs)),\n codegenImpl: (lhs, rhs) => stitch`(${lhs} != ${rhs})`,\n});\n\nconst cpuLt = <T extends AnyNumericVecInstance>(lhs: T, rhs: T) =>\n VectorOps.lt[lhs.kind](lhs, rhs);\n\n/**\n * Checks **component-wise** whether `lhs < rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `all`.\n * @example\n * lt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, true)\n * lt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, false)\n * all(lt(vec4i(1, 2, 3, 4), vec4i(2, 3, 4, 5))) // returns true\n */\nexport const lt = dualImpl({\n name: 'lt',\n signature: (...argTypes) => ({\n argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: cpuLt,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} < ${rhs})`,\n});\n\n/**\n * Checks **component-wise** whether `lhs <= rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `all`.\n * @example\n * le(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, true)\n * le(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, true, false)\n * all(le(vec4i(1, 2, 3, 4), vec4i(2, 3, 3, 5))) // returns true\n */\nexport const le = dualImpl({\n name: 'le',\n signature: (...argTypes) => ({\n argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: <T extends AnyNumericVecInstance>(lhs: T, rhs: T) =>\n cpuOr(cpuLt(lhs, rhs), cpuEq(lhs, rhs)),\n codegenImpl: (lhs, rhs) => stitch`(${lhs} <= ${rhs})`,\n});\n\n/**\n * Checks **component-wise** whether `lhs > rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `all`.\n * @example\n * gt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, false)\n * gt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, false, true)\n * all(gt(vec4i(2, 3, 4, 5), vec4i(1, 2, 3, 4))) // returns true\n */\nexport const gt = dualImpl({\n name: 'gt',\n signature: (...argTypes) => ({\n argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: <T extends AnyNumericVecInstance>(lhs: T, rhs: T) =>\n cpuAnd(cpuNot(cpuLt(lhs, rhs)), cpuNot(cpuEq(lhs, rhs))),\n codegenImpl: (lhs, rhs) => stitch`(${lhs} > ${rhs})`,\n});\n\n/**\n * Checks **component-wise** whether `lhs >= rhs`.\n * This function does **not** return `bool`, for that use-case, wrap the result in `all`.\n * @example\n * ge(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, false)\n * ge(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, true)\n * all(ge(vec4i(2, 2, 4, 5), vec4i(1, 2, 3, 4))) // returns true\n */\nexport const ge = dualImpl({\n name: 'ge',\n signature: (...argTypes) => ({\n argTypes: argTypes,\n returnType: correspondingBooleanVectorSchema(argTypes[0]),\n }),\n normalImpl: <T extends AnyNumericVecInstance>(lhs: T, rhs: T) =>\n cpuNot(cpuLt(lhs, rhs)),\n codegenImpl: (lhs, rhs) => stitch`(${lhs} >= ${rhs})`,\n});\n\n// logical ops\n\nconst cpuNot = <T extends AnyBooleanVecInstance>(value: T): T =>\n VectorOps.neg[value.kind](value);\n\n/**\n * Returns **component-wise** `!value`.\n * @example\n * not(vec2b(false, true)) // returns vec2b(true, false)\n * not(vec3b(true, true, false)) // returns vec3b(false, false, true)\n */\nexport const not = dualImpl({\n name: 'not',\n signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),\n normalImpl: cpuNot,\n codegenImpl: (arg) => stitch`!(${arg})`,\n});\n\nconst cpuOr = <T extends AnyBooleanVecInstance>(lhs: T, rhs: T) =>\n VectorOps.or[lhs.kind](lhs, rhs);\n\n/**\n * Returns **component-wise** logical `or` result.\n * @example\n * or(vec2b(false, true), vec2b(false, false)) // returns vec2b(false, true)\n * or(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(true, true, false)\n */\nexport const or = dualImpl({\n name: 'or',\n signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),\n normalImpl: cpuOr,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} | ${rhs})`,\n});\n\nconst cpuAnd = <T extends AnyBooleanVecInstance>(lhs: T, rhs: T) =>\n cpuNot(cpuOr(cpuNot(lhs), cpuNot(rhs)));\n\n/**\n * Returns **component-wise** logical `and` result.\n * @example\n * and(vec2b(false, true), vec2b(true, true)) // returns vec2b(false, true)\n * and(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(false, true, false)\n */\nexport const and = dualImpl({\n name: 'and',\n signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),\n normalImpl: cpuAnd,\n codegenImpl: (lhs, rhs) => stitch`(${lhs} & ${rhs})`,\n});\n\n// logical aggregation\n\nconst cpuAll = (value: AnyBooleanVecInstance) =>\n VectorOps.all[value.kind](value);\n\n/**\n * Returns `true` if each component of `value` is true.\n * @example\n * all(vec2b(false, true)) // returns false\n * all(vec3b(true, true, true)) // returns true\n */\nexport const all = dualImpl({\n name: 'all',\n signature: (...argTypes) => ({ argTypes, returnType: bool }),\n normalImpl: cpuAll,\n codegenImpl: (value) => stitch`all(${value})`,\n});\n\n/**\n * Returns `true` if any component of `value` is true.\n * @example\n * any(vec2b(false, true)) // returns true\n * any(vec3b(false, false, false)) // returns false\n */\nexport const any = dualImpl({\n name: 'any',\n signature: (...argTypes) => ({ argTypes, returnType: bool }),\n normalImpl: (value: AnyBooleanVecInstance) => !cpuAll(cpuNot(value)),\n codegenImpl: (arg) => stitch`any(${arg})`,\n});\n\n// other\n\n/**\n * Checks whether the given elements differ by at most the `precision` value.\n * Checks all elements of `lhs` and `rhs` if arguments are vectors.\n * @example\n * isCloseTo(0, 0.1) // returns false\n * isCloseTo(vec3f(0, 0, 0), vec3f(0.002, -0.009, 0)) // returns true\n *\n * @param {number} precision argument that specifies the maximum allowed difference, 0.01 by default.\n */\nexport const isCloseTo = dualImpl({\n name: 'isCloseTo',\n signature: (...args) => ({\n argTypes: args as AnyWgslData[],\n returnType: bool,\n }),\n // CPU implementation\n normalImpl: <T extends AnyFloatVecInstance | number>(\n lhs: T,\n rhs: T,\n precision = 0.01,\n ): boolean => {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return Math.abs(lhs - rhs) < precision;\n }\n if (isVecInstance(lhs) && isVecInstance(rhs)) {\n return VectorOps.isCloseToZero[lhs.kind](\n sub[$internal].jsImpl(lhs, rhs),\n precision,\n );\n }\n return false;\n },\n // GPU implementation\n codegenImpl: (\n lhs,\n rhs,\n precision = snip(0.01, f32, /* origin */ 'constant'),\n ) => {\n if (isSnippetNumeric(lhs) && isSnippetNumeric(rhs)) {\n return stitch`(abs(f32(${lhs}) - f32(${rhs})) <= ${precision})`;\n }\n if (!isSnippetNumeric(lhs) && !isSnippetNumeric(rhs)) {\n // https://www.w3.org/TR/WGSL/#vector-multi-component:~:text=Binary%20arithmetic%20expressions%20with%20mixed%20scalar%20and%20vector%20operands\n // (a-a)+prec creates a vector of a.length elements, all equal to prec\n return stitch`all(abs(${lhs} - ${rhs}) <= (${lhs} - ${lhs}) + ${precision})`;\n }\n return 'false';\n },\n});\n\nfunction cpuSelect(f: boolean, t: boolean, cond: boolean): boolean;\nfunction cpuSelect(f: number, t: number, cond: boolean): number;\nfunction cpuSelect<T extends AnyVecInstance>(\n f: T,\n t: T,\n cond:\n | boolean\n | (T extends AnyVec2Instance ? v2b\n : T extends AnyVec3Instance ? v3b\n : v4b),\n): T;\nfunction cpuSelect<T extends number | boolean | AnyVecInstance>(\n f: T,\n t: T,\n cond: AnyBooleanVecInstance | boolean,\n) {\n if (typeof cond === 'boolean') {\n return cond ? t : f;\n }\n return VectorOps.select[(f as AnyVecInstance).kind](\n f as AnyVecInstance,\n t as AnyVecInstance,\n cond,\n );\n}\n\n/**\n * Returns `t` if `cond` is `true`, and `f` otherwise.\n * Component-wise if `cond` is a vector.\n * @example\n * select(1, 2, false) // returns 1\n * select(1, 2, true) // returns 2\n * select(vec2i(1, 2), vec2i(3, 4), true) // returns vec2i(3, 4)\n * select(vec2i(1, 2), vec2i(3, 4), vec2b(false, true)) // returns vec2i(1, 4)\n */\nexport const select = dualImpl({\n name: 'select',\n signature: (f, t, cond) => {\n const [uf, ut] = unify([f, t]) ?? [f, t] as const;\n return ({ argTypes: [uf, ut, cond], returnType: uf });\n },\n normalImpl: cpuSelect,\n codegenImpl: (f, t, cond) => stitch`select(${f}, ${t}, ${cond})`,\n});\n","import { f32, i32, u32 } from '../../data/numeric.ts';\nimport { vec4f, vec4i, vec4u } from '../../data/vector.ts';\nimport type {\n F32,\n I32,\n U32,\n Vec4f,\n Vec4i,\n Vec4u,\n} from '../../data/wgslTypes.ts';\n\nexport type ViewDimensionToDimension = {\n '1d': '1d';\n '2d': '2d';\n '2d-array': '2d';\n '3d': '3d';\n cube: '2d';\n 'cube-array': '2d';\n};\n\nexport type StorageTextureFormats =\n | 'rgba8unorm'\n | 'rgba8snorm'\n | 'rgba8uint'\n | 'rgba8sint'\n | 'rgba16unorm'\n | 'rgba16snorm'\n | 'rgba16uint'\n | 'rgba16sint'\n | 'rgba16float'\n | 'rg8unorm'\n | 'rg8snorm'\n | 'rg8uint'\n | 'rg8sint'\n | 'rg16unorm'\n | 'rg16snorm'\n | 'rg16uint'\n | 'rg16sint'\n | 'rg16float'\n | 'r32uint'\n | 'r32sint'\n | 'r32float'\n | 'rg32uint'\n | 'rg32sint'\n | 'rg32float'\n | 'rgba32uint'\n | 'rgba32sint'\n | 'rgba32float'\n | 'bgra8unorm'\n | 'r8unorm'\n | 'r8snorm'\n | 'r8uint'\n | 'r8sint'\n | 'r16unorm'\n | 'r16snorm'\n | 'r16uint'\n | 'r16sint'\n | 'r16float'\n | 'rgb10a2unorm'\n | 'rgb10a2uint'\n | 'rg11b10ufloat';\n\ntype ParseChannelType<T extends GPUTextureFormat> = T extends\n `${string}uint${string}` ? 'u32'\n : T extends `${string}sint${string}` ? 'i32'\n : 'f32';\n\ntype ChannelTypeToSampleType<T extends 'f32' | 'i32' | 'u32'> = {\n f32: F32;\n i32: I32;\n u32: U32;\n}[T];\n\ntype ChannelTypeToVectorType<T extends 'f32' | 'i32' | 'u32'> = {\n f32: Vec4f;\n i32: Vec4i;\n u32: Vec4u;\n}[T];\n\nexport type TextureFormats = {\n [K in GPUTextureFormat]: {\n channelType: ChannelTypeToSampleType<ParseChannelType<K>>;\n vectorType: ChannelTypeToVectorType<ParseChannelType<K>>;\n };\n};\n\n// Runtime\n\nexport type AspectInfo = {\n readonly channelType: F32 | I32 | U32;\n readonly vectorType: Vec4f | Vec4i | Vec4u;\n readonly sampleTypes: readonly GPUTextureSampleType[];\n};\n\nexport type TextureFormatInfo = {\n readonly channelType: F32 | I32 | U32;\n readonly vectorType: Vec4f | Vec4i | Vec4u;\n readonly texelSize: number | 'non-copyable';\n readonly sampleTypes: readonly GPUTextureSampleType[];\n readonly canRenderAttachment: boolean;\n readonly depthAspect?: AspectInfo & {\n readonly texelSize: number | 'non-copyable';\n };\n readonly stencilAspect?: AspectInfo & { readonly texelSize: number };\n};\n\nconst DEPTH_ASPECT_NON_COPYABLE = {\n channelType: f32,\n vectorType: vec4f,\n sampleTypes: ['depth', 'unfilterable-float'],\n texelSize: 'non-copyable',\n} as const;\n\nconst DEPTH_ASPECT_16 = {\n channelType: f32,\n vectorType: vec4f,\n sampleTypes: ['depth', 'unfilterable-float'],\n texelSize: 2,\n} as const;\n\nconst DEPTH_ASPECT_32 = {\n channelType: f32,\n vectorType: vec4f,\n sampleTypes: ['depth', 'unfilterable-float'],\n texelSize: 4,\n} as const;\n\nconst STENCIL_ASPECT = {\n channelType: u32,\n vectorType: vec4u,\n sampleTypes: ['uint'],\n texelSize: 1,\n} as const;\n\nconst formatInfoCache = new Map<GPUTextureFormat, TextureFormatInfo>();\n\nexport function getTextureFormatInfo(\n format: GPUTextureFormat,\n): TextureFormatInfo {\n let info = formatInfoCache.get(format);\n if (info === undefined) {\n info = createFormatInfo(format);\n formatInfoCache.set(format, info);\n }\n return info;\n}\n\nfunction createFormatInfo(format: GPUTextureFormat): TextureFormatInfo {\n const channelType = parseChannelType(format);\n const depthAspect = getDepthAspect(format);\n const hasStencil = format.includes('stencil');\n\n return {\n channelType,\n vectorType: channelType === u32\n ? vec4u\n : channelType === i32\n ? vec4i\n : vec4f,\n texelSize: parseTexelSize(format),\n sampleTypes: parseSampleTypes(format),\n canRenderAttachment: canRenderAttachment(format),\n ...(depthAspect && { depthAspect }),\n ...(hasStencil && { stencilAspect: STENCIL_ASPECT }),\n };\n}\n\nfunction getDepthAspect(format: GPUTextureFormat) {\n if (format === 'depth16unorm') return DEPTH_ASPECT_16;\n if (format === 'depth32float' || format === 'depth32float-stencil8') {\n return DEPTH_ASPECT_32;\n }\n if (format === 'depth24plus' || format === 'depth24plus-stencil8') {\n return DEPTH_ASPECT_NON_COPYABLE;\n }\n return undefined;\n}\n\nfunction canRenderAttachment(format: GPUTextureFormat): boolean {\n if (\n format.startsWith('bc') ||\n format.startsWith('etc2') ||\n format.startsWith('eac') ||\n format.startsWith('astc')\n ) {\n return false;\n }\n if (format === 'rgb9e5ufloat') return false;\n return true;\n}\n\nfunction parseChannelType(format: GPUTextureFormat): F32 | I32 | U32 {\n if (format === 'stencil8') return u32;\n if (format.includes('uint')) return u32;\n if (format.includes('sint')) return i32;\n return f32;\n}\n\nfunction parseTexelSize(format: GPUTextureFormat): number | 'non-copyable' {\n // Standard formats: channel count encoded in prefix length (r=1, rg=2, rgba/bgra=4)\n const [, channels, bits] = format.match(/^(rgba|bgra|rg|r)(8|16|32)/) ?? [];\n if (channels && bits) {\n return (channels.length * Number(bits)) / 8;\n }\n\n // Depth/stencil\n if (format === 'stencil8') return 1;\n if (format === 'depth16unorm') return 2;\n if (format === 'depth32float') return 4;\n if (format === 'depth32float-stencil8') return 5;\n // depth24plus formats have undefined copy size\n if (format === 'depth24plus' || format === 'depth24plus-stencil8') {\n return 'non-copyable';\n }\n\n // Compressed: 8-byte blocks (bc1, bc4, etc2-rgb8*, eac-r11*)\n if (/^(bc[14]-|etc2-rgb8|eac-r11)/.test(format)) return 8;\n // Compressed: 16-byte blocks (bc2-7, astc, etc2-rgba8*, eac-rg11*)\n if (/^(bc|astc-|etc2-rgba|eac-rg)/.test(format)) return 16;\n\n // Packed 32-bit (rgb9e5ufloat, rgb10a2unorm, rgb10a2uint, rg11b10ufloat)\n return 4;\n}\n\nfunction parseSampleTypes(format: string): readonly GPUTextureSampleType[] {\n if (format === 'stencil8') return ['uint'];\n if (format.includes('uint')) return ['uint'];\n if (format.includes('sint')) return ['sint'];\n if (format.includes('depth')) return ['depth', 'unfilterable-float'];\n if (/^(r|rg|rgba)16(u|s)norm$/.test(format)) return ['unfilterable-float'];\n return ['float', 'unfilterable-float'];\n}\n\nconst FLOAT32_FORMATS = new Set(['r32float', 'rg32float', 'rgba32float']);\n\nexport function getEffectiveSampleTypes(\n device: GPUDevice,\n format: GPUTextureFormat,\n): readonly GPUTextureSampleType[] {\n if (\n FLOAT32_FORMATS.has(format) && !device.features.has('float32-filterable')\n ) {\n return ['unfilterable-float'];\n }\n return getTextureFormatInfo(format).sampleTypes;\n}\n","export const wgslExtensions = [\n 'f16',\n 'clip_distances',\n 'dual_source_blending',\n 'subgroups',\n 'primitive_index',\n] as const;\nexport type WgslExtension = (typeof wgslExtensions)[number];\n\nexport const wgslExtensionToFeatureName: Record<WgslExtension, GPUFeatureName> =\n {\n f16: 'shader-f16',\n clip_distances: 'clip-distances',\n dual_source_blending: 'dual-source-blending',\n subgroups: 'subgroups',\n primitive_index: 'primitive-index' as GPUFeatureName,\n };\n"],"mappings":"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","names":["unaryIdentitySignature","arg","variadicUnifySignature","args","uargs","unify","variadicReduce","fn","fst","rest","acc","r","variadicStitch","wrapper","stitch","cpuAbs","value","VectorOps","abs","dualImpl","cpuAcos","acos","cpuAcosh","acosh","cpuAsin","asin","cpuAsinh","asinh","cpuAtan","atan","cpuAtanh","atanh","cpuAtan2","y","x","atan2","f32","f16","abstractFloat","cpuCeil","ceil","cpuClamp","low","high","clamp","cpuCos","cos","cpuCosh","cosh","countLeadingZeros","dualImpl","unaryIdentitySignature","value","stitch","countOneBits","dualImpl","unaryIdentitySignature","value","stitch","countTrailingZeros","dualImpl","unaryIdentitySignature","value","stitch","cross","args","a","b","VectorOps","cpuDegrees","MissingCpuImplError","degrees","determinant","cpuDistance","length","sub","distance","isHalfPrecisionSchema","f16","f32","dot","lhs","rhs","dot4U8Packed","u32","e1","e2","dot4I8Packed","i32","cpuExp","exp","cpuExp2","exp2","extractBits","dualImpl","arg","_offset","_count","u32","offset","count","stitch","faceForward","args","e1","e2","e3","firstLeadingBit","dualImpl","unaryIdentitySignature","value","stitch","firstTrailingBit","dualImpl","unaryIdentitySignature","value","stitch","cpuFloor","VectorOps","floor","arg","cpuFma","e1","e2","e3","MissingCpuImplError","fma","args","cpuFract","fract","a","FrexpResults","abstruct","f32","i32","f16","abstractFloat","abstractInt","vec2f","vec2i","vec3f","vec3i","vec4f","vec4i","vec2h","vec3h","vec4h","frexp","returnType","insertBits","dualImpl","newbits","_offset","_count","u32","offset","count","stitch","cpuInverseSqrt","value","MissingCpuImplError","inverseSqrt","unaryIdentitySignature","ldexp","dualImpl","e1","_e2","abstractInt","i32","vec2i","vec3i","vec4i","e2","stitch","cpuLength","value","VectorOps","length","arg","isHalfPrecisionSchema","f16","f32","cpuLog","log","unaryIdentitySignature","cpuLog2","log2","cpuMax","a","b","max","variadicUnifySignature","variadicReduce","variadicStitch","cpuMin","min","cpuMix","e3","mix","ModfResult","abstruct","abstractFloat","vec2f","vec3f","vec4f","vec2h","vec3h","vec4h","modf","dualImpl","returnType","ModfResult","value","stitch","normalize","unaryIdentitySignature","v","VectorOps","powCpu","base","exponent","isVecInstance","pow","args","uargs","unify","f32","f16","abstractFloat","isNumericSchema","lhs","rhs","quantizeToF16","dualImpl","unaryIdentitySignature","value","stitch","cpuRadians","MissingCpuImplError","radians","args","uargs","unify","f32","f16","abstractFloat","reflect","e1","e2","sub","mul","dot","refract","e3","_e3","isHalfPrecisionSchema","reverseBits","dualImpl","unaryIdentitySignature","value","stitch","cpuRound","MissingCpuImplError","round","cpuSaturate","saturate","cpuSign","VectorOps","sign","cpuSin","sin","cpuSinh","sinh","cpuSmoothstep","edge0","edge1","x","smoothstepScalar","smoothstep","args","cpuSqrt","sqrt","cpuStep","edge","step","uargs","unify","f32","f16","abstractFloat","cpuTan","tan","cpuTanh","tanh","transpose","trunc","dualImpl","unaryIdentitySignature","value","stitch","bitcastU32toF32","dualImpl","value","bitcastU32toF32Impl","VectorOps","n","stitch","arg","uargs","unify","u32","isVec","vec2f","vec3f","vec4f","f32","bitcastU32toI32","bitcastU32toI32Impl","vec2i","vec3i","vec4i","i32","TB","unpack2x16float","dualImpl","buffer","reader","vec2f","u32","stitch","pack2x16float","writer","unpack4x8unorm","vec4f","pack4x8unorm","correspondingBooleanVectorSchema","dataType","vec2b","vec3b","vec4b","allEq","dualImpl","argTypes","bool","lhs","rhs","cpuAll","cpuEq","stitch","VectorOps","eq","ne","cpuNot","cpuLt","lt","le","cpuOr","gt","cpuAnd","ge","value","not","arg","and","all","any","isCloseTo","args","precision","isVecInstance","sub","$internal","snip","f32","isSnippetNumeric","cpuSelect","f","t","cond","select","uf","ut","unify","DEPTH_ASPECT_NON_COPYABLE","f32","vec4f","DEPTH_ASPECT_16","DEPTH_ASPECT_32","STENCIL_ASPECT","u32","vec4u","formatInfoCache","getTextureFormatInfo","format","info","createFormatInfo","channelType","parseChannelType","depthAspect","getDepthAspect","hasStencil","i32","vec4i","parseTexelSize","parseSampleTypes","canRenderAttachment","channels","bits","FLOAT32_FORMATS","getEffectiveSampleTypes","device","wgslExtensions","wgslExtensionToFeatureName"]}
@@ -0,0 +1,3 @@
1
+ import{i as V,l as C,m as q}from"./chunk-MBB2XFH6.js";import{B as P,Bc as J,Ca as G,D as x,M as N,Q as U,S as H,Y as I,Z as K,a as B,c as D,f as W,ga as E,j as d,k as f,l as M,m as k,ma as _,n as j,q as A}from"./chunk-SHSILTWI.js";function O(n,e){for(let[r,t]of Object.entries(e))n[r]=t,t&&(typeof t=="object"||typeof t=="function")&&d(t)===void 0&&f(t,r)}function Te(n,e,r){let t=[...n.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map(s=>s?s[1]:void 0);r(Object.fromEntries(e.flatMap((s,i)=>{let o=t?t[i]:void 0;return x(s)&&o!==void 0?[[o,s]]:[]})))}function we(n,e,r){let t=n.match(/->\s(?<output>[\w\d_]+)\s{/),s=t?t[1]?.trim():void 0;x(e)&&s&&!/\s/g.test(s)&&r({[s]:e})}function oe(n){return new RegExp(`(?<![\\w\\$_.])${n.replaceAll(".","\\.").replaceAll("$","\\$")}(?![\\w\\$_])`,"g")}function R(n,e,r){return Object.entries(e).reduce((t,[s,i])=>{let o=oe(s);if(r&&s!=="Out"&&s!=="In"&&!o.test(r)&&console.warn(`The external '${s}' wasn't used in the resolved template.`),G(i)||H(i)||k(i))return t.replaceAll(o,n.resolve(i).value);if(i!==null&&typeof i=="object"){let a=[...r.matchAll(new RegExp(`${s.replaceAll(".","\\.").replaceAll("$","\\$")}\\.(?<prop>.*?)(?![\\w\\$_])`,"g"))].map(p=>p[1]);return[...new Set(a)].reduce((p,l)=>l&&l in i?R(n,{[`${s}.${l}`]:i[l]},p):p,t)}return console.warn(`During resolution, the external '${s}' has been omitted. Only TGPU resources, 'use gpu' functions, primitives, and plain JS objects can be used as externals.`),t},r)}function X(n){let{strippedCode:e,argRange:r}=ae(n),t=new T(e);t.consume("(");let s=[];for(;!t.isAt(")");){let o=[];for(;t.isAt("@");)t.parseUntil(z,Q),t.consume(")"),o.push(t.lastParsed);t.parseUntil(pe);let a=t.lastParsed,u;t.isAt(":")&&(t.consume(":"),t.parseUntil(le,de),u=t.lastParsed),s.push({identifier:a,attributes:o,type:u}),t.isAt(",")&&t.consume(",")}t.consume(")");let i;if(t.isAt("->")){t.consume("->");let o=[];for(;t.isAt("@");)t.parseUntil(z,Q),t.consume(")"),o.push(t.lastParsed);i={type:t.str.slice(t.pos),attributes:o}}return{args:s,ret:i,range:{begin:r[0],end:r[1]}}}function ae(n){let e=new T(n),r="",t;for(;!e.isFinished();){if(e.isAt(ue)){e.advanceBy(1);continue}if(e.isAt("//")){e.consume("//"),e.parseUntil(Y),e.advanceBy(1);continue}if(e.isAt("/*")){e.parseUntil(ce,me),e.consume("*/");continue}if(e.isAt("{"))return{strippedCode:r,argRange:[t,e.pos]};e.isAt("(")&&t===void 0&&(t=e.pos),t!==void 0&&(r+=e.str[e.pos]),e.advanceBy(1)}throw new Error("Invalid wgsl code!")}var T=class{constructor(e){this.str=e;this.#e=0}#t;#e;get pos(){return this.#e}get lastParsed(){if(this.#t===void 0)throw new Error("Parse was not called yet!");return this.str.slice(this.#t,this.pos)}isFinished(){return this.#e>=this.str.length}isAt(e){if(typeof e=="string"){for(let r=0;r<e.length;r++)if(this.str[this.#e+r]!==e[r])return!1;return!0}for(let r of e)if(this.isAt(r))return!0;return!1}parseUntil(e,r){this.#t=this.#e;let t=0;for(;this.#e<this.str.length;){if(r&&this.isAt(r[0])&&(t+=1),r&&this.isAt(r[1])&&(t-=1),t===0&&this.isAt(e))return this.#e;this.#e+=1}throw new Error("Reached the end of the string without finding a match!")}advanceBy(e){this.#e+=e}consume(e){if(!this.isAt(e))throw new Error(`Expected '${e}' at position ${this.#e}, but found '${this.str.slice(this.#e,this.#e+e.length)}'`);this.advanceBy(e.length)}},Y=new Set([`
2
+ `,"\v","\f","\r","\x85","\u2028","\u2029"]),ue=new Set([...Y," "," ","\u200E","\u200F"]),z=new Set([")"]),pe=new Set([":",",",")"]),le=new Set([",",")"]),ce=new Set(["*/"]),Q=["(",")"],de=["<",">"],me=["/*","*/"];function ee(n,e=""){let r=[],t={applyExternals(i){r.push(i)},resolve(i,o,a){let u={};for(let c of r)O(u,c);let p=i.getUniqueName(this);if(typeof n=="string"){if(!a)throw new Error("Explicit return type is required for string implementation");let c=R(i,u,n),y="",$="";if(e!==""){let m=x(o[0])?`(in: ${i.resolve(o[0]).value})`:"()",h=P(a)?q(a):"",S=a!==A?x(a)?`-> ${i.resolve(a).value}`:`-> ${h!==""?h:"@location(0)"} ${i.resolve(a).value}`:"";y=`${m} ${S} `,$=c}else{let m=X(c);if(m.args.length!==o.length)throw new Error(`WGSL implementation has ${m.args.length} arguments, while the shell has ${o.length} arguments.`);let h=m.args.map((v,se)=>`${v.identifier}: ${Z(i,`parameter ${v.identifier}`,v.type,o[se])}`).join(", "),S=a===A?"":`-> ${Z(i,"return type",m.ret?.type,a)}`;y=`(${h}) ${S}`,$=c.slice(m.range.end)}return i.addDeclaration(`${e}fn ${p}${y}${$}`),E(p,a,"runtime")}let l=j(n),F=typeof l?.externals=="function"?l.externals():l?.externals;if(F){let c=Object.fromEntries(Object.entries(F).filter(([y])=>!(y in u)));O(u,c)}let g=l?.ast;if(!g)throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");let L=g.externalNames.filter(c=>!(c in u));if(L.length>0)throw new _(d(this),L);let w=g.params[1];w&&w.type==="i"&&e!==""&&O(u,{[w.name]:U(a)});let{head:ne,body:re,returnType:ie}=i.fnToWgsl({functionType:e.includes("@compute")?"compute":e.includes("@vertex")?"vertex":e.includes("@fragment")?"fragment":"normal",argTypes:o,params:g.params,returnType:a,body:g.body,externalMap:u});return i.addDeclaration(`${e}fn ${p}${i.resolve(ne).value}${i.resolve(re).value}`),E(p,ie,"runtime")}},s=d(n);return s!==void 0&&f(t,s),t}function Z(n,e,r,t){let s=n.resolve(t).value.replace(/\s/g,"");if(!r)return s;let i=r.replace(/\s/g,"");if(i!==s)throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${e}, JS type "${s}", WGSL type "${i}".`);return r}function fe(n,e={}){let r=0,t=new Set;return Object.fromEntries(Object.entries(n??{}).map(([s,i])=>{let o=I(i);if(o!==void 0){if(t.has(o))throw new Error("Duplicate custom location attributes found");t.add(o)}return[s,i]}).map(([s,i])=>{if(C(i))return[s,i];if(I(i)!==void 0)return[s,i];if(e[s])return[s,V(e[s],i)];for(;t.has(r);)r++;return[s,V(r++,i)]}))}function b(n,e={}){return K(n)?N(n)||C(n)||I(n)!==void 0?n:V(0,n):J(fe(n,e))}function te(n,...e){return xe(n)?ge(n,...e):n}function xe(n){return Array.isArray(n)&&"raw"in n&&Array.isArray(n.raw)&&n.raw.every(e=>typeof e=="string")}function ge(n,...e){return n.slice(1).reduce((r,t,s)=>`${r}${e[s]}${t}`,n[0])}function qe(n){if(Object.keys(n.out).length===0)throw new Error("A vertexFn output cannot be empty since it must include the 'position' builtin.");let e={in:n.in,out:n.out,argTypes:n.in&&Object.keys(n.in).length!==0?[b(n.in)]:[],isEntry:!0};return Object.assign((t,...s)=>ye(e,te(t,...s)),e)}function ye(n,e){let r=ee(e,"@vertex "),t=n.argTypes[0];return{shell:n,$uses(i){return r.applyExternals(i),this},[B]:!0,[D]:r,$name(i){return f(r,i),M(t)&&t.$name(`${i}_Input`),this},[W](i){let o=b(n.out,i.varyingLocations).$name(`${d(this)??""}_Output`);return typeof e=="string"&&(t&&r.applyExternals({In:t}),r.applyExternals({Out:o})),r.resolve(i,n.argTypes,o)},toString(){return`vertexFn:${d(r)??"<unnamed>"}`}}}export{O as a,Te as b,we as c,R as d,ee as e,b as f,te as g,qe as h};
3
+ //# sourceMappingURL=chunk-D5UYO3OX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/resolve/externals.ts","../src/core/function/extractArgs.ts","../src/core/function/fnCore.ts","../src/core/function/ioSchema.ts","../src/core/function/templateUtils.ts","../src/core/function/tgpuVertexFn.ts"],"sourcesContent":["import { isLooseData } from '../../data/dataTypes.ts';\nimport { isWgslStruct } from '../../data/wgslTypes.ts';\nimport { getName, hasTinyestMetadata, setName } from '../../shared/meta.ts';\nimport { isWgsl, type ResolutionCtx } from '../../types.ts';\n\n/**\n * A key-value mapping where keys represent identifiers within shader code,\n * and values can be any type that can be resolved to a code string.\n */\nexport type ExternalMap = Record<string, unknown>;\n\n/**\n * Merges two external maps into one. If a key is present in both maps, the value from the new map is used.\n * If the external value is a namable object, it is given a name if it does not already have one.\n * @param existing - The existing external map.\n * @param newExternals - The new external map.\n */\nexport function applyExternals(\n existing: ExternalMap,\n newExternals: ExternalMap,\n) {\n for (const [key, value] of Object.entries(newExternals)) {\n existing[key] = value;\n\n // Giving name to external value, if it does not already have one.\n if (\n value && (typeof value === 'object' || typeof value === 'function') &&\n getName(value) === undefined\n ) {\n setName(value, key);\n }\n }\n}\n\nexport function addArgTypesToExternals(\n implementation: string,\n argTypes: unknown[],\n applyExternals: (externals: ExternalMap) => void,\n) {\n const argTypeNames = [\n ...implementation.matchAll(/:\\s*(?<arg>.*?)\\s*[,)]/g),\n ].map((found) => (found ? found[1] : undefined));\n\n applyExternals(\n Object.fromEntries(\n argTypes.flatMap((argType, i) => {\n const argTypeName = argTypeNames ? argTypeNames[i] : undefined;\n return isWgslStruct(argType) && argTypeName !== undefined\n ? [[argTypeName, argType]]\n : [];\n }),\n ),\n );\n}\n\nexport function addReturnTypeToExternals(\n implementation: string,\n returnType: unknown,\n applyExternals: (externals: ExternalMap) => void,\n) {\n const matched = implementation.match(/->\\s(?<output>[\\w\\d_]+)\\s{/);\n const outputName = matched ? matched[1]?.trim() : undefined;\n\n if (isWgslStruct(returnType) && outputName && !/\\s/g.test(outputName)) {\n applyExternals({ [outputName]: returnType });\n }\n}\n\nfunction identifierRegex(name: string) {\n return new RegExp(\n `(?<![\\\\w\\\\$_.])${\n name.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }(?![\\\\w\\\\$_])`,\n 'g',\n );\n}\n\n/**\n * Replaces all occurrences of external names in WGSL code with their resolved values.\n * It adds all necessary definitions to the resolution context.\n * @param ctx - The resolution context.\n * @param externalMap - The external map.\n * @param wgsl - The WGSL code.\n *\n * @returns The WGSL code with all external names replaced with their resolved values.\n */\nexport function replaceExternalsInWgsl(\n ctx: ResolutionCtx,\n externalMap: ExternalMap,\n wgsl: string,\n): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n const externalRegex = identifierRegex(externalName);\n if (\n wgsl &&\n externalName !== 'Out' &&\n externalName !== 'In' &&\n !externalRegex.test(wgsl)\n ) {\n console.warn(\n `The external '${externalName}' wasn't used in the resolved template.`,\n );\n // continue anyway, we still might need to resolve the external\n }\n\n if (\n isWgsl(external) || isLooseData(external) || hasTinyestMetadata(external)\n ) {\n return acc.replaceAll(externalRegex, ctx.resolve(external).value);\n }\n\n if (external !== null && typeof external === 'object') {\n const foundProperties = [\n ...wgsl.matchAll(\n new RegExp(\n `${\n externalName.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }\\\\.(?<prop>.*?)(?![\\\\w\\\\$_])`,\n 'g',\n ),\n ),\n ].map((found) => found[1]);\n const uniqueProperties = [...new Set(foundProperties)];\n\n return uniqueProperties.reduce(\n (innerAcc: string, prop) =>\n prop && prop in external\n ? replaceExternalsInWgsl(\n ctx,\n {\n [`${externalName}.${prop}`]:\n external[prop as keyof typeof external],\n },\n innerAcc,\n )\n : innerAcc,\n acc,\n );\n }\n\n console.warn(\n `During resolution, the external '${externalName}' has been omitted. Only TGPU resources, 'use gpu' functions, primitives, and plain JS objects can be used as externals.`,\n );\n\n return acc;\n }, wgsl);\n}\n","interface FunctionArgsInfo {\n args: ArgInfo[];\n ret: ReturnInfo | undefined;\n range: {\n begin: number;\n end: number;\n };\n}\n\ninterface ArgInfo {\n identifier: string;\n attributes: string[];\n type: string | undefined;\n}\n\ninterface ReturnInfo {\n attributes: string[];\n type: string;\n}\n\n/**\n * Extracts info about arguments of a given WGSL function string.\n * @example\n * const code = `\n * fn add(a: i32, @location(0) b: i32, c) -> i32 {\n * return a + b + c;\n * }`;\n *\n * extractArgs(code);\n * // {\n * // args: [\n * // { identifier: 'a', attributes: [], type: 'i32' },\n * // { identifier: 'b', attributes: ['@location(0)'], type: 'i32' },\n * // { identifier: 'c', attributes: [], type: undefined }\n * // ],\n * // ret: { type: 'i32', attributes: [] },\n * // range: { begin: 11, end: 51 }\n * // }\n */\nexport function extractArgs(rawCode: string): FunctionArgsInfo {\n const { strippedCode, argRange: range } = strip(rawCode);\n const code = new ParsableString(strippedCode);\n code.consume('(');\n\n const args: ArgInfo[] = [];\n while (!code.isAt(')')) {\n // In each loop iteration, process all the attributes, the identifier and the potential type of a single argument.\n\n const attributes = [];\n while (code.isAt('@')) {\n code.parseUntil(closingParenthesis, parentheses);\n code.consume(')');\n attributes.push(code.lastParsed);\n }\n\n code.parseUntil(identifierEndSymbols);\n const identifier = code.lastParsed;\n\n let maybeType: string | undefined;\n if (code.isAt(':')) {\n code.consume(':');\n code.parseUntil(typeEndSymbols, angleBrackets);\n maybeType = code.lastParsed;\n }\n\n args.push({\n identifier,\n attributes,\n type: maybeType,\n });\n\n if (code.isAt(',')) {\n code.consume(',');\n }\n }\n code.consume(')');\n\n let maybeRet: ReturnInfo | undefined;\n if (code.isAt('->')) {\n code.consume('->');\n\n const attributes = [];\n while (code.isAt('@')) {\n code.parseUntil(closingParenthesis, parentheses);\n code.consume(')');\n attributes.push(code.lastParsed);\n }\n\n maybeRet = { type: code.str.slice(code.pos), attributes };\n }\n\n return {\n args,\n ret: maybeRet,\n range: { begin: range[0], end: range[1] },\n };\n}\n\n/**\n * Strips comments, whitespaces, the name and the body of the function.\n * @example\n * const code = `\n * fn add( a, // first argument\n * @location(0) b : i32 ) -> i32 {\n * return a + b; // returns the sum\n * }`;\n *\n * strip(code); // \"(a,@location(0)b:i32)->i32\"\n */\nfunction strip(\n rawCode: string,\n): { strippedCode: string; argRange: [number, number] } {\n const code = new ParsableString(rawCode);\n let strippedCode = '';\n let argsStart: number | undefined;\n\n while (!code.isFinished()) {\n // parse character by character while ignoring comments and blankspaces until you find a `{`.\n\n // skip any blankspace\n if (code.isAt(blankSpaces)) {\n code.advanceBy(1); // the blankspace character\n continue;\n }\n\n // skip line comments\n if (code.isAt('//')) {\n code.consume('//');\n code.parseUntil(lineBreaks);\n code.advanceBy(1); // the line break\n continue;\n }\n\n // skip block comments\n if (code.isAt('/*')) {\n code.parseUntil(openingCommentBlock, commentBlocks);\n code.consume('*/');\n continue;\n }\n\n if (code.isAt('{')) {\n return {\n strippedCode,\n argRange: [argsStart as number, code.pos],\n };\n }\n\n if (code.isAt('(') && argsStart === undefined) {\n argsStart = code.pos;\n }\n\n if (argsStart !== undefined) {\n strippedCode += code.str[code.pos];\n }\n code.advanceBy(1); // parsed character\n }\n throw new Error('Invalid wgsl code!');\n}\n\nclass ParsableString {\n #parseStartPos: number | undefined;\n #pos: number;\n constructor(public readonly str: string) {\n this.#pos = 0;\n }\n\n get pos(): number {\n return this.#pos;\n }\n\n /**\n * This property is equivalent to the substring of `this.str`\n * from the position of the last `parseUntil` call, to the current position.\n */\n get lastParsed(): string {\n if (this.#parseStartPos === undefined) {\n throw new Error('Parse was not called yet!');\n }\n return this.str.slice(this.#parseStartPos, this.pos);\n }\n\n isFinished() {\n return this.#pos >= this.str.length;\n }\n\n isAt(substr: string | Set<string>): boolean {\n if (typeof substr === 'string') {\n for (let i = 0; i < substr.length; i++) {\n if (this.str[this.#pos + i] !== substr[i]) {\n return false;\n }\n }\n return true;\n }\n for (const elem of substr) {\n if (this.isAt(elem)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * @param toFind a set of strings either of which satisfy the search.\n * @param brackets a pair of brackets that has to be closed for result to be valid. This includes the found character(s).\n * @example\n * // internal state:\n * // '(@attribute(0) identifier: type)'\n * // ^\n * this.parse(new Set(')'), ['(', ')']);\n * // internal state:\n * // '(@attribute(0) identifier: type)'\n * // ^\n */\n parseUntil(\n toFind: Set<string>,\n brackets?: readonly [string, string],\n ): number {\n this.#parseStartPos = this.#pos;\n let openedBrackets = 0;\n while (this.#pos < this.str.length) {\n if (brackets && this.isAt(brackets[0])) {\n openedBrackets += 1;\n }\n if (brackets && this.isAt(brackets[1])) {\n openedBrackets -= 1;\n }\n if (openedBrackets === 0) {\n if (this.isAt(toFind)) {\n return this.#pos;\n }\n }\n this.#pos += 1;\n }\n throw new Error('Reached the end of the string without finding a match!');\n }\n\n advanceBy(steps: number) {\n this.#pos += steps;\n }\n\n consume(str: string): void {\n if (!this.isAt(str)) {\n throw new Error(\n `Expected '${str}' at position ${this.#pos}, but found '${\n this.str.slice(this.#pos, this.#pos + str.length)\n }'`,\n );\n }\n this.advanceBy(str.length);\n }\n}\n\nconst lineBreaks = new Set<string>([\n '\\u000A', // line feed\n '\\u000B', // vertical tab\n '\\u000C', // form feed\n '\\u000D', // carriage return\n '\\u0085', // next line\n '\\u2028', // line separator\n '\\u2029', // paragraph separator\n]);\nconst blankSpaces = new Set<string>([\n ...lineBreaks,\n '\\u0020', // space\n '\\u0009', // horizontal tab\n '\\u200E', // left-to-right mark\n '\\u200F', // right-to-left mark\n]);\nconst closingParenthesis = new Set<string>([')']);\nconst identifierEndSymbols = new Set([':', ',', ')']);\nconst typeEndSymbols = new Set([',', ')']);\nconst openingCommentBlock = new Set(['*/']);\n\nconst parentheses = ['(', ')'] as const;\nconst angleBrackets = ['<', '>'] as const;\nconst commentBlocks = ['/*', '*/'] as const;\n","import { getAttributesString } from '../../data/attributes.ts';\nimport { type AnyData, undecorate } from '../../data/dataTypes.ts';\nimport { type ResolvedSnippet, snip } from '../../data/snippet.ts';\nimport { isWgslData, isWgslStruct, Void } from '../../data/wgslTypes.ts';\nimport { MissingLinksError } from '../../errors.ts';\nimport { getMetaData, getName, setName } from '../../shared/meta.ts';\nimport type { ResolutionCtx } from '../../types.ts';\nimport {\n applyExternals,\n type ExternalMap,\n replaceExternalsInWgsl,\n} from '../resolve/externals.ts';\nimport { extractArgs } from './extractArgs.ts';\nimport type { Implementation } from './fnTypes.ts';\n\nexport interface FnCore {\n applyExternals(newExternals: ExternalMap): void;\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: AnyData | undefined,\n ): ResolvedSnippet;\n}\n\nexport function createFnCore(\n implementation: Implementation,\n fnAttribute = '',\n): FnCore {\n /**\n * External application has to be deferred until resolution because\n * some externals can reference the owner function which has not been\n * initialized yet (like when accessing the Output struct of a vertex\n * entry fn).\n */\n const externalsToApply: ExternalMap[] = [];\n\n const core = {\n applyExternals(newExternals: ExternalMap): void {\n externalsToApply.push(newExternals);\n },\n\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n returnType: AnyData | undefined,\n ): ResolvedSnippet {\n const externalMap: ExternalMap = {};\n\n for (const externals of externalsToApply) {\n applyExternals(externalMap, externals);\n }\n\n const id = ctx.getUniqueName(this);\n\n if (typeof implementation === 'string') {\n if (!returnType) {\n throw new Error(\n 'Explicit return type is required for string implementation',\n );\n }\n\n const replacedImpl = replaceExternalsInWgsl(\n ctx,\n externalMap,\n implementation,\n );\n\n let header = '';\n let body = '';\n\n if (fnAttribute !== '') {\n const input = isWgslStruct(argTypes[0])\n ? `(in: ${ctx.resolve(argTypes[0]).value})`\n : '()';\n\n const attributes = isWgslData(returnType)\n ? getAttributesString(returnType)\n : '';\n const output = returnType !== Void\n ? isWgslStruct(returnType)\n ? `-> ${ctx.resolve(returnType).value}`\n : `-> ${attributes !== '' ? attributes : '@location(0)'} ${\n ctx.resolve(returnType).value\n }`\n : '';\n\n header = `${input} ${output} `;\n body = replacedImpl;\n } else {\n const providedArgs = extractArgs(replacedImpl);\n\n if (providedArgs.args.length !== argTypes.length) {\n throw new Error(\n `WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`,\n );\n }\n\n const input = providedArgs.args.map((argInfo, i) =>\n `${argInfo.identifier}: ${\n checkAndReturnType(\n ctx,\n `parameter ${argInfo.identifier}`,\n argInfo.type,\n argTypes[i],\n )\n }`\n ).join(', ');\n\n const output = returnType === Void ? '' : `-> ${\n checkAndReturnType(\n ctx,\n 'return type',\n providedArgs.ret?.type,\n returnType,\n )\n }`;\n\n header = `(${input}) ${output}`;\n\n body = replacedImpl.slice(providedArgs.range.end);\n }\n\n ctx.addDeclaration(`${fnAttribute}fn ${id}${header}${body}`);\n return snip(id, returnType, /* origin */ 'runtime');\n }\n\n // get data generated by the plugin\n const pluginData = getMetaData(implementation);\n\n // Passing a record happens prior to version 0.9.0\n // TODO: Support for this can be removed down the line\n const pluginExternals = typeof pluginData?.externals === 'function'\n ? pluginData.externals()\n : pluginData?.externals;\n\n if (pluginExternals) {\n const missing = Object.fromEntries(\n Object.entries(pluginExternals).filter(\n ([name]) => !(name in externalMap),\n ),\n );\n\n applyExternals(externalMap, missing);\n }\n\n const ast = pluginData?.ast;\n if (!ast) {\n throw new Error(\n \"Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)\",\n );\n }\n\n // verify all required externals are present\n const missingExternals = ast.externalNames.filter(\n (name) => !(name in externalMap),\n );\n if (missingExternals.length > 0) {\n throw new MissingLinksError(getName(this), missingExternals);\n }\n\n // If an entrypoint implementation has a second argument, it represents the output schema.\n // We look at the identifier chosen by the user and add it to externals.\n const maybeSecondArg = ast.params[1];\n if (\n maybeSecondArg && maybeSecondArg.type === 'i' && fnAttribute !== ''\n ) {\n applyExternals(\n externalMap,\n {\n // biome-ignore lint/style/noNonNullAssertion: entry functions cannot be shellless\n [maybeSecondArg.name]: undecorate(returnType!),\n },\n );\n }\n\n // generate wgsl string\n\n const { head, body, returnType: actualReturnType } = ctx.fnToWgsl({\n functionType: fnAttribute.includes('@compute')\n ? 'compute'\n : fnAttribute.includes('@vertex')\n ? 'vertex'\n : fnAttribute.includes('@fragment')\n ? 'fragment'\n : 'normal',\n argTypes,\n params: ast.params,\n returnType,\n body: ast.body,\n externalMap,\n });\n\n ctx.addDeclaration(\n `${fnAttribute}fn ${id}${ctx.resolve(head).value}${\n ctx.resolve(body).value\n }`,\n );\n\n return snip(id, actualReturnType, /* origin */ 'runtime');\n },\n };\n\n // The implementation could have been given a name by a bundler plugin,\n // so we try to transfer it to the core.\n const maybeName = getName(implementation);\n if (maybeName !== undefined) {\n setName(core, maybeName);\n }\n\n return core;\n}\n\nfunction checkAndReturnType(\n ctx: ResolutionCtx,\n name: string,\n wgslType: string | undefined,\n jsType: unknown,\n) {\n const resolvedJsType = ctx.resolve(jsType).value.replace(/\\s/g, '');\n\n if (!wgslType) {\n return resolvedJsType;\n }\n\n const resolvedWgslType = wgslType.replace(/\\s/g, '');\n\n if (resolvedWgslType !== resolvedJsType) {\n throw new Error(\n `Type mismatch between TGPU shell and WGSL code string: ${name}, JS type \"${resolvedJsType}\", WGSL type \"${resolvedWgslType}\".`,\n );\n }\n\n return wgslType;\n}\n","import {\n type Decorate,\n type HasCustomLocation,\n type IsBuiltin,\n location,\n} from '../../data/attributes.ts';\nimport { isBuiltin } from '../../data/attributes.ts';\nimport { getCustomLocation, isData } from '../../data/dataTypes.ts';\nimport { struct } from '../../data/struct.ts';\nimport {\n type BaseData,\n isVoid,\n type Location,\n type WgslStruct,\n} from '../../data/wgslTypes.ts';\nimport type { IOData, IOLayout, IORecord } from './fnTypes.ts';\n\nexport type WithLocations<T extends IORecord> = {\n [Key in keyof T]: IsBuiltin<T[Key]> extends true ? T[Key]\n : HasCustomLocation<T[Key]> extends true ? T[Key]\n : Decorate<T[Key], Location>;\n};\n\nexport type IOLayoutToSchema<T extends IOLayout> = T extends BaseData\n ? Decorate<T, Location<0>>\n : T extends IORecord ? WgslStruct<WithLocations<T>>\n // biome-ignore lint/suspicious/noConfusingVoidType: <it actually is void>\n : T extends { type: 'void' } ? void\n : never;\n\nexport function withLocations<T extends IOData>(\n members: IORecord<T> | undefined,\n locations: Record<string, number> = {},\n): WithLocations<IORecord<T>> {\n let nextLocation = 0;\n const usedCustomLocations = new Set<number>();\n\n return Object.fromEntries(\n Object.entries(members ?? {}).map(([key, member]) => {\n const customLocation = getCustomLocation(member);\n\n if (customLocation !== undefined) {\n if (usedCustomLocations.has(customLocation)) {\n throw new Error('Duplicate custom location attributes found');\n }\n usedCustomLocations.add(customLocation);\n }\n\n return [key, member] as const;\n }).map(([key, member]) => {\n if (isBuiltin(member)) { // skipping builtins\n return [key, member];\n }\n\n if (getCustomLocation(member) !== undefined) { // this member is already marked\n return [key, member];\n }\n\n if (locations[key]) { // location has been determined by a previous procedure\n return [key, location(locations[key], member)];\n }\n\n while (usedCustomLocations.has(nextLocation)) {\n nextLocation++;\n }\n return [key, location(nextLocation++, member)];\n }),\n );\n}\n\nexport function createIoSchema<\n T extends IOData,\n Layout extends IORecord<T> | IOLayout<T>,\n>(layout: Layout, locations: Record<string, number> = {}) {\n return (\n isData(layout)\n ? isVoid(layout)\n ? layout\n : isBuiltin(layout)\n ? layout\n : getCustomLocation(layout) !== undefined\n ? layout\n : location(0, layout)\n : struct(withLocations(layout, locations) as Record<string, T>)\n ) as IOLayoutToSchema<Layout>;\n}\n","import type { Implementation } from './fnTypes.ts';\n\nexport function stripTemplate(\n arg: Implementation | TemplateStringsArray,\n ...values: unknown[]\n): Implementation {\n return isTemplateStringsArray(arg)\n ? templateLiteralIdentity(arg, ...values)\n : arg;\n}\n\nfunction isTemplateStringsArray(value: unknown): value is TemplateStringsArray {\n return (\n Array.isArray(value) &&\n 'raw' in value &&\n Array.isArray(value.raw) &&\n value.raw.every((item) => typeof item === 'string')\n );\n}\n\nfunction templateLiteralIdentity(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): string {\n return strings\n .slice(1)\n .reduce(\n (acc, elem, index) => `${acc}${values[index]}${elem}`,\n strings[0] as string,\n );\n}\n","import type {\n AnyVertexInputBuiltin,\n AnyVertexOutputBuiltin,\n OmitBuiltins,\n} from '../../builtin.ts';\nimport type { ResolvedSnippet } from '../../data/snippet.ts';\nimport type {\n Decorated,\n Interpolate,\n Location,\n WgslStruct,\n} from '../../data/wgslTypes.ts';\nimport {\n getName,\n isNamable,\n setName,\n type TgpuNamable,\n} from '../../shared/meta.ts';\nimport { $getNameForward, $internal, $resolve } from '../../shared/symbols.ts';\nimport type { ResolutionCtx, SelfResolvable } from '../../types.ts';\nimport { createFnCore, type FnCore } from './fnCore.ts';\nimport type {\n BaseIOData,\n Implementation,\n InferIO,\n IORecord,\n} from './fnTypes.ts';\nimport { createIoSchema, type IOLayoutToSchema } from './ioSchema.ts';\nimport { stripTemplate } from './templateUtils.ts';\n\n// ----------\n// Public API\n// ----------\n\nexport type VertexInConstrained = IORecord<\n BaseIOData | Decorated<BaseIOData, Location[]> | AnyVertexInputBuiltin\n>;\n\nexport type VertexOutConstrained = IORecord<\n | BaseIOData\n | Decorated<BaseIOData, (Location | Interpolate)[]>\n | AnyVertexOutputBuiltin\n>;\n\n/**\n * Describes a vertex entry function signature (its arguments, return type and attributes)\n */\ntype TgpuVertexFnShellHeader<\n VertexIn extends VertexInConstrained,\n VertexOut extends VertexOutConstrained,\n> = {\n readonly in: VertexIn | undefined;\n readonly out: VertexOut;\n readonly argTypes: [IOLayoutToSchema<VertexIn>] | [];\n readonly isEntry: true;\n};\n\n/**\n * Describes a vertex entry function signature (its arguments, return type and attributes).\n * Allows creating tgpu vertex functions by calling this shell\n * and passing the implementation (as WGSL string or JS function) as the argument.\n */\nexport type TgpuVertexFnShell<\n VertexIn extends VertexInConstrained,\n VertexOut extends VertexOutConstrained,\n> =\n & TgpuVertexFnShellHeader<VertexIn, VertexOut>\n & ((\n implementation: (\n input: InferIO<VertexIn>,\n out: WgslStruct<VertexOut>,\n ) => InferIO<VertexOut>,\n ) => TgpuVertexFn<OmitBuiltins<VertexIn>, OmitBuiltins<VertexOut>>)\n & ((\n implementation: string,\n ) => TgpuVertexFn<OmitBuiltins<VertexIn>, OmitBuiltins<VertexOut>>)\n & ((\n strings: TemplateStringsArray,\n ...values: unknown[]\n ) => TgpuVertexFn<OmitBuiltins<VertexIn>, OmitBuiltins<VertexOut>>);\n\nexport interface TgpuVertexFn<\n VertexIn extends VertexInConstrained = VertexInConstrained,\n VertexOut extends VertexOutConstrained = VertexOutConstrained,\n> extends TgpuNamable {\n readonly [$internal]: true;\n readonly shell: TgpuVertexFnShellHeader<VertexIn, VertexOut>;\n $uses(dependencyMap: Record<string, unknown>): this;\n}\n\nexport function vertexFn<VertexOut extends VertexOutConstrained>(options: {\n out: VertexOut;\n // biome-ignore lint/complexity/noBannedTypes: it's fine\n}): TgpuVertexFnShell<{}, VertexOut>;\n\nexport function vertexFn<\n VertexIn extends VertexInConstrained,\n // Not allowing single-value output, as it is better practice\n // to properly label what the vertex shader is outputting.\n VertexOut extends VertexOutConstrained,\n>(options: {\n in: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut>;\n\n/**\n * Creates a shell of a typed entry function for the vertex shader stage. Any function\n * that implements this shell can run for each vertex, allowing the inner code to process\n * attributes and determine the final position of the vertex.\n *\n * @param options.in\n * Vertex attributes and builtins to be made available to functions that implement this shell.\n * @param options.out\n * A record containing the final position of the vertex, and any information\n * passed onto the fragment shader stage.\n */\nexport function vertexFn<\n VertexIn extends VertexInConstrained,\n // Not allowing single-value output, as it is better practice\n // to properly label what the vertex shader is outputting.\n VertexOut extends VertexOutConstrained,\n>(options: {\n in?: VertexIn;\n out: VertexOut;\n}): TgpuVertexFnShell<VertexIn, VertexOut> {\n if (Object.keys(options.out).length === 0) {\n throw new Error(\n `A vertexFn output cannot be empty since it must include the 'position' builtin.`,\n );\n }\n const shell: TgpuVertexFnShellHeader<VertexIn, VertexOut> = {\n in: options.in,\n out: options.out,\n argTypes: options.in && Object.keys(options.in).length !== 0\n ? [createIoSchema(options.in)]\n : [],\n isEntry: true,\n };\n\n const call = (\n arg: Implementation | TemplateStringsArray,\n ...values: unknown[]\n ) => createVertexFn(shell, stripTemplate(arg, ...values));\n\n return Object.assign(call, shell) as TgpuVertexFnShell<VertexIn, VertexOut>;\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction createVertexFn(\n shell: TgpuVertexFnShellHeader<VertexInConstrained, VertexOutConstrained>,\n implementation: Implementation,\n): TgpuVertexFn<VertexInConstrained, VertexOutConstrained> {\n type This =\n & TgpuVertexFn<VertexInConstrained, VertexOutConstrained>\n & SelfResolvable\n & {\n [$internal]: true;\n [$getNameForward]: FnCore;\n };\n\n const core = createFnCore(implementation, '@vertex ');\n const inputType = shell.argTypes[0];\n\n const result: This = {\n shell,\n\n $uses(newExternals) {\n core.applyExternals(newExternals);\n return this;\n },\n\n [$internal]: true,\n [$getNameForward]: core,\n $name(newLabel: string): This {\n setName(core, newLabel);\n if (isNamable(inputType)) {\n inputType.$name(`${newLabel}_Input`);\n }\n return this;\n },\n\n [$resolve](ctx: ResolutionCtx): ResolvedSnippet {\n const outputWithLocation = createIoSchema(\n shell.out,\n ctx.varyingLocations,\n ).$name(`${getName(this) ?? ''}_Output`);\n\n if (typeof implementation === 'string') {\n if (inputType) {\n core.applyExternals({ In: inputType });\n }\n core.applyExternals({ Out: outputWithLocation });\n }\n\n return core.resolve(\n ctx,\n shell.argTypes,\n outputWithLocation,\n );\n },\n\n toString() {\n return `vertexFn:${getName(core) ?? '<unnamed>'}`;\n },\n };\n return result;\n}\n"],"mappings":"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","names":["applyExternals","existing","newExternals","key","value","getName","setName","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","matched","outputName","identifierRegex","name","replaceExternalsInWgsl","ctx","externalMap","wgsl","acc","externalName","external","externalRegex","isWgsl","isLooseData","hasTinyestMetadata","foundProperties","innerAcc","prop","extractArgs","rawCode","strippedCode","range","strip","code","ParsableString","args","attributes","closingParenthesis","parentheses","identifierEndSymbols","identifier","maybeType","typeEndSymbols","angleBrackets","maybeRet","argsStart","blankSpaces","lineBreaks","openingCommentBlock","commentBlocks","str","#pos","#parseStartPos","substr","i","elem","toFind","brackets","openedBrackets","steps","createFnCore","implementation","fnAttribute","externalsToApply","core","newExternals","ctx","argTypes","returnType","externalMap","externals","applyExternals","id","replacedImpl","replaceExternalsInWgsl","header","body","input","isWgslStruct","attributes","isWgslData","getAttributesString","output","Void","providedArgs","extractArgs","argInfo","i","checkAndReturnType","snip","pluginData","getMetaData","pluginExternals","missing","name","ast","missingExternals","MissingLinksError","getName","maybeSecondArg","undecorate","head","actualReturnType","maybeName","setName","wgslType","jsType","resolvedJsType","resolvedWgslType","withLocations","members","locations","nextLocation","usedCustomLocations","key","member","customLocation","getCustomLocation","isBuiltin","location","createIoSchema","layout","isData","isVoid","struct","stripTemplate","arg","values","isTemplateStringsArray","templateLiteralIdentity","value","item","strings","acc","elem","index","vertexFn","options","shell","createIoSchema","arg","values","createVertexFn","stripTemplate","implementation","core","createFnCore","inputType","newExternals","$internal","$getNameForward","newLabel","setName","isNamable","$resolve","ctx","outputWithLocation","getName"]}
@@ -0,0 +1,2 @@
1
+ import{A as Ae,Ab as Xe,Bb as Ye,Cb as le,Hb as we,La as v,N as R,_a as G,a,db as f,f as D,fb as De,g as ge,ga as ve,kb as i,lb as Re,nb as fe,ob as Ue,pb as Ke,qb as Ne,r as T,rb as Oe,sb as E,tb as Le,ub as Ge,v as Be,vb as Ee,w as C,wb as je,xb as he,yb as qe,zb as Ze}from"./chunk-SHSILTWI.js";var xe=class{};function Pe(e){let t=f({name:e.type,normalImpl:(...s)=>{let l=[];for(let B of s)if(typeof B=="number")l.push(B);else for(let Ve=0;Ve<B.length;++Ve)l.push(B[Ve]);if(l.length!==0&&l.length!==e.columns*e.rows)throw new Error(`'${e.type}' constructor called with invalid number of arguments.`);for(let B=l.length;B<e.columns*e.rows;++B)l.push(0);return new e.MatImpl(...l)},ignoreImplicitCastWarning:!0,signature:(...s)=>({argTypes:s.map(l=>Be(l)?l:i),returnType:r}),codegenImpl:(...s)=>v`${e.type}(${s})`}),r=Object.assign(t,{type:e.type,identity:ut[e.columns],translation:e.columns===4?ct:void 0,scaling:e.columns===4?ot:void 0,rotationX:e.columns===4?lt:void 0,rotationY:e.columns===4?xt:void 0,rotationZ:e.columns===4?mt:void 0});return e.MatImpl.prototype.schema=r,r}var We=class extends xe{[a]=!0;columns;length=4;constructor(...t){super(),this.columns=[this.makeColumn(t[0],t[1]),this.makeColumn(t[2],t[3])]}get 0(){return this.columns[0].x}get 1(){return this.columns[0].y}get 2(){return this.columns[1].x}get 3(){return this.columns[1].y}set 0(t){this.columns[0].x=t}set 1(t){this.columns[0].y=t}set 2(t){this.columns[1].x=t}set 3(t){this.columns[1].y=t}*[Symbol.iterator](){yield this[0],yield this[1],yield this[2],yield this[3]}[D](){return ve(`${this.kind}(${Array.from({length:this.length}).map((t,r)=>this[r]).join(", ")})`,j,"runtime")}toString(){return this[D]().value}},Fe=class extends We{kind="mat2x2f";makeColumn(t,r){return fe(t,r)}},$e=class extends xe{[a]=!0;columns;length=12;constructor(...t){super(),this.columns=[this.makeColumn(t[0],t[1],t[2]),this.makeColumn(t[3],t[4],t[5]),this.makeColumn(t[6],t[7],t[8])]}get 0(){return this.columns[0].x}get 1(){return this.columns[0].y}get 2(){return this.columns[0].z}get 3(){return 0}get 4(){return this.columns[1].x}get 5(){return this.columns[1].y}get 6(){return this.columns[1].z}get 7(){return 0}get 8(){return this.columns[2].x}get 9(){return this.columns[2].y}get 10(){return this.columns[2].z}get 11(){return 0}set 0(t){this.columns[0].x=t}set 1(t){this.columns[0].y=t}set 2(t){this.columns[0].z=t}set 3(t){}set 4(t){this.columns[1].x=t}set 5(t){this.columns[1].y=t}set 6(t){this.columns[1].z=t}set 7(t){}set 8(t){this.columns[2].x=t}set 9(t){this.columns[2].y=t}set 10(t){this.columns[2].z=t}set 11(t){}*[Symbol.iterator](){for(let t=0;t<12;t++)yield this[t]}[D](){return ve(`${this.kind}(${this[0]}, ${this[1]}, ${this[2]}, ${this[4]}, ${this[5]}, ${this[6]}, ${this[8]}, ${this[9]}, ${this[10]})`,q,"runtime")}toString(){return this[D]().value}},Ce=class extends $e{kind="mat3x3f";makeColumn(t,r,s){return E(t,r,s)}},ke=class extends xe{[a]=!0;columns;constructor(...t){super(),this.columns=[this.makeColumn(t[0],t[1],t[2],t[3]),this.makeColumn(t[4],t[5],t[6],t[7]),this.makeColumn(t[8],t[9],t[10],t[11]),this.makeColumn(t[12],t[13],t[14],t[15])]}length=16;get 0(){return this.columns[0].x}get 1(){return this.columns[0].y}get 2(){return this.columns[0].z}get 3(){return this.columns[0].w}get 4(){return this.columns[1].x}get 5(){return this.columns[1].y}get 6(){return this.columns[1].z}get 7(){return this.columns[1].w}get 8(){return this.columns[2].x}get 9(){return this.columns[2].y}get 10(){return this.columns[2].z}get 11(){return this.columns[2].w}get 12(){return this.columns[3].x}get 13(){return this.columns[3].y}get 14(){return this.columns[3].z}get 15(){return this.columns[3].w}set 0(t){this.columns[0].x=t}set 1(t){this.columns[0].y=t}set 2(t){this.columns[0].z=t}set 3(t){this.columns[0].w=t}set 4(t){this.columns[1].x=t}set 5(t){this.columns[1].y=t}set 6(t){this.columns[1].z=t}set 7(t){this.columns[1].w=t}set 8(t){this.columns[2].x=t}set 9(t){this.columns[2].y=t}set 10(t){this.columns[2].z=t}set 11(t){this.columns[2].w=t}set 12(t){this.columns[3].x=t}set 13(t){this.columns[3].y=t}set 14(t){this.columns[3].z=t}set 15(t){this.columns[3].w=t}*[Symbol.iterator](){for(let t=0;t<16;t++)yield this[t]}[D](){return ve(`${this.kind}(${Array.from({length:this.length}).map((t,r)=>this[r]).join(", ")})`,g,"runtime")}toString(){return this[D]().value}},Ie=class extends ke{kind="mat4x4f";makeColumn(t,r,s,l){return he(t,r,s,l)}},st=we(()=>j(1,0,0,1)).$name("identity2"),nt=we(()=>q(1,0,0,0,1,0,0,0,1)).$name("identity3"),at=we(()=>g(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)).$name("identity4"),ut={2:st,3:nt,4:at},ct=f({name:"translation4",normalImpl:e=>g(1,0,0,0,0,1,0,0,0,0,1,0,e.x,e.y,e.z,1),get signature(){return{argTypes:[E],returnType:g}},codegenImpl:e=>v`mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ${e}.x, ${e}.y, ${e}.z, 1)`}),ot=f({name:"scaling4",normalImpl:e=>g(e.x,0,0,0,0,e.y,0,0,0,0,e.z,0,0,0,0,1),get signature(){return{argTypes:[E],returnType:g}},codegenImpl:e=>v`mat4x4f(${e}.x, 0, 0, 0, 0, ${e}.y, 0, 0, 0, 0, ${e}.z, 0, 0, 0, 0, 1)`}),lt=f({name:"rotationX4",normalImpl:e=>g(1,0,0,0,0,Math.cos(e),Math.sin(e),0,0,-Math.sin(e),Math.cos(e),0,0,0,0,1),get signature(){return{argTypes:[i],returnType:g}},codegenImpl:e=>v`mat4x4f(1, 0, 0, 0, 0, cos(${e}), sin(${e}), 0, 0, -sin(${e}), cos(${e}), 0, 0, 0, 0, 1)`}),xt=f({name:"rotationY4",normalImpl:e=>g(Math.cos(e),0,-Math.sin(e),0,0,1,0,0,Math.sin(e),0,Math.cos(e),0,0,0,0,1),get signature(){return{argTypes:[i],returnType:g}},codegenImpl:e=>v`mat4x4f(cos(${e}), 0, -sin(${e}), 0, 0, 1, 0, 0, sin(${e}), 0, cos(${e}), 0, 0, 0, 0, 1)`}),mt=f({name:"rotationZ4",normalImpl:e=>g(Math.cos(e),Math.sin(e),0,0,-Math.sin(e),Math.cos(e),0,0,0,0,1,0,0,0,0,1),get signature(){return{argTypes:[i],returnType:g}},codegenImpl:e=>v`mat4x4f(cos(${e}), sin(${e}), 0, 0, -sin(${e}), cos(${e}), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)`}),j=Pe({type:"mat2x2f",rows:2,columns:2,MatImpl:Fe}),q=Pe({type:"mat3x3f",rows:3,columns:3,MatImpl:Ce}),g=Pe({type:"mat4x4f",rows:4,columns:4,MatImpl:Ie});function Lt(e){return e.kind==="mat3x3f"?[e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]]:Array.from({length:e.length}).map((t,r)=>e[r])}var U=(e,t,r)=>{if(e===t)return 0;let s=n((r-e)/(t-e),0,1);return s*s*(3-2*s)},n=(e,t,r)=>Math.min(Math.max(t,e),r),K=(e,t)=>t===0?e:Math.trunc(e/t);function A(e){let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,e,!0),t.getFloat32(0,!0)}function W(e){let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,e,!0),t.getInt32(0,!0)}var w=Oe[a].jsImpl,z=fe[a].jsImpl,I=Ue[a].jsImpl,ue=Ke[a].jsImpl,Te=Ne[a].jsImpl,b=je[a].jsImpl,h=E[a].jsImpl,F=Le[a].jsImpl,ce=Ge[a].jsImpl,de=Ee[a].jsImpl,M=Ye[a].jsImpl,S=he[a].jsImpl,P=qe[a].jsImpl,oe=Ze[a].jsImpl,pe=Xe[a].jsImpl,Z=e=>Math.sqrt(e.x**2+e.y**2),X=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),Y=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),be=(e,t)=>e.x*t.x+e.y*t.y,Me=(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,ze=(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,o=e=>t=>z(e(t.x),e(t.y)),x=e=>t=>I(e(t.x),e(t.y)),H=e=>t=>ue(e(t.x),e(t.y)),me=e=>t=>Te(e(t.x),e(t.y)),c=e=>t=>h(e(t.x),e(t.y),e(t.z)),m=e=>t=>F(e(t.x),e(t.y),e(t.z)),J=e=>t=>ce(e(t.x),e(t.y),e(t.z)),ye=e=>t=>de(e(t.x),e(t.y),e(t.z)),u=e=>t=>S(e(t.x),e(t.y),e(t.z),e(t.w)),y=e=>t=>P(e(t.x),e(t.y),e(t.z),e(t.w)),Q=e=>t=>oe(e(t.x),e(t.y),e(t.z),e(t.w)),ie=e=>t=>pe(e(t.x),e(t.y),e(t.z),e(t.w)),He=e=>t=>{let r=t.columns;return j(o(e)(r[0]),o(e)(r[1]))},Je=e=>t=>{let r=t.columns;return q(c(e)(r[0]),c(e)(r[1]),c(e)(r[2]))},Qe=e=>t=>{let r=t.columns;return g(u(e)(r[0]),u(e)(r[1]),u(e)(r[2]),u(e)(r[3]))},k=e=>(t,r)=>z(e(t.x,r.x),e(t.y,r.y)),N=e=>(t,r)=>I(e(t.x,r.x),e(t.y,r.y)),ee=e=>(t,r)=>ue(e(t.x,r.x),e(t.y,r.y)),te=e=>(t,r)=>Te(e(t.x,r.x),e(t.y,r.y)),$=e=>(t,r)=>h(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z)),O=e=>(t,r)=>F(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z)),re=e=>(t,r)=>ce(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z)),se=e=>(t,r)=>de(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z)),V=e=>(t,r)=>S(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z),e(t.w,r.w)),L=e=>(t,r)=>P(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z),e(t.w,r.w)),ne=e=>(t,r)=>oe(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z),e(t.w,r.w)),ae=e=>(t,r)=>pe(e(t.x,r.x),e(t.y,r.y),e(t.z,r.z),e(t.w,r.w)),yt=e=>(t,r)=>{let s=t.columns,l=r.columns;return j(k(e)(s[0],l[0]),k(e)(s[1],l[1]))},it=e=>(t,r)=>{let s=t.columns,l=r.columns;return q($(e)(s[0],l[0]),$(e)(s[1],l[1]),$(e)(s[2],l[2]))},Tt=e=>(t,r)=>{let s=t.columns,l=r.columns;return g(V(e)(s[0],l[0]),V(e)(s[1],l[1]),V(e)(s[2],l[2]),V(e)(s[3],l[3]))},dt=e=>(t,r,s)=>z(e(t.x,r.x,s.x),e(t.y,r.y,s.y)),pt=e=>(t,r,s)=>I(e(t.x,r.x,s.x),e(t.y,r.y,s.y)),gt=e=>(t,r,s)=>h(e(t.x,r.x,s.x),e(t.y,r.y,s.y),e(t.z,r.z,s.z)),vt=e=>(t,r,s)=>F(e(t.x,r.x,s.x),e(t.y,r.y,s.y),e(t.z,r.z,s.z)),ft=e=>(t,r,s)=>S(e(t.x,r.x,s.x),e(t.y,r.y,s.y),e(t.z,r.z,s.z),e(t.w,r.w,s.w)),ht=e=>(t,r,s)=>P(e(t.x,r.x,s.x),e(t.y,r.y,s.y),e(t.z,r.z,s.z),e(t.w,r.w,s.w)),d={eq:{vec2f:(e,t)=>w(e.x===t.x,e.y===t.y),vec2h:(e,t)=>w(e.x===t.x,e.y===t.y),vec2i:(e,t)=>w(e.x===t.x,e.y===t.y),vec2u:(e,t)=>w(e.x===t.x,e.y===t.y),"vec2<bool>":(e,t)=>w(e.x===t.x,e.y===t.y),vec3f:(e,t)=>b(e.x===t.x,e.y===t.y,e.z===t.z),vec3h:(e,t)=>b(e.x===t.x,e.y===t.y,e.z===t.z),vec3i:(e,t)=>b(e.x===t.x,e.y===t.y,e.z===t.z),vec3u:(e,t)=>b(e.x===t.x,e.y===t.y,e.z===t.z),"vec3<bool>":(e,t)=>b(e.x===t.x,e.y===t.y,e.z===t.z),vec4f:(e,t)=>M(e.x===t.x,e.y===t.y,e.z===t.z,e.w===t.w),vec4h:(e,t)=>M(e.x===t.x,e.y===t.y,e.z===t.z,e.w===t.w),vec4i:(e,t)=>M(e.x===t.x,e.y===t.y,e.z===t.z,e.w===t.w),vec4u:(e,t)=>M(e.x===t.x,e.y===t.y,e.z===t.z,e.w===t.w),"vec4<bool>":(e,t)=>M(e.x===t.x,e.y===t.y,e.z===t.z,e.w===t.w)},lt:{vec2f:(e,t)=>w(e.x<t.x,e.y<t.y),vec2h:(e,t)=>w(e.x<t.x,e.y<t.y),vec2i:(e,t)=>w(e.x<t.x,e.y<t.y),vec2u:(e,t)=>w(e.x<t.x,e.y<t.y),vec3f:(e,t)=>b(e.x<t.x,e.y<t.y,e.z<t.z),vec3h:(e,t)=>b(e.x<t.x,e.y<t.y,e.z<t.z),vec3i:(e,t)=>b(e.x<t.x,e.y<t.y,e.z<t.z),vec3u:(e,t)=>b(e.x<t.x,e.y<t.y,e.z<t.z),vec4f:(e,t)=>M(e.x<t.x,e.y<t.y,e.z<t.z,e.w<t.w),vec4h:(e,t)=>M(e.x<t.x,e.y<t.y,e.z<t.z,e.w<t.w),vec4i:(e,t)=>M(e.x<t.x,e.y<t.y,e.z<t.z,e.w<t.w),vec4u:(e,t)=>M(e.x<t.x,e.y<t.y,e.z<t.z,e.w<t.w)},or:{"vec2<bool>":(e,t)=>w(e.x||t.x,e.y||t.y),"vec3<bool>":(e,t)=>b(e.x||t.x,e.y||t.y,e.z||t.z),"vec4<bool>":(e,t)=>M(e.x||t.x,e.y||t.y,e.z||t.z,e.w||t.w)},all:{"vec2<bool>":e=>e.x&&e.y,"vec3<bool>":e=>e.x&&e.y&&e.z,"vec4<bool>":e=>e.x&&e.y&&e.z&&e.w},abs:{vec2f:o(Math.abs),vec2h:x(Math.abs),vec2i:H(Math.abs),vec2u:me(Math.abs),vec3f:c(Math.abs),vec3h:m(Math.abs),vec3i:J(Math.abs),vec3u:ye(Math.abs),vec4f:u(Math.abs),vec4h:y(Math.abs),vec4i:Q(Math.abs),vec4u:ie(Math.abs)},atan2:{vec2f:k(Math.atan2),vec2h:N(Math.atan2),vec3f:$(Math.atan2),vec3h:O(Math.atan2),vec4f:V(Math.atan2),vec4h:L(Math.atan2)},acos:{vec2f:o(Math.acos),vec2h:x(Math.acos),vec2i:H(Math.acos),vec2u:me(Math.acos),vec3f:c(Math.acos),vec3h:m(Math.acos),vec3i:J(Math.acos),vec3u:ye(Math.acos),vec4f:u(Math.acos),vec4h:y(Math.acos),vec4i:Q(Math.acos),vec4u:ie(Math.acos)},acosh:{vec2f:o(Math.acosh),vec2h:x(Math.acosh),vec3f:c(Math.acosh),vec3h:m(Math.acosh),vec4f:u(Math.acosh),vec4h:y(Math.acosh)},asin:{vec2f:o(Math.asin),vec2h:x(Math.asin),vec3f:c(Math.asin),vec3h:m(Math.asin),vec4f:u(Math.asin),vec4h:y(Math.asin)},asinh:{vec2f:o(Math.asinh),vec2h:x(Math.asinh),vec3f:c(Math.asinh),vec3h:m(Math.asinh),vec4f:u(Math.asinh),vec4h:y(Math.asinh)},atan:{vec2f:o(Math.atan),vec2h:x(Math.atan),vec3f:c(Math.atan),vec3h:m(Math.atan),vec4f:u(Math.atan),vec4h:y(Math.atan)},atanh:{vec2f:o(Math.atanh),vec2h:x(Math.atanh),vec3f:c(Math.atanh),vec3h:m(Math.atanh),vec4f:u(Math.atanh),vec4h:y(Math.atanh)},ceil:{vec2f:o(Math.ceil),vec2h:x(Math.ceil),vec3f:c(Math.ceil),vec3h:m(Math.ceil),vec4f:u(Math.ceil),vec4h:y(Math.ceil)},clamp:{vec2f:(e,t,r)=>z(n(e.x,t.x,r.x),n(e.y,t.y,r.y)),vec2h:(e,t,r)=>I(n(e.x,t.x,r.x),n(e.y,t.y,r.y)),vec2i:(e,t,r)=>ue(n(e.x,t.x,r.x),n(e.y,t.y,r.y)),vec2u:(e,t,r)=>Te(n(e.x,t.x,r.x),n(e.y,t.y,r.y)),vec3f:(e,t,r)=>h(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z)),vec3h:(e,t,r)=>F(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z)),vec3i:(e,t,r)=>ce(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z)),vec3u:(e,t,r)=>de(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z)),vec4f:(e,t,r)=>S(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z),n(e.w,t.w,r.w)),vec4h:(e,t,r)=>P(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z),n(e.w,t.w,r.w)),vec4i:(e,t,r)=>oe(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z),n(e.w,t.w,r.w)),vec4u:(e,t,r)=>pe(n(e.x,t.x,r.x),n(e.y,t.y,r.y),n(e.z,t.z,r.z),n(e.w,t.w,r.w))},length:{vec2f:Z,vec2h:Z,vec3f:X,vec3h:X,vec4f:Y,vec4h:Y},add:{vec2f:k((e,t)=>e+t),vec2h:N((e,t)=>e+t),vec2i:ee((e,t)=>e+t),vec2u:te((e,t)=>e+t),vec3f:$((e,t)=>e+t),vec3h:O((e,t)=>e+t),vec3i:re((e,t)=>e+t),vec3u:se((e,t)=>e+t),vec4f:V((e,t)=>e+t),vec4h:L((e,t)=>e+t),vec4i:ne((e,t)=>e+t),vec4u:ae((e,t)=>e+t),mat2x2f:yt((e,t)=>e+t),mat3x3f:it((e,t)=>e+t),mat4x4f:Tt((e,t)=>e+t)},smoothstep:{vec2f:dt(U),vec2h:pt(U),vec3f:gt(U),vec3h:vt(U),vec4f:ft(U),vec4h:ht(U)},addMixed:{vec2f:(e,t)=>o(r=>r+t)(e),vec2h:(e,t)=>x(r=>r+t)(e),vec2i:(e,t)=>H(r=>r+t)(e),vec2u:(e,t)=>me(r=>r+t)(e),vec3f:(e,t)=>c(r=>r+t)(e),vec3h:(e,t)=>m(r=>r+t)(e),vec3i:(e,t)=>J(r=>r+t)(e),vec3u:(e,t)=>ye(r=>r+t)(e),vec4f:(e,t)=>u(r=>r+t)(e),vec4h:(e,t)=>y(r=>r+t)(e),vec4i:(e,t)=>Q(r=>r+t)(e),vec4u:(e,t)=>ie(r=>r+t)(e),mat2x2f:(e,t)=>He(r=>r+t)(e),mat3x3f:(e,t)=>Je(r=>r+t)(e),mat4x4f:(e,t)=>Qe(r=>r+t)(e)},mulSxV:{vec2f:(e,t)=>o(r=>e*r)(t),vec2h:(e,t)=>x(r=>e*r)(t),vec2i:(e,t)=>H(r=>e*r)(t),vec2u:(e,t)=>me(r=>e*r)(t),vec3f:(e,t)=>c(r=>e*r)(t),vec3h:(e,t)=>m(r=>e*r)(t),vec3i:(e,t)=>J(r=>e*r)(t),vec3u:(e,t)=>ye(r=>e*r)(t),vec4f:(e,t)=>u(r=>e*r)(t),vec4h:(e,t)=>y(r=>e*r)(t),vec4i:(e,t)=>Q(r=>e*r)(t),vec4u:(e,t)=>ie(r=>e*r)(t),mat2x2f:(e,t)=>He(r=>e*r)(t),mat3x3f:(e,t)=>Je(r=>e*r)(t),mat4x4f:(e,t)=>Qe(r=>e*r)(t)},mulVxV:{vec2f:k((e,t)=>e*t),vec2h:N((e,t)=>e*t),vec2i:ee((e,t)=>e*t),vec2u:te((e,t)=>e*t),vec3f:$((e,t)=>e*t),vec3h:O((e,t)=>e*t),vec3i:re((e,t)=>e*t),vec3u:se((e,t)=>e*t),vec4f:V((e,t)=>e*t),vec4h:L((e,t)=>e*t),vec4i:ne((e,t)=>e*t),vec4u:ae((e,t)=>e*t),mat2x2f:(e,t)=>{let r=e.columns,s=t.columns;return j(r[0].x*s[0].x+r[1].x*s[0].y,r[0].y*s[0].x+r[1].y*s[0].y,r[0].x*s[1].x+r[1].x*s[1].y,r[0].y*s[1].x+r[1].y*s[1].y)},mat3x3f:(e,t)=>{let r=e.columns,s=t.columns;return q(r[0].x*s[0].x+r[1].x*s[0].y+r[2].x*s[0].z,r[0].y*s[0].x+r[1].y*s[0].y+r[2].y*s[0].z,r[0].z*s[0].x+r[1].z*s[0].y+r[2].z*s[0].z,r[0].x*s[1].x+r[1].x*s[1].y+r[2].x*s[1].z,r[0].y*s[1].x+r[1].y*s[1].y+r[2].y*s[1].z,r[0].z*s[1].x+r[1].z*s[1].y+r[2].z*s[1].z,r[0].x*s[2].x+r[1].x*s[2].y+r[2].x*s[2].z,r[0].y*s[2].x+r[1].y*s[2].y+r[2].y*s[2].z,r[0].z*s[2].x+r[1].z*s[2].y+r[2].z*s[2].z)},mat4x4f:(e,t)=>{let r=e.columns,s=t.columns;return g(r[0].x*s[0].x+r[1].x*s[0].y+r[2].x*s[0].z+r[3].x*s[0].w,r[0].y*s[0].x+r[1].y*s[0].y+r[2].y*s[0].z+r[3].y*s[0].w,r[0].z*s[0].x+r[1].z*s[0].y+r[2].z*s[0].z+r[3].z*s[0].w,r[0].w*s[0].x+r[1].w*s[0].y+r[2].w*s[0].z+r[3].w*s[0].w,r[0].x*s[1].x+r[1].x*s[1].y+r[2].x*s[1].z+r[3].x*s[1].w,r[0].y*s[1].x+r[1].y*s[1].y+r[2].y*s[1].z+r[3].y*s[1].w,r[0].z*s[1].x+r[1].z*s[1].y+r[2].z*s[1].z+r[3].z*s[1].w,r[0].w*s[1].x+r[1].w*s[1].y+r[2].w*s[1].z+r[3].w*s[1].w,r[0].x*s[2].x+r[1].x*s[2].y+r[2].x*s[2].z+r[3].x*s[2].w,r[0].y*s[2].x+r[1].y*s[2].y+r[2].y*s[2].z+r[3].y*s[2].w,r[0].z*s[2].x+r[1].z*s[2].y+r[2].z*s[2].z+r[3].z*s[2].w,r[0].w*s[2].x+r[1].w*s[2].y+r[2].w*s[2].z+r[3].w*s[2].w,r[0].x*s[3].x+r[1].x*s[3].y+r[2].x*s[3].z+r[3].x*s[3].w,r[0].y*s[3].x+r[1].y*s[3].y+r[2].y*s[3].z+r[3].y*s[3].w,r[0].z*s[3].x+r[1].z*s[3].y+r[2].z*s[3].z+r[3].z*s[3].w,r[0].w*s[3].x+r[1].w*s[3].y+r[2].w*s[3].z+r[3].w*s[3].w)}},mulMxV:{mat2x2f:(e,t)=>{let r=e.columns;return z(r[0].x*t.x+r[1].x*t.y,r[0].y*t.x+r[1].y*t.y)},mat3x3f:(e,t)=>{let r=e.columns;return h(r[0].x*t.x+r[1].x*t.y+r[2].x*t.z,r[0].y*t.x+r[1].y*t.y+r[2].y*t.z,r[0].z*t.x+r[1].z*t.y+r[2].z*t.z)},mat4x4f:(e,t)=>{let r=e.columns;return S(r[0].x*t.x+r[1].x*t.y+r[2].x*t.z+r[3].x*t.w,r[0].y*t.x+r[1].y*t.y+r[2].y*t.z+r[3].y*t.w,r[0].z*t.x+r[1].z*t.y+r[2].z*t.z+r[3].z*t.w,r[0].w*t.x+r[1].w*t.y+r[2].w*t.z+r[3].w*t.w)}},mulVxM:{mat2x2f:(e,t)=>{let r=t.columns;return z(e.x*r[0].x+e.y*r[0].y,e.x*r[1].x+e.y*r[1].y)},mat3x3f:(e,t)=>{let r=t.columns;return h(e.x*r[0].x+e.y*r[0].y+e.z*r[0].z,e.x*r[1].x+e.y*r[1].y+e.z*r[1].z,e.x*r[2].x+e.y*r[2].y+e.z*r[2].z)},mat4x4f:(e,t)=>{let r=t.columns;return S(e.x*r[0].x+e.y*r[0].y+e.z*r[0].z+e.w*r[0].w,e.x*r[1].x+e.y*r[1].y+e.z*r[1].z+e.w*r[1].w,e.x*r[2].x+e.y*r[2].y+e.z*r[2].z+e.w*r[2].w,e.x*r[3].x+e.y*r[3].y+e.z*r[3].z+e.w*r[3].w)}},div:{vec2f:k((e,t)=>e/t),vec2h:N((e,t)=>e/t),vec2i:ee(K),vec2u:te(K),vec3f:$((e,t)=>e/t),vec3h:O((e,t)=>e/t),vec3i:re(K),vec3u:se(K),vec4f:V((e,t)=>e/t),vec4h:L((e,t)=>e/t),vec4i:ne(K),vec4u:ae(K)},dot:{vec2f:be,vec2h:be,vec2i:be,vec2u:be,vec3f:Me,vec3h:Me,vec3i:Me,vec3u:Me,vec4f:ze,vec4h:ze,vec4i:ze,vec4u:ze},normalize:{vec2f:e=>{let t=Z(e);return z(e.x/t,e.y/t)},vec2h:e=>{let t=Z(e);return I(e.x/t,e.y/t)},vec2i:e=>{let t=Z(e);return ue(e.x/t,e.y/t)},vec2u:e=>{let t=Z(e);return Te(e.x/t,e.y/t)},vec3f:e=>{let t=X(e);return h(e.x/t,e.y/t,e.z/t)},vec3h:e=>{let t=X(e);return F(e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=X(e);return ce(e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=X(e);return de(e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=Y(e);return S(e.x/t,e.y/t,e.z/t,e.w/t)},vec4h:e=>{let t=Y(e);return P(e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=Y(e);return oe(e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=Y(e);return pe(e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>h(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3h:(e,t)=>F(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)},mod:{vec2f:k((e,t)=>e%t),vec2h:N((e,t)=>e%t),vec2i:ee((e,t)=>e%t),vec2u:te((e,t)=>e%t),vec3f:$((e,t)=>e%t),vec3h:O((e,t)=>e%t),vec3i:re((e,t)=>e%t),vec3u:se((e,t)=>e%t),vec4f:V((e,t)=>e%t),vec4h:L((e,t)=>e%t),vec4i:ne((e,t)=>e%t),vec4u:ae((e,t)=>e%t)},floor:{vec2f:o(Math.floor),vec2h:x(Math.floor),vec3f:c(Math.floor),vec3h:m(Math.floor),vec4f:u(Math.floor),vec4h:y(Math.floor)},max:{vec2f:k(Math.max),vec2h:N(Math.max),vec2i:ee(Math.max),vec2u:te(Math.max),vec3f:$(Math.max),vec3h:O(Math.max),vec3i:re(Math.max),vec3u:se(Math.max),vec4f:V(Math.max),vec4h:L(Math.max),vec4i:ne(Math.max),vec4u:ae(Math.max)},min:{vec2f:k(Math.min),vec2h:N(Math.min),vec2i:ee(Math.min),vec2u:te(Math.min),vec3f:$(Math.min),vec3h:O(Math.min),vec3i:re(Math.min),vec3u:se(Math.min),vec4f:V(Math.min),vec4h:L(Math.min),vec4i:ne(Math.min),vec4u:ae(Math.min)},pow:{vec2f:(e,t)=>z(e.x**t.x,e.y**t.y),vec2h:(e,t)=>I(e.x**t.x,e.y**t.y),vec3f:(e,t)=>h(e.x**t.x,e.y**t.y,e.z**t.z),vec3h:(e,t)=>F(e.x**t.x,e.y**t.y,e.z**t.z),vec4f:(e,t)=>S(e.x**t.x,e.y**t.y,e.z**t.z,e.w**t.w),vec4h:(e,t)=>P(e.x**t.x,e.y**t.y,e.z**t.z,e.w**t.w)},sign:{vec2f:o(Math.sign),vec2h:x(Math.sign),vec2i:H(Math.sign),vec3f:c(Math.sign),vec3h:m(Math.sign),vec3i:J(Math.sign),vec4f:u(Math.sign),vec4h:y(Math.sign),vec4i:Q(Math.sign)},sqrt:{vec2f:o(Math.sqrt),vec2h:x(Math.sqrt),vec3f:c(Math.sqrt),vec3h:m(Math.sqrt),vec4f:u(Math.sqrt),vec4h:y(Math.sqrt)},mix:{vec2f:(e,t,r)=>typeof r=="number"?z(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r):z(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y),vec2h:(e,t,r)=>typeof r=="number"?I(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r):I(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y),vec3f:(e,t,r)=>typeof r=="number"?h(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r,e.z*(1-r)+t.z*r):h(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y,e.z*(1-r.z)+t.z*r.z),vec3h:(e,t,r)=>typeof r=="number"?F(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r,e.z*(1-r)+t.z*r):F(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y,e.z*(1-r.z)+t.z*r.z),vec4f:(e,t,r)=>typeof r=="number"?S(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r,e.z*(1-r)+t.z*r,e.w*(1-r)+t.w*r):S(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y,e.z*(1-r.z)+t.z*r.z,e.w*(1-r.w)+t.w*r.w),vec4h:(e,t,r)=>typeof r=="number"?P(e.x*(1-r)+t.x*r,e.y*(1-r)+t.y*r,e.z*(1-r)+t.z*r,e.w*(1-r)+t.w*r):P(e.x*(1-r.x)+t.x*r.x,e.y*(1-r.y)+t.y*r.y,e.z*(1-r.z)+t.z*r.z,e.w*(1-r.w)+t.w*r.w)},sin:{vec2f:o(Math.sin),vec2h:x(Math.sin),vec3f:c(Math.sin),vec3h:m(Math.sin),vec4f:u(Math.sin),vec4h:y(Math.sin)},cos:{vec2f:o(Math.cos),vec2h:x(Math.cos),vec3f:c(Math.cos),vec3h:m(Math.cos),vec4f:u(Math.cos),vec4h:y(Math.cos)},cosh:{vec2f:o(Math.cosh),vec2h:x(Math.cosh),vec3f:c(Math.cosh),vec3h:m(Math.cosh),vec4f:u(Math.cosh),vec4h:y(Math.cosh)},exp:{vec2f:o(Math.exp),vec2h:x(Math.exp),vec3f:c(Math.exp),vec3h:m(Math.exp),vec4f:u(Math.exp),vec4h:y(Math.exp)},exp2:{vec2f:o(e=>2**e),vec2h:x(e=>2**e),vec3f:c(e=>2**e),vec3h:m(e=>2**e),vec4f:u(e=>2**e),vec4h:y(e=>2**e)},log:{vec2f:o(Math.log),vec2h:x(Math.log),vec3f:c(Math.log),vec3h:m(Math.log),vec4f:u(Math.log),vec4h:y(Math.log)},log2:{vec2f:o(Math.log2),vec2h:x(Math.log2),vec3f:c(Math.log2),vec3h:m(Math.log2),vec4f:u(Math.log2),vec4h:y(Math.log2)},fract:{vec2f:o(e=>e-Math.floor(e)),vec2h:x(e=>e-Math.floor(e)),vec3f:c(e=>e-Math.floor(e)),vec3h:m(e=>e-Math.floor(e)),vec4f:u(e=>e-Math.floor(e)),vec4h:y(e=>e-Math.floor(e))},isCloseToZero:{vec2f:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t,vec2h:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t,vec3f:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t&&Math.abs(e.z)<=t,vec3h:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t&&Math.abs(e.z)<=t,vec4f:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t&&Math.abs(e.z)<=t&&Math.abs(e.w)<=t,vec4h:(e,t)=>Math.abs(e.x)<=t&&Math.abs(e.y)<=t&&Math.abs(e.z)<=t&&Math.abs(e.w)<=t},neg:{vec2f:o(e=>-e),vec2h:x(e=>-e),vec2i:H(e=>-e),vec2u:me(e=>-e),"vec2<bool>":e=>w(!e.x,!e.y),vec3f:c(e=>-e),vec3h:m(e=>-e),vec3i:J(e=>-e),vec3u:ye(e=>-e),"vec3<bool>":e=>b(!e.x,!e.y,!e.z),vec4f:u(e=>-e),vec4h:y(e=>-e),vec4i:Q(e=>-e),vec4u:ie(e=>-e),"vec4<bool>":e=>M(!e.x,!e.y,!e.z,!e.w)},select:{vec2f:(e,t,r)=>z(r.x?t.x:e.x,r.y?t.y:e.y),vec2h:(e,t,r)=>I(r.x?t.x:e.x,r.y?t.y:e.y),vec2i:(e,t,r)=>ue(r.x?t.x:e.x,r.y?t.y:e.y),vec2u:(e,t,r)=>Te(r.x?t.x:e.x,r.y?t.y:e.y),"vec2<bool>":(e,t,r)=>w(r.x?t.x:e.x,r.y?t.y:e.y),vec3f:(e,t,r)=>h(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z),vec3h:(e,t,r)=>F(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z),vec3i:(e,t,r)=>ce(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z),vec3u:(e,t,r)=>de(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z),"vec3<bool>":(e,t,r)=>b(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z),vec4f:(e,t,r)=>S(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z,r.w?t.w:e.w),vec4h:(e,t,r)=>P(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z,r.w?t.w:e.w),vec4i:(e,t,r)=>oe(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z,r.w?t.w:e.w),vec4u:(e,t,r)=>pe(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z,r.w?t.w:e.w),"vec4<bool>":(e,t,r)=>M(r.x?t.x:e.x,r.y?t.y:e.y,r.z?t.z:e.z,r.w?t.w:e.w)},tanh:{vec2f:o(Math.tanh),vec2h:x(Math.tanh),vec3f:c(Math.tanh),vec3h:m(Math.tanh),vec4f:u(Math.tanh),vec4h:y(Math.tanh)},bitcastU32toF32:{vec2u:e=>z(A(e.x),A(e.y)),vec3u:e=>h(A(e.x),A(e.y),A(e.z)),vec4u:e=>S(A(e.x),A(e.y),A(e.z),A(e.w))},bitcastU32toI32:{vec2u:e=>ue(W(e.x),W(e.y)),vec3u:e=>ce(W(e.x),W(e.y),W(e.z)),vec4u:e=>oe(W(e.x),W(e.y),W(e.z),W(e.w))}};function et(e,t){if(typeof e=="number"&&typeof t=="number")return e+t;if(typeof e=="number"&&T(t))return d.addMixed[t.kind](t,e);if(T(e)&&typeof t=="number")return d.addMixed[e.kind](e,t);if(T(e)&&T(t)||C(e)&&C(t))return d.add[e.kind](e,t);throw new Error("Add/Sub called with invalid arguments.")}var ar=f({name:"add",signature:(...e)=>{let t=G(e)??e;return{argTypes:t,returnType:R(t[0])?t[1]:t[0]}},normalImpl:et,codegenImpl:(e,t)=>v`(${e} + ${t})`});function wt(e,t){return et(e,tt(-1,t))}var ur=f({name:"sub",signature:(...e)=>{let t=G(e)??e;return{argTypes:t,returnType:R(t[0])?t[1]:t[0]}},normalImpl:wt,codegenImpl:(e,t)=>v`(${e} - ${t})`});function tt(e,t){if(typeof e=="number"&&typeof t=="number")return e*t;if(typeof e=="number"&&(T(t)||C(t)))return d.mulSxV[t.kind](e,t);if((T(e)||C(e))&&typeof t=="number")return d.mulSxV[e.kind](t,e);if(T(e)&&T(t))return d.mulVxV[e.kind](e,t);if(Ae(e)&&C(t))return d.mulVxM[t.kind](e,t);if(C(e)&&Ae(t))return d.mulMxV[e.kind](e,t);if(C(e)&&C(t))return d.mulVxV[e.kind](e,t);throw new Error("Mul called with invalid arguments.")}var cr=f({name:"mul",signature:(...e)=>{let t=G(e)??e,r=R(t[0])?t[1]:R(t[1])||t[0].type.startsWith("vec")?t[0]:t[1].type.startsWith("vec")?t[1]:t[0];return{argTypes:t,returnType:r}},normalImpl:tt,codegenImpl:(e,t)=>v`(${e} * ${t})`});function bt(e,t){if(typeof e=="number"&&typeof t=="number")return e/t;if(typeof e=="number"&&T(t)){let r=le[t.kind][a].jsImpl;return d.div[t.kind](r(e),t)}if(T(e)&&typeof t=="number"){let r=le[e.kind][a].jsImpl;return d.div[e.kind](e,r(t))}if(T(e)&&T(t))return d.div[e.kind](e,t);throw new Error("Div called with invalid arguments.")}var or=f({name:"div",signature:(...e)=>{let t=G(e,[i,Re,De])??e;return{argTypes:t,returnType:R(t[0])?t[1]:t[0]}},normalImpl:bt,codegenImpl:(e,t)=>v`(${e} / ${t})`,ignoreImplicitCastWarning:!0}),lr=f({name:"mod",signature:(...e)=>{let t=G(e)??e;return{argTypes:t,returnType:R(t[0])?t[1]:t[0]}},normalImpl(e,t){if(typeof e=="number"&&typeof t=="number")return e%t;if(typeof e=="number"&&T(t)){let r=le[t.kind];return d.mod[t.kind](r(e),t)}if(T(e)&&typeof t=="number"){let r=le[e.kind];return d.mod[e.kind](e,r(t))}if(T(e)&&T(t))return d.mod[e.kind](e,t);throw new Error("Mod called with invalid arguments, expected types: number or vector.")},codegenImpl:(e,t)=>v`(${e} % ${t})`});function Mt(e){return typeof e=="number"?-e:d.neg[e.kind](e)}var xr=f({name:"neg",signature:e=>({argTypes:[e],returnType:e}),normalImpl:Mt,codegenImpl:e=>v`-(${e})`});function Tr(e){if("multisampled"in e){if(e.multisampled){if(e.dimension==="2d")return _t(e.sampleType);throw new Error(`Multisampled textures only support '2d' dimension, got '${e.dimension}'`)}switch(e.dimension){case"1d":return zt(e.sampleType);case"2d":return St(e.sampleType);case"2d-array":return Vt(e.sampleType);case"3d":return Ft(e.sampleType);case"cube":return At(e.sampleType);case"cube-array":return Wt(e.sampleType);default:throw new Error(`Unsupported texture dimension: '${e.dimension}'`)}}if(!("access"in e))throw new Error("Descriptor is neither a sampled nor a storage texture");switch(e.dimension){case"1d":return $t(e.format,e.access);case"2d":return Ct(e.format,e.access);case"2d-array":return kt(e.format,e.access);case"3d":return It(e.format,e.access);default:throw new Error(`Unsupported storage texture dimension: '${e.dimension}'`)}}function _(e,t){let s=e.startsWith("texture_depth")?["depth","float","unfilterable-float"]:t.sampleType.type==="i32"?["sint"]:t.sampleType.type==="u32"?["uint"]:["float","unfilterable-float"];return{[a]:!0,[ge]:void 0,type:e,bindingSampleType:s,...t}}function Se(e,t){return{[a]:!0,[ge]:void 0,type:e,...t}}var rt=new Map,_e={"write-only":"write","read-only":"read","read-write":"read_write"};function p(e,t){let r=rt.get(e);return r||(r=t(),rt.set(e,r)),r}function zt(e){let t=e||i,r=`texture_1d<${t.type}>`;return p(r,()=>_("texture_1d",{dimension:"1d",sampleType:t,multisampled:!1}))}function St(e){let t=e||i,r=`texture_2d<${t.type}>`;return p(r,()=>_("texture_2d",{dimension:"2d",sampleType:t,multisampled:!1}))}function _t(e){let t=e||i,r=`texture_multisampled_2d<${t.type}>`;return p(r,()=>_("texture_multisampled_2d",{dimension:"2d",sampleType:t,multisampled:!0}))}function Vt(e){let t=e||i,r=`texture_2d_array<${t.type}>`;return p(r,()=>_("texture_2d_array",{dimension:"2d-array",sampleType:t,multisampled:!1}))}function At(e){let t=e||i,r=`texture_cube<${t.type}>`;return p(r,()=>_("texture_cube",{dimension:"cube",sampleType:t,multisampled:!1}))}function Wt(e){let t=e||i,r=`texture_cube_array<${t.type}>`;return p(r,()=>_("texture_cube_array",{dimension:"cube-array",sampleType:t,multisampled:!1}))}function Ft(e){let t=e||i,r=`texture_3d<${t.type}>`;return p(r,()=>_("texture_3d",{dimension:"3d",sampleType:t,multisampled:!1}))}function $t(e,t){let r=t||"write-only",s=`texture_storage_1d<${e}, ${_e[r]}>`;return p(s,()=>Se("texture_storage_1d",{dimension:"1d",format:e,access:r}))}function Ct(e,t){let r=t||"write-only",s=`texture_storage_2d<${e}, ${_e[r]}>`;return p(s,()=>Se("texture_storage_2d",{dimension:"2d",format:e,access:r}))}function kt(e,t){let r=t||"write-only",s=`texture_storage_2d_array<${e}, ${_e[r]}>`;return p(s,()=>Se("texture_storage_2d_array",{dimension:"2d-array",format:e,access:r}))}function It(e,t){let r=t||"write-only",s=`texture_storage_3d<${e}, ${_e[r]}>`;return p(s,()=>Se("texture_storage_3d",{dimension:"3d",format:e,access:r}))}function dr(){return p("texture_depth_2d",()=>_("texture_depth_2d",{dimension:"2d",sampleType:i,multisampled:!1}))}function pr(){return p("texture_depth_multisampled_2d",()=>_("texture_depth_multisampled_2d",{dimension:"2d",sampleType:i,multisampled:!0}))}function gr(){return p("texture_depth_2d_array",()=>_("texture_depth_2d_array",{dimension:"2d-array",sampleType:i,multisampled:!1}))}function vr(){return p("texture_depth_cube",()=>_("texture_depth_cube",{dimension:"cube",sampleType:i,multisampled:!1}))}function fr(){return p("texture_depth_cube_array",()=>_("texture_depth_cube_array",{dimension:"cube-array",sampleType:i,multisampled:!1}))}function hr(){return p("texture_external",()=>({[a]:!0,[ge]:void 0,type:"texture_external",dimension:"2d"}))}function wr(e){return!!e[a]&&typeof e.multisampled=="boolean"}function br(e){return!!e[a]&&typeof e.format=="string"&&typeof e.access=="string"}export{xe as a,st as b,nt as c,at as d,ct as e,ot as f,lt as g,xt as h,mt as i,j,q as k,g as l,Lt as m,U as n,A as o,W as p,d as q,ar as r,ur as s,cr as t,or as u,lr as v,xr as w,Tr as x,_e as y,zt as z,St as A,_t as B,Vt as C,At as D,Wt as E,Ft as F,$t as G,Ct as H,kt as I,It as J,dr as K,pr as L,gr as M,vr as N,fr as O,hr as P,wr as Q,br as R};
2
+ //# sourceMappingURL=chunk-EHLRP4V2.js.map