typegpu 0.1.3 → 0.2.0-alpha.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
@@ -10,7 +10,7 @@
10
10
  **TypeGPU** is a TypeScript library that enhances the WebGPU API, allowing resource management in a type-safe, declarative way.
11
11
 
12
12
  <div align="center">
13
- <video autoplay muted loop src="https://github.com/user-attachments/assets/4dcbdcc6-5aa0-4adc-a40c-468c750d4d76"></video>
13
+ <video autoplay muted loop src="https://github.com/user-attachments/assets/5bca716d-477d-44a1-a839-5df0c8d9044c"></video>
14
14
  </div>
15
15
 
16
16
  ## Documentation
@@ -0,0 +1,8 @@
1
+ var Ke=Object.defineProperty,He=Object.defineProperties;var qe=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var Pe=Object.prototype.hasOwnProperty,_e=Object.prototype.propertyIsEnumerable;var ue=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e);var ie=(e,t,n)=>t in e?Ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rt=(e,t)=>{for(var n in t||(t={}))Pe.call(t,n)&&ie(e,n,t[n]);if(G)for(var n of G(t))_e.call(t,n)&&ie(e,n,t[n]);return e},Ct=(e,t)=>He(e,qe(t));var Ut=(e,t)=>{var n={};for(var r in e)Pe.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&G)for(var r of G(e))t.indexOf(r)<0&&_e.call(e,r)&&(n[r]=e[r]);return n};var s=(e,t,n)=>(ie(e,typeof t!="symbol"?t+"":t,n),n);var Je=function(e,t){this[0]=e,this[1]=t};var f=e=>{var t=e[ue("asyncIterator")],n=!1,r,a={};return t==null?(t=e[ue("iterator")](),r=o=>a[o]=i=>t[o](i)):(t=t.call(e),r=o=>a[o]=i=>{if(n){if(n=!1,o==="throw")throw i;return i}return n=!0,{done:!1,value:new Je(new Promise(y=>{var h=t[o](i);if(!(h instanceof Object))throw TypeError("Object expected");y(h)}),1)}}),a[ue("iterator")]=()=>a,r("next"),"throw"in t?r("throw"):a.throw=o=>{throw o},"return"in t&&r("return"),a};import{MaxValue as Qe,Measurer as Xe,Schema as Ye}from"typed-binary";var Re=class e extends Error{constructor(n,r){let a=r.map(o=>`- ${o}`);a.length>20&&(a=[...a.slice(0,11),"...",...a.slice(-10)]);super(`Resolution of the following tree failed:
2
+ ${a.join(`
3
+ `)}`);this.cause=n;this.trace=r;Object.setPrototypeOf(this,e.prototype)}appendToTrace(n){let r=[n,...this.trace];return new e(this.cause,r)}},Ce=class e extends Error{constructor(n){super(`Missing value for '${n}'`);this.slot=n;Object.setPrototypeOf(this,e.prototype)}},p=class e extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,e.prototype)}},Ue=class e extends Error{constructor(t){var n;super(`Buffer '${(n=t.label)!=null?n:"<unnamed>"}' is not bindable as a uniform. Use .$usage(tgu.Uniform) to allow it.`),Object.setPrototypeOf(this,e.prototype)}};var K=class extends Ye{constructor({schema:n,byteAlignment:r,code:a}){super();s(this,"size");s(this,"byteAlignment");s(this,"expressionCode");s(this,"_innerSchema");s(this,"isLoose",!1);s(this,"label");this._innerSchema=n,this.byteAlignment=r,this.expressionCode=a,this.size=this.measure(Qe).size,this.label=a}resolveReferences(){throw new p}write(n,r){this._innerSchema.write(n,r)}read(n){return this._innerSchema.read(n)}measure(n,r=new Xe){return this._innerSchema.measure(n,r),r}resolve(n){return this.expressionCode}};import*as w from"typed-binary";var le=0;function $t(e){le++;try{return e()}finally{le--}}var z=()=>le>0;var ye=(e,t)=>({__unwrapped:void 0,isLoose:!1,kind:t,size:4,byteAlignment:4,expressionCode:t,write(n,r){e.write(n,r)},read(n){return e.read(n)},measure(n,r=new w.Measurer){return e.measure(n,r),r},resolveReferences(n){throw new p},seekProperty(n,r){throw new Error("Method not implemented.")},resolve(){return t},toString(){return t}}),Kt=new K({schema:w.bool,byteAlignment:4,code:"bool"}),Ze=e=>z()?`u32(${e})`:typeof e=="boolean"?e?1:0:Number.isInteger(e)?((e<0||e>4294967295)&&console.warn(`u32 value ${e} overflowed`),(e&4294967295)>>>0):Math.max(0,Math.min(4294967295,Math.floor(e))),H=Object.assign(Ze,ye(w.u32,"u32")),et=e=>{if(z())return`i32(${e})`;if(typeof e=="boolean")return e?1:0;if(Number.isInteger(e))return(e<-2147483648||e>2147483647)&&console.warn(`i32 value ${e} overflowed`),(e|0)&4294967295;let t=e<0?Math.ceil(e):Math.floor(e);return Math.max(-2147483648,Math.min(2147483647,t))},q=Object.assign(et,ye(w.i32,"i32")),tt=e=>z()?`f32(${e})`:typeof e=="boolean"?e?1:0:e,J=Object.assign(tt,ye(w.f32,"f32"));import{MaxValue as v,Measurer as je,Schema as We}from"typed-binary";function Q(){return new me}var me=class{constructor(){s(this,"label")}$name(t){return this.label=t,this}resolve(t){return t.nameFor(this)}toString(){var t;return`id:${(t=this.label)!=null?t:"<unnamed>"}`}};var nt=["vertex_index","instance_index","position","clip_distances","front_facing","frag_depth","sample_index","sample_mask","fragment","local_invocation_id","local_invocation_index","global_invocation_id","workgroup_id","num_workgroups"],pe=new Map(nt.map(e=>[Symbol(e),e])),Xt=new Map(Array.from(pe).map(([e,t])=>[t,e])),Be=new Map;function Yt(e){let t=pe.get(e);if(!t)throw new Error(`The symbol ${String(e)} in not a valid 'builtin'`);return t}function Me(e){let t=Be.get(e);return t===void 0&&(t=Q().$name(pe.get(e)),Be.set(e,t)),t}var en=Symbol("Unknown data type");function ce(e){return!!e&&(typeof e=="object"||typeof e=="function")&&"resolve"in e}function tn(e){return typeof e=="number"||typeof e=="boolean"||typeof e=="string"||ce(e)}function nn(e){return e==="sampler"||e==="sampler_comparison"}function rn(e){return["texture_depth_2d","texture_depth_2d_array","texture_depth_cube","texture_depth_cube_array","texture_depth_multisampled_2d"].includes(e)}function an(e){return e==="texture_external"}function Le(e){return e.isLoose}function Ee(e){return!e.isLoose}function on(e){return!!e&&typeof e=="object"&&"getMappedRange"in e&&"mapAsync"in e}function sn(e){return e.__brand==="TgpuSlot"}function xe(e,...t){let n=e.flatMap((r,a)=>{let o=t[a];return o===void 0?[r]:Array.isArray(o)?[r,...o]:[r,o]});return new Te(n)}var Te=class{constructor(t){this.segments=t;s(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let n="";for(let r of this.segments)if(ce(r))n+=t.resolve(r);else if(typeof r=="function"){let a=r(o=>t.unwrap(o));n+=t.resolve(a)}else typeof r=="symbol"?(t.addBuiltin(r),n+=t.resolve(Me(r))):n+=String(r);return n}with(t,n){return new de(this,[t,n])}toString(){var t;return`code:${(t=this._label)!=null?t:"<unnamed>"}`}},de=class e{constructor(t,n){this._innerFn=t;this._slotValuePair=n}get label(){return this._innerFn.label}with(t,n){return new e(this,[t,n])}resolve(t){return t.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,a;let[t,n]=this._slotValuePair;return`code:${(r=this.label)!=null?r:"<unnamed>"}[${(a=t.label)!=null?a:"<unnamed>"}=${n}]`}};function rt(e,t){let n="size"in e?e.size:e.currentByteOffset,r=t-1,a=n&r;"skipBytes"in e?e.skipBytes(t-a&r):e.add(t-a&r)}var l=rt;import{Measurer as $e,Schema as Ne}from"typed-binary";var B=(e,t)=>{let n=t-1,r=~n;return e&n?(e&r)+t:e};import{MaxValue as at,Measurer as ot}from"typed-binary";function be(e,t){return fe(e)?new M(e.inner,[t,...e.attributes]):we(e)?new L(e.inner,[t,...e.attributes]):Le(e)?new L(e,[t]):new M(e,[t])}function st(e,t){return be(t,{type:"align",alignment:e})}function ut(e,t){return be(t,{type:"size",size:e})}function it(e,t){return be(t,{type:"location",location:e})}function fe(e){return e instanceof M}function we(e){return e instanceof L}function Fe(e){return e.alignAttrib}function Oe(e){return!fe(e)&&!we(e)?"":e.attributes.map(t=>t.type==="align"?`@align(${t.alignment}) `:t.type==="size"?`@size(${t.size}) `:t.type==="location"?`@location(${t.location}) `:"").join("")}var X=class{constructor(t,n){this.inner=t;this.attributes=n;s(this,"__unwrapped");s(this,"label");s(this,"byteAlignment");s(this,"size");s(this,"alignAttrib");s(this,"sizeAttrib");s(this,"locationAttrib");var r,a,o,i;if(this.alignAttrib=(r=n.find(y=>y.type==="align"))==null?void 0:r.alignment,this.sizeAttrib=(a=n.find(y=>y.type==="size"))==null?void 0:a.size,this.locationAttrib=(o=n.find(y=>y.type==="location"))==null?void 0:o.location,this.byteAlignment=(i=this.alignAttrib)!=null?i:t.byteAlignment,this.size=this.measure(at).size,this.byteAlignment<=0)throw new Error(`Custom data alignment must be a positive number, got: ${this.byteAlignment}.`);if(Math.log2(this.byteAlignment)%1!==0)throw new Error(`Alignment has to be a power of 2, got: ${this.byteAlignment}.`);if(Ee(this.inner)&&this.byteAlignment%this.inner.byteAlignment!==0)throw new Error(`Custom alignment has to be a multiple of the standard data byteAlignment. Got: ${this.byteAlignment}, expected multiple of: ${this.inner.byteAlignment}.`);if(this.size<this.inner.size)throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${this.size}, expected at least: ${this.inner.size}.`);if(this.size<=0)throw new Error(`Custom data size must be a positive number. Got: ${this.size}.`)}resolveReferences(t){throw new p}write(t,n){var a;l(t,(a=this.alignAttrib)!=null?a:1);let r=t.currentByteOffset;this.inner.write(t,n),t.seekTo(r+this.size)}read(t){var a;l(t,(a=this.alignAttrib)!=null?a:1);let n=t.currentByteOffset,r=this.inner.read(t);return t.seekTo(n+this.size),r}measure(t,n=new ot){var r;return l(n,(r=this.alignAttrib)!=null?r:1),this.sizeAttrib!==void 0?n.add(this.sizeAttrib):this.inner.measure(t,n)}seekProperty(t,n){return this.inner.seekProperty(t,n)}},M=class extends X{constructor(){super(...arguments);s(this,"isLoose",!1)}resolve(n){return n.resolve(this.inner)}},L=class extends X{constructor(){super(...arguments);s(this,"isLoose",!0)}};var lt=(e,t)=>new Y(e,t),yt=(e,t)=>new Z(e,t);function ge(e){return e instanceof Y}function mt(e){return e instanceof Z}var Y=class extends Ne{constructor(n,r){super();this.elementType=n;this.elementCount=r;s(this,"_size");s(this,"isRuntimeSized");s(this,"byteAlignment");s(this,"stride");s(this,"isLoose",!1);this.byteAlignment=n.byteAlignment,this.stride=B(n.size,n.byteAlignment),this._size=this.stride*r,this.isRuntimeSized=r===0}get size(){if(this.isRuntimeSized)throw new Error("Cannot get the size of a runtime-sized array");return this._size}write(n,r){if(this.isRuntimeSized)throw new Error("Cannot write a runtime-sized array");l(n,this.byteAlignment);let a=n.currentByteOffset;for(let o=0;o<Math.min(this.elementCount,r.length);o++)l(n,this.byteAlignment),this.elementType.write(n,r[o]);n.seekTo(a+this.size)}read(n){if(this.isRuntimeSized)throw new Error("Cannot read a runtime-sized array");l(n,this.byteAlignment);let r=[];for(let a=0;a<this.elementCount;a++)l(n,this.byteAlignment),r.push(this.elementType.read(n));return l(n,this.byteAlignment),r}measure(n,r=new $e){return this.isRuntimeSized?r.unbounded:(l(r,this.byteAlignment),r.add(this.size))}resolve(n){let r=n.resolve(this.elementType),a=this.isRuntimeSized?`array<${r}>`:`array<${r}, ${this.elementCount}>`;return n.resolve(a)}},Z=class extends Ne{constructor(n,r){var a;super();this.elementType=n;this.elementCount=r;s(this,"byteAlignment");s(this,"size");s(this,"stride");s(this,"isLoose",!0);this.byteAlignment=(a=Fe(n))!=null?a:1,this.stride=B(n.size,this.byteAlignment),this.size=this.stride*r}write(n,r){l(n,this.byteAlignment);let a=n.currentByteOffset;for(let o=0;o<Math.min(this.elementCount,r.length);o++)l(n,this.byteAlignment),this.elementType.write(n,r[o]);n.seekTo(a+this.size)}read(n){l(n,this.byteAlignment);let r=[];for(let a=0;a<this.elementCount;a++)l(n,this.byteAlignment),r.push(this.elementType.read(n));return l(n,this.byteAlignment),r}measure(n,r=new $e){return l(r,this.byteAlignment),r.add(this.size)}};var pt=e=>new ee(e),ct=e=>new te(e);function Tt(e){return e instanceof ee}function dt(e){return e instanceof te}function xt([e,t]){return xe` ${Oe(t)}${e}: ${t},\n`}var ee=class extends We{constructor(n){super();this.properties=n;s(this,"_label");s(this,"_size");s(this,"byteAlignment");s(this,"isLoose",!1);s(this,"isRuntimeSized");this.byteAlignment=Object.values(n).map(r=>r.byteAlignment).reduce((r,a)=>r>a?r:a),this._size=this.measure(v).size,this.isRuntimeSized=Number.isNaN(this._size)}get size(){if(this.isRuntimeSized)throw new Error("Cannot get size of struct with runtime sized properties");return this._size}get label(){return this._label}$name(n){return this._label=n,this}resolveReferences(){throw new p}write(n,r){if(this.isRuntimeSized)throw new Error("Cannot write struct with runtime sized properties");l(n,this.byteAlignment);for(let[a,o]of Object.entries(this.properties))l(n,o.byteAlignment),o.write(n,r[a]);l(n,this.byteAlignment)}read(n){if(this.isRuntimeSized)throw new Error("Cannot read struct with runtime sized properties");l(n,this.byteAlignment);let r={};for(let[a,o]of Object.entries(this.properties))l(n,o.byteAlignment),r[a]=o.read(n);return l(n,this.byteAlignment),r}measure(n,r=new je){let a=r;l(a,this.byteAlignment);let o=n===v;for(let[i,y]of Object.entries(this.properties)){if(a.isUnbounded)throw new Error("Only the last property of a struct can be unbounded");if(l(a,y.byteAlignment),a=y.measure(o?v:n[i],a),a.isUnbounded&&!ge(y))throw new Error("Cannot nest unbounded struct within another struct")}return l(a,this.byteAlignment),a}resolve(n){let r=Q().$name(this._label);return n.addDeclaration(xe`
4
+ struct ${r} {
5
+ ${Object.entries(this.properties).map(xt)}\
6
+ }
7
+ `),n.resolve(r)}},te=class extends We{constructor(n){super();this.properties=n;s(this,"_label");s(this,"byteAlignment",1);s(this,"isLoose",!0);s(this,"size");this.size=this.measure(v).size}get label(){return this._label}$name(n){return this._label=n,this}resolveReferences(){throw new p}write(n,r){for(let[a,o]of Object.entries(this.properties))o.write(n,r[a])}read(n){let r={};for(let[a,o]of Object.entries(this.properties))r[a]=o.read(n);return r}measure(n,r=new je){let a=n===v;for(let[o,i]of Object.entries(this.properties))i.measure(a?v:n[o],r);return r}};import{Measurer as bt,f32 as he,i32 as ze,u32 as ve}from"typed-binary";function g(e){let t={__unwrapped:void 0,isLoose:!1,size:e.length*4,label:e.label,byteAlignment:e.byteAlignment,kind:e.label,expressionCode:e.label,resolveReferences(r){throw new p},write(r,a){for(let o of a)e.unitType.write(r,o)},read(r){return e.make(...Array.from({length:e.length}).map(a=>e.unitType.read(r)))},measure(r,a=new bt){return a.add(this.size)},seekProperty(r,a){throw new Error("Method not implemented.")},resolve(){return e.label},toString(){return e.label}};return Object.assign((...r)=>{var o;let a=r;if(z())return`${t.kind}(${a.join(", ")})`;if(a.length<=1)return e.makeFromScalar((o=a[0])!=null?o:0);if(a.length===e.length)return e.make(...a);throw new Error(`'${e.label}' constructor called with invalid number of arguments.`)},t)}var E=class{constructor(t,n){this.x=t;this.y=n;s(this,"length",2)}*[Symbol.iterator](){yield this.x,yield this.y}get 0(){return this.x}get 1(){return this.y}set 0(t){this.x=t}set 1(t){this.y=t}},A=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2f")}make2(n,r){return new e(n,r)}make3(n,r,a){return new k(n,r,a)}make4(n,r,a,o){return new P(n,r,a,o)}},D=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2i")}make2(n,r){return new e(n,r)}make3(n,r,a){return new V(n,r,a)}make4(n,r,a,o){return new _(n,r,a,o)}},S=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2u")}make2(n,r){return new e(n,r)}make3(n,r,a){return new I(n,r,a)}make4(n,r,a,o){return new R(n,r,a,o)}},F=class{constructor(t,n,r){this.x=t;this.y=n;this.z=r;s(this,"length",3)}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}set 0(t){this.x=t}set 1(t){this.y=t}set 2(t){this.z=t}},k=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3f")}make2(n,r){return new A(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new P(n,r,a,o)}},V=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3i")}make2(n,r){return new D(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new _(n,r,a,o)}},I=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3u")}make2(n,r){return new S(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new R(n,r,a,o)}},O=class{constructor(t,n,r,a){this.x=t;this.y=n;this.z=r;this.w=a;s(this,"length",4)}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}get 3(){return this.w}set 0(t){this.x=t}set 1(t){this.y=t}set 2(t){this.z=t}set 3(t){this.w=t}},P=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4f")}make2(n,r){return new A(n,r)}make3(n,r,a){return new k(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},_=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4i")}make2(n,r){return new D(n,r)}make3(n,r,a){return new V(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},R=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4u")}make2(n,r){return new S(n,r)}make3(n,r,a){return new I(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},m={get:(e,t)=>{if(typeof t=="symbol"||!Number.isNaN(Number.parseInt(t)))return Reflect.get(e,t);let n=e,r=new Array(t.length),a=0;for(let o of t){switch(o){case"x":r[a]=n.x;break;case"y":r[a]=n.y;break;case"z":r[a]=n.z;break;case"w":r[a]=n.w;break;default:return Reflect.get(n,t)}a++}return t.length===4?new Proxy(n.make4(r[0],r[1],r[2],r[3]),m):t.length===3?new Proxy(n.make3(r[0],r[1],r[2]),m):t.length===2?new Proxy(n.make2(r[0],r[1]),m):Reflect.get(e,t)}},x=g({unitType:he,byteAlignment:8,length:2,label:"vec2f",make:(e,t)=>new Proxy(new A(e,t),m),makeFromScalar:e=>new Proxy(new A(e,e),m)}),$=g({unitType:ze,byteAlignment:8,length:2,label:"vec2i",make:(e,t)=>new Proxy(new D(e,t),m),makeFromScalar:e=>new Proxy(new D(e,e),m)}),N=g({unitType:ve,byteAlignment:8,length:2,label:"vec2u",make:(e,t)=>new Proxy(new S(e,t),m),makeFromScalar:e=>new Proxy(new S(e,e),m)}),C=g({unitType:he,byteAlignment:16,length:3,label:"vec3f",make:(e,t,n)=>new Proxy(new k(e,t,n),m),makeFromScalar:e=>new Proxy(new k(e,e,e),m)}),Ae=g({unitType:ze,byteAlignment:16,length:3,label:"vec3i",make:(e,t,n)=>new Proxy(new V(e,t,n),m),makeFromScalar:e=>new Proxy(new V(e,e,e),m)}),De=g({unitType:ve,byteAlignment:16,length:3,label:"vec3u",make:(e,t,n)=>new Proxy(new I(e,t,n),m),makeFromScalar:e=>new Proxy(new I(e,e,e),m)}),T=g({unitType:he,byteAlignment:16,length:4,label:"vec4f",make:(e,t,n,r)=>new Proxy(new P(e,t,n,r),m),makeFromScalar:e=>new Proxy(new P(e,e,e,e),m)}),j=g({unitType:ze,byteAlignment:16,length:4,label:"vec4i",make:(e,t,n,r)=>new Proxy(new _(e,t,n,r),m),makeFromScalar:e=>new Proxy(new _(e,e,e,e),m)}),W=g({unitType:ve,byteAlignment:16,length:4,label:"vec4u",make:(e,t,n,r)=>new Proxy(new R(e,t,n,r),m),makeFromScalar:e=>new Proxy(new R(e,e,e,e),m)});import{Measurer as ft}from"typed-binary";function Ie(e){let t={__unwrapped:void 0,isLoose:!1,label:e.label,byteAlignment:e.columnType.byteAlignment,size:B(e.columnType.size*e.columns,e.columnType.byteAlignment),resolveReferences(){throw new p},write(r,a){for(let o of a.columns)e.columnType.write(r,o)},read(r){let a=new Array(e.columns);for(let o=0;o<e.columns;++o)a[o]=e.columnType.read(r);return e.makeFromColumnVectors(...a)},measure(r,a=new ft){return a.add(this.size)},seekProperty(){throw new Error("Method not implemented.")},resolve(){return e.label}};return Object.assign((...r)=>{let a=[];for(let o of r)typeof o=="number"?a.push(o):a.push(...o);for(let o=a.length;o<e.columns*e.rows;++o)a.push(0);return e.makeFromElements(...a)},t)}var Se=class{constructor(...t){s(this,"columns");s(this,"length",4);this.columns=[this.makeColumn(t[0],t[1]),this.makeColumn(t[2],t[3])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1])}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}},ne=class extends Se{makeColumn(t,n){return x(t,n)}},ke=class{constructor(...t){s(this,"columns");s(this,"length",12);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])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1]),yield*f(this.columns[2])}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){}},re=class extends ke{makeColumn(t,n,r){return C(t,n,r)}},Ve=class{constructor(...t){s(this,"columns");s(this,"length",16);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])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1]),yield*f(this.columns[2]),yield*f(this.columns[3])}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}},ae=class extends Ve{makeColumn(t,n,r,a){return T(t,n,r,a)}},Gn=Ie({label:"mat2x2f",columnType:x,rows:2,columns:2,makeFromColumnVectors:(...e)=>new ne(...e[0],...e[1]),makeFromElements:(...e)=>new ne(...e)}),Kn=Ie({label:"mat3x3f",columnType:C,rows:3,columns:3,makeFromColumnVectors(...[e,t,n]){return new re(...e,...t,...n)},makeFromElements:(...e)=>new re(...e)}),Hn=Ie({label:"mat4x4f",columnType:T,rows:4,columns:4,makeFromColumnVectors(...[e,t,n,r]){return new ae(...e,...t,...n,...r)},makeFromElements:(...e)=>new ae(...e)});import{BufferReader as wt,Measurer as gt,Schema as ht}from"typed-binary";var u=class extends ht{constructor(n,r){var o;super();this.size=n;this.kind=r;s(this,"underlyingType");s(this,"elementSize");s(this,"elementCount");s(this,"isSigned");s(this,"byteAlignment",1);s(this,"isLoose",!0);this.underlyingType=Dt[r],this.isSigned=(o=St[r])!=null?o:!1,this.elementCount=this.underlyingType.size/4;let a=n/this.elementCount;if(a!==1&&a!==2&&a!==4)throw new Error("Invalid element size");this.elementSize=a}write(n,r){if(typeof r=="number"){switch(this.underlyingType){case H:n.writeUint32(r);break;case J:n.writeFloat32(r);break;case q:n.writeInt32(r);break;default:throw new Error("Invalid underlying type")}return}zt(n,r,this.elementSize,this.isSigned)}read(n){let r=new ArrayBuffer(this.size),a=new DataView(r);for(let d=0;d<this.size;d++)a.setUint8(d,n.readByte());if(this.elementCount===1)switch(this.underlyingType){case H:return a.getUint32(0);case J:return a.getFloat32(0);case q:return a.getInt32(0);default:throw new Error("Invalid underlying type")}let o=this.underlyingType,i=Ge[o.label],y=new Array(this.elementCount),h=new wt(r);for(let d=0;d<this.elementCount;d++)y[d]=At(i,this.elementSize,h,this.isSigned);switch(o){case N:case x:case $:return o(y[0],y[1]);case De:case C:case Ae:return o(y[0],y[1],y[2]);case W:case T:case j:return o(y[0],y[1],y[2],y[3]);default:throw new Error("Invalid underlying type")}}measure(n,r=new gt){return r.add(this.size)}},Ge={vec2u:"u32",vec3u:"u32",vec4u:"u32",vec2f:"f32",vec3f:"f32",vec4f:"f32",vec2i:"i32",vec3i:"i32",vec4i:"i32"};function zt(e,t,n,r){let a=Ge[t.kind];for(let o of t)vt(a,o,n,e,r)}function vt(e,t,n,r,a=!0){let o=new ArrayBuffer(n),i=new DataView(o),y=(c,U)=>{let se=a?U*127+128:U*255;i.setUint8(c,Math.floor(se))},h=(c,U)=>{let se=a?U*32767+32768:U*65535;i.setUint16(c,Math.floor(se))},b={u32:[i.setUint8,i.setUint16,i.setUint32],f32:[y,h,i.setFloat32],i32:[i.setInt8,i.setInt16,i.setInt32]}[e][Math.log2(n)];b&&b.call(i,0,t);for(let c=0;c<n;c++)r.writeByte(i.getUint8(c))}function At(e,t,n,r=!0){let a=new ArrayBuffer(t),o=new DataView(a);for(let b=0;b<t;b++)o.setUint8(b,n.readByte());let i=b=>{let c=o.getUint8(b);return r?(c-128)/127:c/255},y=b=>{let c=o.getUint16(b);return r?(c-32768)/32767:c/65535},d={u32:[o.getUint8,o.getUint16,o.getUint32],f32:[i,y,o.getFloat32],i32:[o.getInt8,o.getInt16,o.getInt32]}[e][Math.log2(t)];if(d)return d.call(o,0);throw new Error("Invalid primitive")}var Dt={uint8x2:N,uint8x4:W,sint8x2:$,sint8x4:j,unorm8x2:x,unorm8x4:T,snorm8x2:x,snorm8x4:T,uint16x2:N,uint16x4:W,sint16x2:$,sint16x4:j,unorm16x2:x,unorm16x4:T,snorm16x2:x,snorm16x4:T,float16x2:x,float16x4:T,float32:J,float32x2:x,float32x3:C,float32x4:T,uint32:H,uint32x2:N,uint32x3:De,uint32x4:W,sint32:q,sint32x2:$,sint32x3:Ae,sint32x4:j,unorm10_10_10_2:T},St={unorm8x2:!1,unorm8x4:!1,snorm8x2:!0,snorm8x4:!0,unorm16x2:!1,unorm16x4:!1,snorm16x2:!0,snorm16x4:!0,float16x2:!0,float16x4:!0,unorm10_10_10_2:!1},Zn=new u(2,"uint8x2"),er=new u(4,"uint8x4"),tr=new u(2,"sint8x2"),nr=new u(4,"sint8x4"),rr=new u(2,"unorm8x2"),ar=new u(4,"unorm8x4"),or=new u(2,"snorm8x2"),sr=new u(4,"snorm8x4"),ur=new u(4,"uint16x2"),ir=new u(8,"uint16x4"),lr=new u(4,"sint16x2"),yr=new u(8,"sint16x4"),mr=new u(4,"unorm16x2"),pr=new u(8,"unorm16x4"),cr=new u(4,"snorm16x2"),Tr=new u(8,"snorm16x4"),dr=new u(4,"float16x2"),xr=new u(8,"float16x4"),br=new u(4,"float32"),fr=new u(8,"float32x2"),wr=new u(12,"float32x3"),gr=new u(16,"float32x4"),hr=new u(4,"uint32"),zr=new u(8,"uint32x2"),vr=new u(12,"uint32x3"),Ar=new u(16,"uint32x4"),Dr=new u(4,"sint32"),Sr=new u(8,"sint32x2"),kr=new u(12,"sint32x3"),Vr=new u(16,"sint32x4"),Ir=new u(4,"unorm10_10_10_2");function kt(e){return{scope:"function",pointsTo:e}}import{Measurer as Vt,Schema as It}from"typed-binary";function Pt(e){return new oe(e)}function _t(e){return e instanceof oe}var oe=class extends It{constructor(n){super();this.innerData=n;s(this,"size");s(this,"byteAlignment");s(this,"isLoose",!1);this.size=this.innerData.size,this.byteAlignment=this.innerData.byteAlignment}resolveReferences(){throw new p}write(n,r){this.innerData.write(n,r)}read(n){return this.innerData.read(n)}measure(n,r=new Vt){return this.innerData.measure(n,r)}resolve(n){return`atomic<${n.resolve(this.innerData)}>`}};export{Rt as a,Ct as b,Ut as c,s as d,$t as e,z as f,Re as g,Ce as h,p as i,Ue as j,K as k,Kt as l,H as m,q as n,J as o,pe as p,Xt as q,Yt as r,Me as s,en as t,ce as u,tn as v,nn as w,rn as x,an as y,on as z,sn as A,xe as B,st as C,ut as D,it as E,fe as F,we as G,lt as H,yt as I,ge as J,mt as K,pt as L,ct as M,Tt as N,dt as O,x as P,$ as Q,N as R,C as S,Ae as T,De as U,T as V,j as W,W as X,Gn as Y,Kn as Z,Hn as _,Zn as $,er as aa,tr as ba,nr as ca,rr as da,ar as ea,or as fa,sr as ga,ur as ha,ir as ia,lr as ja,yr as ka,mr as la,pr as ma,cr as na,Tr as oa,dr as pa,xr as qa,br as ra,fr as sa,wr as ta,gr as ua,hr as va,zr as wa,vr as xa,Ar as ya,Dr as za,Sr as Aa,kr as Ba,Vr as Ca,Ir as Da,kt as Ea,Pt as Fa,_t as Ga};
8
+ //# sourceMappingURL=chunk-5EPBCOO4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/std140.ts","../src/errors.ts","../src/data/numeric.ts","../src/gpuMode.ts","../src/data/struct.ts","../src/tgpuIdentifier.ts","../src/builtinIdentifiers.ts","../src/types.ts","../src/tgpuCode.ts","../src/data/alignIO.ts","../src/data/array.ts","../src/mathUtils.ts","../src/data/attributes.ts","../src/data/vector.ts","../src/data/matrix.ts","../src/data/vertexFormatData.ts","../src/data/pointer.ts","../src/data/atomic.ts"],"sourcesContent":["/*\n * Typed-binary types that adhere to the `std140` layout rules.\n */\n\nimport {\n type AnySchema,\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\n\nexport class SimpleTgpuData<TSchema extends AnySchema>\n extends Schema<Unwrap<TSchema>>\n implements TgpuData<Unwrap<TSchema>>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly expressionCode: string;\n\n private readonly _innerSchema: TSchema;\n public readonly isLoose = false as const;\n public readonly label?: string | undefined;\n\n /**\n * byteAlignment has to be a power of 2\n */\n constructor({\n schema,\n byteAlignment,\n code,\n }: {\n schema: TSchema;\n byteAlignment: number;\n code: string;\n }) {\n super();\n\n this._innerSchema = schema;\n this.byteAlignment = byteAlignment;\n this.expressionCode = code;\n this.size = this.measure(MaxValue).size;\n this.label = code;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this._innerSchema.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this._innerSchema.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n this._innerSchema.measure(value, measurer);\n\n return measurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return this.expressionCode;\n }\n}\n","import type { TgpuBuffer } from './core/buffer/buffer';\nimport type { AnyTgpuData, TgpuResolvable, TgpuSlot } from './types';\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: TgpuResolvable[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(`Resolution of the following tree failed: \\n${entries.join('\\n')}`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: TgpuResolvable): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: TgpuSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class RecursiveDataTypeError extends Error {\n constructor() {\n super('Recursive types are not supported in WGSL');\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RecursiveDataTypeError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotUniformError extends Error {\n constructor(value: TgpuBuffer<AnyTgpuData>) {\n super(\n `Buffer '${value.label ?? '<unnamed>'}' is not bindable as a uniform. Use .$usage(tgu.Uniform) to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotUniformError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotStorageError extends Error {\n constructor(value: TgpuBuffer<AnyTgpuData>) {\n super(\n `Buffer '${value.label ?? '<unnamed>'}' is not bindable as storage. Use .$usage(tgu.Storage) to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotStorageError.prototype);\n }\n}\n\nexport class MissingLinksError extends Error {\n constructor(fnLabel: string | undefined, externalNames: string[]) {\n super(\n `The function '${fnLabel ?? '<unnamed>'}' is missing links to the following external values: ${externalNames}.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingLinksError.prototype);\n }\n}\n","import * as TB from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { inGPUMode } from '../gpuMode';\nimport type { TgpuData } from '../types';\nimport { SimpleTgpuData } from './std140';\n\nconst primitiveNumeric = <TKind extends string>(\n schema: TB.Uint32Schema | TB.Float32Schema | TB.Int32Schema,\n code: TKind,\n) => {\n return {\n // Type-token, not available at runtime\n __unwrapped: undefined as unknown as number,\n\n isLoose: false as const,\n kind: code,\n size: 4,\n byteAlignment: 4,\n expressionCode: code,\n\n write(output: TB.ISerialOutput, value: number): void {\n schema.write(output, value);\n },\n\n read(input: TB.ISerialInput): number {\n return schema.read(input);\n },\n\n measure(\n value: number | TB.MaxValue,\n measurer: TB.IMeasurer = new TB.Measurer(),\n ): TB.IMeasurer {\n schema.measure(value, measurer);\n return measurer;\n },\n\n resolveReferences(ctx: TB.IRefResolver): void {\n throw new RecursiveDataTypeError();\n },\n\n seekProperty(\n reference: number | TB.MaxValue,\n prop: never,\n ): { bufferOffset: number; schema: TB.ISchema<unknown> } | null {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return code;\n },\n\n toString(): string {\n return code;\n },\n };\n};\n\n/**\n * Boolean schema representing a single WGSL bool value.\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport type Bool = TgpuData<boolean>;\n/**\n * A schema that represents a boolean value. (equivalent to `bool` in WGSL)\n */\nexport const bool: Bool = new SimpleTgpuData({\n schema: TB.bool,\n byteAlignment: 4,\n code: 'bool',\n});\n\n/**\n * Unsigned 32-bit integer schema representing a single WGSL u32 value.\n */\nexport type U32 = TgpuData<number> & { kind: 'u32' } & ((\n v: number | boolean,\n ) => number);\nconst u32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `u32(${v})` as unknown as number;\n }\n\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < 0 || v > 0xffffffff) {\n console.warn(`u32 value ${v} overflowed`);\n }\n const value = v & 0xffffffff;\n return value >>> 0;\n }\n return Math.max(0, Math.min(0xffffffff, Math.floor(v)));\n};\n/**\n * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)\n *\n * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = u32(3.14); // 3\n * @example\n * const value = u32(-1); // 4294967295\n * @example\n * const value = u32(-3.1); // 0\n */\nexport const u32: U32 = Object.assign(u32Cast, primitiveNumeric(TB.u32, 'u32'));\n\n/**\n * Signed 32-bit integer schema representing a single WGSL i32 value.\n */\nexport type I32 = TgpuData<number> & { kind: 'i32' } & ((\n v: number | boolean,\n ) => number);\nconst i32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `i32(${v})` as unknown as number;\n }\n\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (Number.isInteger(v)) {\n if (v < -0x80000000 || v > 0x7fffffff) {\n console.warn(`i32 value ${v} overflowed`);\n }\n const value = v | 0;\n return value & 0xffffffff;\n }\n // round towards zero\n const value = v < 0 ? Math.ceil(v) : Math.floor(v);\n return Math.max(-0x80000000, Math.min(0x7fffffff, value));\n};\n/**\n * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)\n *\n * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = i32(3.14); // 3\n * @example\n * const value = i32(-3.9); // -3\n * @example\n * const value = i32(10000000000) // 1410065408\n */\nexport const i32: I32 = Object.assign(i32Cast, primitiveNumeric(TB.i32, 'i32'));\n\n/**\n * 32-bit float schema representing a single WGSL f32 value.\n */\nexport type F32 = TgpuData<number> & { kind: 'f32' } & ((\n v: number | boolean,\n ) => number);\nconst f32Cast = (v: number | boolean) => {\n if (inGPUMode()) {\n return `f32(${v})` as unknown as number;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return v;\n};\n/**\n * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)\n *\n * Can also be called to cast a value to an f32.\n *\n * @example\n * const value = f32(true); // 1\n */\nexport const f32: F32 = Object.assign(f32Cast, primitiveNumeric(TB.f32, 'f32'));\n","let gpuDepth = 0;\n\nexport function onGPU<T>(callback: () => T): T {\n gpuDepth++;\n try {\n return callback();\n } finally {\n gpuDepth--;\n }\n}\n\nexport const inGPUMode = () => gpuDepth > 0;\n","import {\n type IMeasurer,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type UnwrapRecord,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { TgpuNamable } from '../namable';\nimport { code } from '../tgpuCode';\nimport { identifier } from '../tgpuIdentifier';\nimport type {\n AnyTgpuData,\n AnyTgpuLooseData,\n ResolutionCtx,\n TgpuData,\n TgpuLooseData,\n} from '../types';\nimport alignIO from './alignIO';\nimport { isArraySchema } from './array';\nimport { getAttributesString } from './attributes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBaseStruct<TProps extends Record<string, unknown>>\n extends ISchema<UnwrapRecord<TProps>> {\n readonly properties: TProps;\n}\n\n/**\n * Struct schema constructed via `d.struct` function.\n *\n * Responsible for handling reading and writing struct values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its members.\n */\nexport interface TgpuStruct<TProps extends Record<string, AnyTgpuData>>\n extends TgpuBaseStruct<TProps>,\n TgpuData<UnwrapRecord<TProps>>,\n TgpuNamable {}\n\n/**\n * Creates a struct schema that can be used to construct GPU buffers.\n * Ensures proper alignment and padding of properties (as opposed to a `d.looseStruct` schema).\n * The order of members matches the passed in properties object.\n *\n * @example\n * const CircleStruct = d.struct({ radius: d.f32, pos: d.vec3f });\n *\n * @param properties Record with `string` keys and `TgpuData` values,\n * each entry describing one struct member.\n */\nexport const struct = <TProps extends Record<string, AnyTgpuData>>(\n properties: TProps,\n): TgpuStruct<TProps> => new TgpuStructImpl(properties);\n\n/**\n * Struct schema constructed via `d.looseStruct` function.\n *\n * Useful for defining vertex buffers, as the standard layout restrictions do not apply.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface TgpuLooseStruct<\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n> extends TgpuBaseStruct<TProps>,\n TgpuLooseData<UnwrapRecord<TProps>> {}\n\n/**\n * Creates a loose struct schema that can be used to construct vertex buffers.\n * Describes structs with members of both loose and non-loose types.\n *\n * The order of members matches the passed in properties object.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const CircleStruct = d.looseStruct({ radius: d.f32, pos: d.vec3f }); // packed struct with no padding\n *\n * @example\n * const CircleStruct = d.looseStruct({ radius: d.f32, pos: d.align(16, d.vec3f) });\n *\n * @param properties Record with `string` keys and `TgpuData` or `TgpuLooseData` values,\n * each entry describing one struct member.\n */\nexport const looseStruct = <\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n>(\n properties: TProps,\n): TgpuLooseStruct<TProps> => new TgpuLooseStructImpl(properties);\n\n/**\n * Checks whether passed in value is a struct schema,\n * as opposed to, e.g., a looseStruct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas looseStruct schemas cannot.\n *\n * @example\n * isStructSchema(d.struct({ a: d.u32 })) // true\n * isStructSchema(d.looseStruct({ a: d.u32 })) // false\n * isStructSchema(d.vec3f) // false\n */\nexport function isStructSchema<\n T extends TgpuStruct<Record<string, AnyTgpuData>>,\n>(schema: T | unknown): schema is T {\n return schema instanceof TgpuStructImpl;\n}\n\n/**\n * Checks whether passed in value is a looseStruct schema,\n * as opposed to, e.g., a struct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas looseStruct schemas cannot. Loose structs are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isLooseStructSchema(d.struct({ a: d.u32 })) // false\n * isLooseStructSchema(d.looseStruct({ a: d.u32 })) // true\n * isLooseStructSchema(d.vec3f) // false\n */\nexport function isLooseStructSchema<\n T extends TgpuLooseStruct<Record<string, AnyTgpuData | AnyTgpuLooseData>>,\n>(schema: T | unknown): schema is T {\n return schema instanceof TgpuLooseStructImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nfunction generateField([key, field]: [string, AnyTgpuData]) {\n return code` ${getAttributesString(field)}${key}: ${field},\\n`;\n}\n\nclass TgpuStructImpl<TProps extends Record<string, AnyTgpuData>>\n extends Schema<UnwrapRecord<TProps>>\n implements TgpuData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n\n private _size: number;\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n public readonly isRuntimeSized: boolean;\n\n constructor(public readonly properties: TProps) {\n super();\n\n this.byteAlignment = Object.values(properties)\n .map((prop) => prop.byteAlignment)\n .reduce((a, b) => (a > b ? a : b));\n\n this._size = this.measure(MaxValue).size;\n this.isRuntimeSized = Number.isNaN(this._size);\n }\n\n get size(): number {\n if (this.isRuntimeSized) {\n throw new Error(\n 'Cannot get size of struct with runtime sized properties',\n );\n }\n return this._size;\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n if (this.isRuntimeSized) {\n throw new Error('Cannot write struct with runtime sized properties');\n }\n alignIO(output, this.byteAlignment);\n\n for (const [key, property] of Object.entries(this.properties)) {\n alignIO(output, property.byteAlignment);\n property.write(output, value[key]);\n }\n\n alignIO(output, this.byteAlignment);\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n if (this.isRuntimeSized) {\n throw new Error('Cannot read struct with runtime sized properties');\n }\n alignIO(input, this.byteAlignment);\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(this.properties)) {\n alignIO(input, property.byteAlignment);\n result[key] = property.read(input);\n }\n\n alignIO(input, this.byteAlignment);\n return result as Parsed<UnwrapRecord<TProps>>;\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n let structMeasurer = measurer;\n alignIO(structMeasurer, this.byteAlignment);\n\n const maxing = value === MaxValue;\n for (const [key, property] of Object.entries(this.properties)) {\n if (structMeasurer.isUnbounded) {\n throw new Error('Only the last property of a struct can be unbounded');\n }\n\n alignIO(structMeasurer, property.byteAlignment);\n structMeasurer = property.measure(\n maxing ? MaxValue : value[key],\n structMeasurer,\n );\n\n if (structMeasurer.isUnbounded && !isArraySchema(property)) {\n throw new Error('Cannot nest unbounded struct within another struct');\n }\n }\n\n alignIO(structMeasurer, this.byteAlignment);\n return structMeasurer;\n }\n\n resolve(ctx: ResolutionCtx): string {\n const ident = identifier().$name(this._label);\n\n ctx.addDeclaration(code`\nstruct ${ident} {\n${Object.entries(this.properties).map(generateField)}\\\n}\n`);\n\n return ctx.resolve(ident);\n }\n}\n\nclass TgpuLooseStructImpl<\n TProps extends Record<string, AnyTgpuData | AnyTgpuLooseData>,\n >\n extends Schema<UnwrapRecord<TProps>>\n implements TgpuLooseData<UnwrapRecord<TProps>>\n{\n private _label: string | undefined;\n\n public readonly byteAlignment = 1;\n public readonly isLoose = true as const;\n public readonly size: number;\n\n constructor(public readonly properties: TProps) {\n super();\n this.size = this.measure(MaxValue).size;\n }\n\n get label() {\n return this._label;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<UnwrapRecord<TProps>>): void {\n for (const [key, property] of Object.entries(this.properties)) {\n property.write(output, value[key]);\n }\n }\n\n read(input: ISerialInput): Parsed<UnwrapRecord<TProps>> {\n const result = {} as Record<string, unknown>;\n\n for (const [key, property] of Object.entries(this.properties)) {\n result[key] = property.read(input);\n }\n\n return result as Parsed<UnwrapRecord<TProps>>;\n }\n\n measure(\n value: MaxValue | Parsed<UnwrapRecord<TProps>>,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n const maxing = value === MaxValue;\n for (const [key, property] of Object.entries(this.properties)) {\n property.measure(maxing ? MaxValue : value[key], measurer);\n }\n\n return measurer;\n }\n}\n","import type { TgpuNamable } from './namable';\nimport type { ResolutionCtx, TgpuResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport function identifier() {\n return new TgpuIdentifierImpl();\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuIdentifierImpl implements TgpuResolvable, TgpuNamable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n","import { identifier } from './tgpuIdentifier';\nimport type { TgpuIdentifier } from './types';\n\nexport const builtinNames = [\n 'vertex_index',\n 'instance_index',\n 'position',\n 'clip_distances',\n 'front_facing',\n 'frag_depth',\n 'sample_index',\n 'sample_mask',\n 'fragment',\n 'local_invocation_id',\n 'local_invocation_index',\n 'global_invocation_id',\n 'workgroup_id',\n 'num_workgroups',\n] as const;\n\nexport type BuiltinName = (typeof builtinNames)[number];\n\nexport const builtinSymbolToName = new Map(\n builtinNames.map((name) => [Symbol(name), name]),\n);\n\nexport const builtinNameToSymbol = new Map(\n Array.from(builtinSymbolToName).map(([s, n]) => [n, s]),\n);\n\nconst identifierMap = new Map<symbol, TgpuIdentifier>();\n\nexport function nameForBuiltin(key: symbol): string {\n const name = builtinSymbolToName.get(key);\n if (!name) {\n throw new Error(`The symbol ${String(key)} in not a valid 'builtin'`);\n }\n\n return name;\n}\n\nexport function idForBuiltin(key: symbol) {\n let id = identifierMap.get(key);\n\n if (id === undefined) {\n id = identifier().$name(builtinSymbolToName.get(key));\n identifierMap.set(key, id);\n }\n\n return id;\n}\n","import type { ISchema, Unwrap } from 'typed-binary';\nimport type { TgpuBuffer } from './core/buffer/buffer';\nimport type { TgpuBufferUsage } from './core/buffer/bufferUsage';\nimport type { TgpuFnShellBase } from './core/function/fnCore';\nimport type { TgpuNamable } from './namable';\nimport type { Block } from './smol';\n\nexport type Wgsl = string | number | TgpuResolvable | symbol | boolean;\n\nexport const UnknownData = Symbol('Unknown data type');\nexport type UnknownData = typeof UnknownData;\n\nexport type Resource = {\n value: unknown;\n dataType: AnyTgpuData | UnknownData;\n};\n\nexport type TgpuShaderStage = 'compute' | 'vertex' | 'fragment';\n\nexport interface NumberArrayView {\n readonly length: number;\n [n: number]: number;\n}\n\n/**\n * Removes properties from record type that extend `Prop`\n */\nexport type OmitProps<T extends Record<string, unknown>, Prop> = Pick<\n T,\n {\n [Key in keyof T]: T[Key] extends Prop ? never : Key;\n }[keyof T]\n>;\n\n/**\n * Passed into each resolvable item. All sibling items share a resolution ctx,\n * and a new resolution ctx is made when going down each level in the tree.\n */\nexport interface ResolutionCtx {\n addDeclaration(item: TgpuResolvable): void;\n addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;\n addRenderResource(\n resource: TgpuRenderResource,\n identifier: TgpuIdentifier,\n ): void;\n addBuiltin(builtin: symbol): void;\n nameFor(token: TgpuResolvable): string;\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n transpileFn(fn: string): {\n argNames: string[];\n body: Block;\n externalNames: string[];\n };\n fnToWgsl(\n // biome-ignore lint/suspicious/noExplicitAny: <no need for generic magic>\n shell: TgpuFnShellBase<any, AnyTgpuData | undefined>,\n argNames: string[],\n body: Block,\n externalMap: Record<string, unknown>,\n ): {\n head: Wgsl;\n body: Wgsl;\n };\n}\n\nexport interface TgpuResolvable {\n readonly label?: string | undefined;\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport interface TgpuIdentifier extends TgpuNamable, TgpuResolvable {}\n\nexport interface Builtin {\n symbol: symbol;\n name: string;\n stage: 'vertex' | 'fragment' | 'compute';\n direction: 'input' | 'output';\n identifier: TgpuIdentifier;\n}\n\nexport function isResolvable(value: unknown): value is TgpuResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface TgpuResolvableSlot<T extends Wgsl>\n extends TgpuResolvable,\n TgpuSlot<T> {}\n\nexport type SlotValuePair<T> = [TgpuSlot<T>, T];\n\nexport interface TgpuBindable<\n TData extends AnyTgpuData = AnyTgpuData,\n TUsage extends BufferUsage = BufferUsage,\n> extends TgpuResolvable {\n readonly allocatable: TgpuBuffer<TData>;\n readonly usage: TUsage;\n}\n\nexport type TgpuSamplerType = 'sampler' | 'sampler_comparison';\nexport type TgpuTypedTextureType =\n | 'texture_1d'\n | 'texture_2d'\n | 'texture_2d_array'\n | 'texture_3d'\n | 'texture_cube'\n | 'texture_cube_array'\n | 'texture_multisampled_2d';\nexport type TgpuDepthTextureType =\n | 'texture_depth_2d'\n | 'texture_depth_2d_array'\n | 'texture_depth_cube'\n | 'texture_depth_cube_array'\n | 'texture_depth_multisampled_2d';\nexport type TgpuStorageTextureType =\n | 'texture_storage_1d'\n | 'texture_storage_2d'\n | 'texture_storage_2d_array'\n | 'texture_storage_3d';\nexport type TgpuExternalTextureType = 'texture_external';\n\nexport type TgpuRenderResourceType =\n | TgpuSamplerType\n | TgpuTypedTextureType\n | TgpuDepthTextureType\n | TgpuStorageTextureType\n | TgpuExternalTextureType;\n\nexport interface TgpuRenderResource extends TgpuResolvable {\n readonly type: TgpuRenderResourceType;\n}\n\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\nexport type TextureUsage = 'sampled' | 'storage';\n\nexport function isSamplerType(\n type: TgpuRenderResourceType,\n): type is TgpuSamplerType {\n return type === 'sampler' || type === 'sampler_comparison';\n}\n\nexport function isTypedTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuTypedTextureType {\n return [\n 'texture_1d',\n 'texture_2d',\n 'texture_2d_array',\n 'texture_3d',\n 'texture_cube',\n 'texture_cube_array',\n 'texture_multisampled_2d',\n ].includes(type);\n}\n\nexport function isDepthTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuDepthTextureType {\n return [\n 'texture_depth_2d',\n 'texture_depth_2d_array',\n 'texture_depth_cube',\n 'texture_depth_cube_array',\n 'texture_depth_multisampled_2d',\n ].includes(type);\n}\n\nexport function isStorageTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuStorageTextureType {\n return [\n 'texture_storage_1d',\n 'texture_storage_2d',\n 'texture_storage_2d_array',\n 'texture_storage_3d',\n ].includes(type);\n}\n\nexport function isExternalTextureType(\n type: TgpuRenderResourceType,\n): type is TgpuExternalTextureType {\n return type === 'texture_external';\n}\n\nexport type ValueOf<T> = T extends TgpuSlot<infer I>\n ? ValueOf<I>\n : T extends TgpuBufferUsage<infer D>\n ? ValueOf<D>\n : T extends TgpuData<unknown>\n ? Unwrap<T>\n : T;\n\nexport interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {\n readonly isLoose: false;\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport interface TgpuLooseData<TInner> extends ISchema<TInner> {\n readonly isLoose: true;\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport type AnyTgpuData = TgpuData<unknown>;\nexport type AnyTgpuLooseData = TgpuLooseData<unknown>;\n\nexport function isDataLoose<T>(\n data: TgpuData<T> | TgpuLooseData<T>,\n): data is TgpuLooseData<T> {\n return data.isLoose;\n}\nexport function isDataNotLoose<T>(\n data: TgpuData<T> | TgpuLooseData<T>,\n): data is TgpuData<T> {\n return !data.isLoose;\n}\n\nexport interface TgpuPointer<\n TScope extends 'function',\n TInner extends AnyTgpuData,\n> {\n readonly scope: TScope;\n readonly pointsTo: TInner;\n}\n\n/**\n * A virtual representation of a WGSL value.\n */\nexport type TgpuValue<TDataType> = {\n readonly __dataType: TDataType;\n};\n\nexport type AnyTgpuPointer = TgpuPointer<'function', AnyTgpuData>;\n\nexport type TgpuFnArgument = AnyTgpuPointer | AnyTgpuData;\n\nexport function isPointer(\n value: AnyTgpuPointer | AnyTgpuData,\n): value is AnyTgpuPointer {\n return 'pointsTo' in value;\n}\n\nexport function isGPUBuffer(value: unknown): value is GPUBuffer {\n return (\n !!value &&\n typeof value === 'object' &&\n 'getMappedRange' in value &&\n 'mapAsync' in value\n );\n}\n\n// -----------------\n// TypeGPU Resources\n// -----------------\n\n// Code\n\nexport interface BoundTgpuCode extends TgpuResolvable {\n with<T>(slot: TgpuSlot<T>, value: Eventual<T>): BoundTgpuCode;\n}\n\nexport interface TgpuCode extends BoundTgpuCode, TgpuNamable {}\n\n// Slot\n\nexport interface TgpuSlot<T> extends TgpuNamable {\n readonly __brand: 'TgpuSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n\n value: ValueOf<T>;\n}\n\nexport function isSlot<T>(value: unknown | TgpuSlot<T>): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>).__brand === 'TgpuSlot';\n}\n","import { idForBuiltin } from './builtinIdentifiers';\nimport {\n type BoundTgpuCode,\n type Eventual,\n type InlineResolve,\n type ResolutionCtx,\n type SlotValuePair,\n type TgpuCode,\n type TgpuSlot,\n type Wgsl,\n isResolvable,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): TgpuCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new TgpuCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuCodeImpl implements TgpuCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (typeof s === 'symbol') {\n ctx.addBuiltin(s);\n code += ctx.resolve(idForBuiltin(s));\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass BoundTgpuCodeImpl<T> implements BoundTgpuCode {\n constructor(\n private readonly _innerFn: BoundTgpuCode,\n private readonly _slotValuePair: SlotValuePair<T>,\n ) {}\n\n get label() {\n return this._innerFn.label;\n }\n\n with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): BoundTgpuCode {\n return new BoundTgpuCodeImpl(this, [slot, value]);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this._innerFn, [this._slotValuePair]);\n }\n\n toString(): string {\n const [slot, value] = this._slotValuePair;\n return `code:${this.label ?? '<unnamed>'}[${slot.label ?? '<unnamed>'}=${value}]`;\n }\n}\n","import type { IMeasurer, ISerialInput, ISerialOutput } from 'typed-binary';\n\n/**\n * @param io the IO to align\n * @param baseAlignment must be power of 2\n */\nfunction alignIO(\n io: ISerialInput | ISerialOutput | IMeasurer,\n baseAlignment: number,\n) {\n const currentPos = 'size' in io ? io.size : io.currentByteOffset;\n\n const bitMask = baseAlignment - 1;\n const offset = currentPos & bitMask;\n\n if ('skipBytes' in io) {\n io.skipBytes((baseAlignment - offset) & bitMask);\n } else {\n io.add((baseAlignment - offset) & bitMask);\n }\n}\n\nexport default alignIO;\n","import type * as TB from 'typed-binary';\nimport {\n type IMeasurer,\n type MaxValue,\n Measurer,\n type Parsed,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { roundUp } from '../mathUtils';\nimport type {\n AnyTgpuData,\n AnyTgpuLooseData,\n ResolutionCtx,\n TgpuData,\n TgpuLooseData,\n} from '../types';\nimport alignIO from './alignIO';\nimport { getCustomAlignment } from './attributes';\n\n// ----------\n// Public API\n// ----------\n\nexport interface TgpuBaseArray<\n TElement extends AnyTgpuData | AnyTgpuLooseData =\n | AnyTgpuData\n | AnyTgpuLooseData,\n> {\n readonly elementType: TElement;\n readonly elementCount: number;\n readonly stride: number;\n}\n\n/**\n * Array schema constructed via `d.arrayOf` function.\n *\n * Responsible for handling reading and writing array values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its elementType.\n */\nexport interface TgpuArray<TElement extends AnyTgpuData>\n extends TgpuBaseArray<TElement>,\n TgpuData<Unwrap<TElement>[]> {}\n\n/**\n * Creates an array schema that can be used to construct gpu buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * @example\n * const LENGTH = 3;\n * const array = d.arrayOf(d.u32, LENGTH);\n *\n * @param elementType The type of elements in the array.\n * @param count The number of elements in the array.\n */\nexport const arrayOf = <TElement extends AnyTgpuData>(\n elementType: TElement,\n count: number,\n): TgpuArray<TElement> => new TgpuArrayImpl(elementType, count);\n\n/**\n * Array schema constructed via `d.looseArrayOf` function.\n *\n * Useful for defining vertex buffers.\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface TgpuLooseArray<TElement extends AnyTgpuData | AnyTgpuLooseData>\n extends TgpuBaseArray<TElement>,\n TgpuLooseData<Unwrap<TElement>[]> {}\n\n/**\n * Creates an array schema that can be used to construct vertex buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const looseArray = d.looseArrayOf(d.vec3f, 3); // packed array of vec3f\n *\n * @example\n * const looseArray = d.looseArrayOf(d.align(16, d.vec3f), 3);\n *\n * @param elementType The type of elements in the array.\n * @param count The number of elements in the array.\n */\nexport const looseArrayOf = <TElement extends AnyTgpuData | AnyTgpuLooseData>(\n elementType: TElement,\n count: number,\n): TgpuLooseArray<TElement> => new TgpuLooseArrayImpl(elementType, count);\n\n/**\n * Checks whether passed in value is an array schema,\n * as opposed to, e.g., a looseArray schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas looseArray schemas cannot.\n *\n * @example\n * isArraySchema(d.arrayOf(d.u32, 4)) // true\n * isArraySchema(d.looseArrayOf(d.u32, 4)) // false\n * isArraySchema(d.vec3f) // false\n */\nexport function isArraySchema<T extends TgpuArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuArrayImpl;\n}\n\n/**\n * Checks whether the passed in value is a looseArray schema,\n * as opposed to, e.g., a regular array schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas looseArray schemas cannot. Loose arrays are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isLooseArraySchema(d.arrayOf(d.u32, 4)) // false\n * isLooseArraySchema(d.looseArrayOf(d.u32, 4)) // true\n * isLooseArraySchema(d.vec3f) // false\n */\nexport function isLooseArraySchema<T extends TgpuLooseArray<AnyTgpuData>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof TgpuLooseArrayImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuArrayImpl<TElement extends AnyTgpuData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuArray<TElement>\n{\n private _size: number;\n public readonly isRuntimeSized: boolean;\n public readonly byteAlignment: number;\n public readonly stride: number;\n public readonly isLoose = false;\n\n constructor(\n public readonly elementType: TElement,\n public readonly elementCount: number,\n ) {\n super();\n this.byteAlignment = elementType.byteAlignment;\n this.stride = roundUp(elementType.size, elementType.byteAlignment);\n this._size = this.stride * elementCount;\n this.isRuntimeSized = elementCount === 0;\n }\n\n get size() {\n if (this.isRuntimeSized) {\n throw new Error('Cannot get the size of a runtime-sized array');\n }\n return this._size;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n if (this.isRuntimeSized) {\n throw new Error('Cannot write a runtime-sized array');\n }\n alignIO(output, this.byteAlignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n alignIO(output, this.byteAlignment);\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.size);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n if (this.isRuntimeSized) {\n throw new Error('Cannot read a runtime-sized array');\n }\n alignIO(input, this.byteAlignment);\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n alignIO(input, this.byteAlignment);\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n alignIO(input, this.byteAlignment);\n return elements;\n }\n\n measure(\n _: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n if (this.isRuntimeSized) {\n return measurer.unbounded;\n }\n alignIO(measurer, this.byteAlignment);\n return measurer.add(this.size);\n }\n\n resolve(ctx: ResolutionCtx): string {\n const elementTypeResolved = ctx.resolve(this.elementType);\n const arrayType = this.isRuntimeSized\n ? `array<${elementTypeResolved}>`\n : `array<${elementTypeResolved}, ${this.elementCount}>`;\n return ctx.resolve(arrayType);\n }\n}\n\nclass TgpuLooseArrayImpl<TElement extends AnyTgpuData | AnyTgpuLooseData>\n extends Schema<Unwrap<TElement>[]>\n implements TgpuLooseArray<TElement>\n{\n public readonly byteAlignment: number;\n public readonly size: number;\n public readonly stride: number;\n public readonly isLoose = true;\n\n constructor(\n public readonly elementType: TElement,\n public readonly elementCount: number,\n ) {\n super();\n this.byteAlignment = getCustomAlignment(elementType) ?? 1;\n this.stride = roundUp(elementType.size, this.byteAlignment);\n this.size = this.stride * elementCount;\n }\n\n write(output: TB.ISerialOutput, value: Parsed<Unwrap<TElement>>[]) {\n alignIO(output, this.byteAlignment);\n const beginning = output.currentByteOffset;\n for (let i = 0; i < Math.min(this.elementCount, value.length); i++) {\n alignIO(output, this.byteAlignment);\n this.elementType.write(output, value[i]);\n }\n output.seekTo(beginning + this.size);\n }\n\n read(input: TB.ISerialInput): Parsed<Unwrap<TElement>>[] {\n alignIO(input, this.byteAlignment);\n const elements: Parsed<Unwrap<TElement>>[] = [];\n for (let i = 0; i < this.elementCount; i++) {\n alignIO(input, this.byteAlignment);\n elements.push(this.elementType.read(input) as Parsed<Unwrap<TElement>>);\n }\n alignIO(input, this.byteAlignment);\n return elements;\n }\n\n measure(\n _: MaxValue | Parsed<Unwrap<TElement>>[],\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.byteAlignment);\n return measurer.add(this.size);\n }\n}\n","/**\n * @param value\n * @param modulo has to be power of 2\n */\nexport const roundUp = (value: number, modulo: number) => {\n const bitMask = modulo - 1;\n const invBitMask = ~bitMask;\n return (value & bitMask) === 0 ? value : (value & invBitMask) + modulo;\n};\n","import {\n type IMeasurer,\n type IRefResolver,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n MaxValue,\n Measurer,\n type Parsed,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport {\n type AnyTgpuData,\n type AnyTgpuLooseData,\n type ResolutionCtx,\n type TgpuData,\n type TgpuLooseData,\n isDataLoose,\n isDataNotLoose,\n} from '../types';\nimport alignIO from './alignIO';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Align<T extends number> {\n type: 'align';\n alignment: T;\n}\n\nexport interface Size<T extends number> {\n type: 'size';\n size: T;\n}\n\nexport interface Location<T extends number> {\n type: 'location';\n location: T;\n}\n\nexport type AnyAttribute = Align<number> | Size<number> | Location<number>;\n\nexport interface BaseDecorated<\n TInner extends AnyTgpuData | AnyTgpuLooseData =\n | AnyTgpuData\n | AnyTgpuLooseData,\n TAttribs extends AnyAttribute[] = AnyAttribute[],\n> {\n readonly inner: TInner;\n readonly attributes: TAttribs;\n\n // Easy access to all attributes, if they exist\n readonly alignAttrib: number | undefined;\n readonly sizeAttrib: number | undefined;\n readonly locationAttrib: number | undefined;\n}\n\nexport interface Decorated<\n TInner extends AnyTgpuData,\n TAttribs extends AnyAttribute[],\n> extends BaseDecorated<TInner, TAttribs>,\n TgpuData<Unwrap<TInner>> {}\n\nexport interface LooseDecorated<\n TInner extends AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n> extends BaseDecorated<TInner, TAttribs>,\n TgpuLooseData<Unwrap<TInner>> {}\n\nexport type ExtractAttributes<T> = T extends BaseDecorated<\n AnyTgpuData,\n infer Attribs\n>\n ? Attribs\n : [];\n\nexport type UnwrapDecorated<T> = T extends BaseDecorated<infer Inner>\n ? Inner\n : T;\n\n/**\n * Decorates a data-type `TData` with an attribute `TAttrib`.\n *\n * - if `TData` is loose\n * - if `TData` is already `LooseDecorated`\n * - Prepend `TAttrib` to the existing attribute tuple.\n * - else\n * - Wrap `TData` with `LooseDecorated` and a single attribute `[TAttrib]`\n * - else\n * - if `TData` is already `Decorated`\n * - Prepend `TAttrib` to the existing attribute tuple.\n * - else\n * - Wrap `TData` with `Decorated` and a single attribute `[TAttrib]`\n */\nexport type Decorate<\n TData extends AnyTgpuData | AnyTgpuLooseData,\n TAttrib extends AnyAttribute,\n> = TData extends AnyTgpuData\n ? Decorated<UnwrapDecorated<TData>, [TAttrib, ...ExtractAttributes<TData>]>\n : TData extends AnyTgpuLooseData\n ? LooseDecorated<\n UnwrapDecorated<TData>,\n [TAttrib, ...ExtractAttributes<TData>]\n >\n : never;\n\nexport function attribute<\n TData extends AnyTgpuData | AnyTgpuLooseData,\n TAttrib extends AnyAttribute,\n>(data: TData, attrib: TAttrib) {\n if (isDecorated(data)) {\n return new DecoratedImpl(data.inner, [attrib, ...data.attributes]);\n }\n\n if (isLooseDecorated(data)) {\n return new LooseDecoratedImpl(data.inner, [attrib, ...data.attributes]);\n }\n\n if (isDataLoose(data)) {\n return new LooseDecoratedImpl(data, [attrib]);\n }\n\n return new DecoratedImpl(data, [attrib]);\n}\n\n/**\n * Gives the wrapped data-type a custom byte alignment. Useful in order to\n * fulfill uniform alignment requirements.\n *\n * @example\n * const Data = d.struct({\n * a: u32, // takes up 4 bytes\n * // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes\n * b: d.align(16, u32),\n * });\n *\n * @param alignment The multiple of bytes this data should align itself to.\n * @param data The data-type to align.\n */\nexport function align<\n TAlign extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(alignment: TAlign, data: TData): Decorate<TData, Align<TAlign>> {\n return attribute(data, { type: 'align', alignment }) as Decorate<\n TData,\n Align<TAlign>\n >;\n}\n\n/**\n * Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.\n *\n * @example\n * const Data = d.struct({\n * a: d.size(16, u32), // takes up 16 bytes, instead of 4\n * b: u32, // starts at byte 16, because `a` has a custom size\n * });\n *\n * @param size The amount of bytes that should be reserved for this data-type.\n * @param data The data-type to wrap.\n */\nexport function size<\n TSize extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(size: TSize, data: TData): Decorate<TData, Size<TSize>> {\n return attribute(data, { type: 'size', size }) as Decorate<\n TData,\n Size<TSize>\n >;\n}\n\n/**\n * Assigns an explicit numeric location to a struct member or a parameter that has this type.\n *\n * @example\n * const Data = d.ioStruct({\n * a: d.u32, // has implicit location 0\n * b: d.location(5, d.u32),\n * c: d.u32, // has implicit location 6\n * });\n *\n * @param location The explicit numeric location.\n * @param data The data-type to wrap.\n */\nexport function location<\n TLocation extends number,\n TData extends AnyTgpuData | AnyTgpuLooseData,\n>(location: TLocation, data: TData): Decorate<TData, Location<TLocation>> {\n return attribute(data, { type: 'location', location }) as Decorate<\n TData,\n Location<TLocation>\n >;\n}\n\nexport function isDecorated<T extends Decorated<AnyTgpuData, AnyAttribute[]>>(\n value: T | unknown,\n): value is T {\n return value instanceof DecoratedImpl;\n}\n\nexport function isLooseDecorated<\n T extends LooseDecorated<AnyTgpuLooseData, AnyAttribute[]>,\n>(value: T | unknown): value is T {\n return value instanceof LooseDecoratedImpl;\n}\n\nexport function getCustomAlignment(\n data: AnyTgpuData | AnyTgpuLooseData,\n): number | undefined {\n return (data as unknown as BaseDecorated).alignAttrib;\n}\n\nexport function getCustomLocation(\n data: AnyTgpuData | AnyTgpuLooseData,\n): number | undefined {\n return (data as unknown as BaseDecorated).locationAttrib;\n}\n\nexport function getAttributesString<T extends AnyTgpuData>(field: T): string {\n if (!isDecorated(field) && !isLooseDecorated(field)) {\n return '';\n }\n\n return field.attributes\n .map((attrib) => {\n if (attrib.type === 'align') {\n return `@align(${attrib.alignment}) `;\n }\n\n if (attrib.type === 'size') {\n return `@size(${attrib.size}) `;\n }\n\n if (attrib.type === 'location') {\n return `@location(${attrib.location}) `;\n }\n\n return '';\n })\n .join('');\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass BaseDecoratedImpl<\n TInner extends AnyTgpuData | AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n> {\n // Type-token, not available at runtime\n public readonly __unwrapped!: Unwrap<TInner>;\n\n public readonly label?: string | undefined;\n public readonly byteAlignment: number;\n public readonly size: number;\n\n public readonly alignAttrib: number | undefined;\n public readonly sizeAttrib: number | undefined;\n public readonly locationAttrib: number | undefined;\n\n constructor(\n public readonly inner: TInner,\n public readonly attributes: TAttribs,\n ) {\n this.alignAttrib = attributes.find(\n (a): a is Align<number> => a.type === 'align',\n )?.alignment;\n this.sizeAttrib = attributes.find(\n (a): a is Size<number> => a.type === 'size',\n )?.size;\n this.locationAttrib = attributes.find(\n (a): a is Location<number> => a.type === 'location',\n )?.location;\n\n this.byteAlignment = this.alignAttrib ?? inner.byteAlignment;\n this.size = this.measure(MaxValue).size;\n\n if (this.byteAlignment <= 0) {\n throw new Error(\n `Custom data alignment must be a positive number, got: ${this.byteAlignment}.`,\n );\n }\n\n if (Math.log2(this.byteAlignment) % 1 !== 0) {\n throw new Error(\n `Alignment has to be a power of 2, got: ${this.byteAlignment}.`,\n );\n }\n\n if (isDataNotLoose(this.inner)) {\n if (this.byteAlignment % this.inner.byteAlignment !== 0) {\n throw new Error(\n `Custom alignment has to be a multiple of the standard data byteAlignment. Got: ${this.byteAlignment}, expected multiple of: ${this.inner.byteAlignment}.`,\n );\n }\n }\n\n if (this.size < this.inner.size) {\n throw new Error(\n `Custom data size cannot be smaller then the standard data size. Got: ${this.size}, expected at least: ${this.inner.size}.`,\n );\n }\n\n if (this.size <= 0) {\n throw new Error(\n `Custom data size must be a positive number. Got: ${this.size}.`,\n );\n }\n }\n\n resolveReferences(_: IRefResolver): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: Parsed<Unwrap<TInner>>): void {\n alignIO(output, this.alignAttrib ?? 1);\n\n const beginning = output.currentByteOffset;\n this.inner.write(output, value);\n output.seekTo(beginning + this.size);\n }\n\n read(input: ISerialInput): Parsed<Unwrap<TInner>> {\n alignIO(input, this.alignAttrib ?? 1);\n\n const beginning = input.currentByteOffset;\n const value = this.inner.read(input) as Parsed<Unwrap<TInner>>;\n input.seekTo(beginning + this.size);\n return value;\n }\n\n measure(\n value: MaxValue | Parsed<Unwrap<TInner>>,\n measurer: IMeasurer | undefined = new Measurer(),\n ): IMeasurer {\n alignIO(measurer, this.alignAttrib ?? 1);\n\n if (this.sizeAttrib !== undefined) {\n return measurer.add(this.sizeAttrib);\n }\n\n return this.inner.measure(value, measurer);\n }\n\n seekProperty(\n reference: MaxValue | Parsed<Unwrap<TInner>>,\n prop: keyof Unwrap<TInner>,\n ): { bufferOffset: number; schema: ISchema<unknown> } | null {\n return this.inner.seekProperty(reference, prop as never);\n }\n}\n\nclass DecoratedImpl<TInner extends AnyTgpuData, TAttribs extends AnyAttribute[]>\n extends BaseDecoratedImpl<TInner, TAttribs>\n implements Decorated<TInner, TAttribs>\n{\n public readonly isLoose = false as const;\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.resolve(this.inner);\n }\n}\n\nclass LooseDecoratedImpl<\n TInner extends AnyTgpuLooseData,\n TAttribs extends AnyAttribute[],\n >\n extends BaseDecoratedImpl<TInner, TAttribs>\n implements LooseDecorated<TInner, TAttribs>\n{\n public readonly isLoose = true as const;\n}\n","import {\n type IMeasurer,\n type IRefResolver,\n type ISchema,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type Parsed,\n f32,\n i32,\n u32,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { inGPUMode } from '../gpuMode';\nimport type { NumberArrayView, TgpuData } from '../types';\n\n// --------------\n// Implementation\n// --------------\n\ninterface VecSchemaOptions<ValueType> {\n unitType: ISchema<number>;\n byteAlignment: number;\n length: number;\n label: string;\n make: (...args: number[]) => ValueType;\n makeFromScalar: (value: number) => ValueType;\n}\n\ntype VecSchemaBase<ValueType> = TgpuData<ValueType> & {\n kind: string;\n expressionCode: string; // TODO: to remove\n toString(): string;\n};\n\nfunction makeVecSchema<ValueType extends vecBase>(\n options: VecSchemaOptions<ValueType>,\n): VecSchemaBase<ValueType> & ((...args: number[]) => ValueType) {\n const VecSchema: VecSchemaBase<ValueType> = {\n // Type-token, not available at runtime\n __unwrapped: undefined as unknown as ValueType,\n isLoose: false as const,\n\n size: options.length * 4,\n label: options.label,\n byteAlignment: options.byteAlignment,\n kind: options.label,\n expressionCode: options.label,\n\n resolveReferences(ctx: IRefResolver): void {\n throw new RecursiveDataTypeError();\n },\n\n write(output: ISerialOutput, value: Parsed<ValueType>): void {\n for (const element of value) {\n options.unitType.write(output, element);\n }\n },\n\n read(input: ISerialInput): Parsed<ValueType> {\n return options.make(\n ...Array.from({ length: options.length }).map((_) =>\n options.unitType.read(input),\n ),\n ) as Parsed<ValueType>;\n },\n\n measure(\n _value: Parsed<ValueType> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.size);\n },\n\n seekProperty(\n _reference: Parsed<ValueType> | MaxValue,\n _prop: never,\n ): { bufferOffset: number; schema: ISchema<unknown> } | null {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return options.label;\n },\n\n toString(): string {\n return options.label;\n },\n };\n\n const construct = (...args: number[]): ValueType => {\n const values = args; // TODO: Allow users to pass in vectors that fill part of the values.\n\n if (inGPUMode()) {\n return `${VecSchema.kind}(${values.join(', ')})` as unknown as ValueType;\n }\n\n if (values.length <= 1) {\n return options.makeFromScalar(values[0] ?? 0);\n }\n\n if (values.length === options.length) {\n return options.make(...values);\n }\n\n throw new Error(\n `'${options.label}' constructor called with invalid number of arguments.`,\n );\n };\n\n return Object.assign(construct, VecSchema);\n}\n\nabstract class vec2Impl implements vec2 {\n public readonly length = 2;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n}\n\nclass vec2fImpl extends vec2Impl {\n readonly kind = 'vec2f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec2iImpl extends vec2Impl {\n readonly kind = 'vec2i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec2uImpl extends vec2Impl {\n readonly kind = 'vec2u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\nabstract class vec3Impl implements vec3 {\n public readonly length = 3;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n public z: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n get [2]() {\n return this.z;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n\n set [2](value: number) {\n this.z = value;\n }\n}\n\nclass vec3fImpl extends vec3Impl {\n readonly kind = 'vec3f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec3iImpl extends vec3Impl {\n readonly kind = 'vec3i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec3uImpl extends vec3Impl {\n readonly kind = 'vec3u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\nabstract class vec4Impl implements vec4 {\n public readonly length = 4;\n [n: number]: number;\n\n constructor(\n public x: number,\n public y: number,\n public z: number,\n public w: number,\n ) {}\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n yield this.w;\n }\n\n get [0]() {\n return this.x;\n }\n\n get [1]() {\n return this.y;\n }\n\n get [2]() {\n return this.z;\n }\n\n get [3]() {\n return this.w;\n }\n\n set [0](value: number) {\n this.x = value;\n }\n\n set [1](value: number) {\n this.y = value;\n }\n\n set [2](value: number) {\n this.z = value;\n }\n\n set [3](value: number) {\n this.w = value;\n }\n}\n\nclass vec4fImpl extends vec4Impl {\n readonly kind = 'vec4f';\n\n make2(x: number, y: number): vec2f {\n return new vec2fImpl(x, y) as unknown as vec2f;\n }\n\n make3(x: number, y: number, z: number): vec3f {\n return new vec3fImpl(x, y, z) as unknown as vec3f;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4f {\n return new vec4fImpl(x, y, z, w) as unknown as vec4f;\n }\n}\n\nclass vec4iImpl extends vec4Impl {\n readonly kind = 'vec4i';\n\n make2(x: number, y: number): vec2i {\n return new vec2iImpl(x, y) as unknown as vec2i;\n }\n\n make3(x: number, y: number, z: number): vec3i {\n return new vec3iImpl(x, y, z) as unknown as vec3i;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4i {\n return new vec4iImpl(x, y, z, w) as unknown as vec4i;\n }\n}\n\nclass vec4uImpl extends vec4Impl {\n readonly kind = 'vec4u';\n\n make2(x: number, y: number): vec2u {\n return new vec2uImpl(x, y) as unknown as vec2u;\n }\n\n make3(x: number, y: number, z: number): vec3u {\n return new vec3uImpl(x, y, z) as unknown as vec3u;\n }\n\n make4(x: number, y: number, z: number, w: number): vec4u {\n return new vec4uImpl(x, y, z, w) as unknown as vec4u;\n }\n}\n\ninterface Swizzle2<T2, T3, T4> {\n readonly xx: T2;\n readonly xy: T2;\n readonly yx: T2;\n readonly yy: T2;\n\n readonly xxx: T3;\n readonly xxy: T3;\n readonly xyx: T3;\n readonly xyy: T3;\n readonly yxx: T3;\n readonly yxy: T3;\n readonly yyx: T3;\n readonly yyy: T3;\n\n readonly xxxx: T4;\n readonly xxxy: T4;\n readonly xxyx: T4;\n readonly xxyy: T4;\n readonly xyxx: T4;\n readonly xyxy: T4;\n readonly xyyx: T4;\n readonly xyyy: T4;\n readonly yxxx: T4;\n readonly yxxy: T4;\n readonly yxyx: T4;\n readonly yxyy: T4;\n readonly yyxx: T4;\n readonly yyxy: T4;\n readonly yyyx: T4;\n readonly yyyy: T4;\n}\n\ninterface Swizzle3<T2, T3, T4> extends Swizzle2<T2, T3, T4> {\n readonly xz: T2;\n readonly yz: T2;\n readonly zx: T2;\n readonly zy: T2;\n readonly zz: T2;\n\n readonly xxz: T3;\n readonly xyz: T3;\n readonly xzx: T3;\n readonly xzy: T3;\n readonly xzz: T3;\n readonly yxz: T3;\n readonly yyz: T3;\n readonly yzx: T3;\n readonly yzy: T3;\n readonly yzz: T3;\n readonly zxx: T3;\n readonly zxy: T3;\n readonly zxz: T3;\n readonly zyx: T3;\n readonly zyy: T3;\n readonly zyz: T3;\n readonly zzx: T3;\n readonly zzy: T3;\n readonly zzz: T3;\n\n readonly xxxz: T4;\n readonly xxyz: T4;\n readonly xxzx: T4;\n readonly xxzy: T4;\n readonly xxzz: T4;\n readonly xyxz: T4;\n readonly xyyz: T4;\n readonly xyzx: T4;\n readonly xyzy: T4;\n readonly xyzz: T4;\n readonly xzxx: T4;\n readonly xzxy: T4;\n readonly xzxz: T4;\n readonly xzyx: T4;\n readonly xzyy: T4;\n readonly xzyz: T4;\n readonly xzzx: T4;\n readonly xzzy: T4;\n readonly xzzz: T4;\n readonly yxxz: T4;\n readonly yxyz: T4;\n readonly yxzx: T4;\n readonly yxzy: T4;\n readonly yxzz: T4;\n readonly yyxz: T4;\n readonly yyyz: T4;\n readonly yyzx: T4;\n readonly yyzy: T4;\n readonly yyzz: T4;\n readonly yzxx: T4;\n readonly yzxy: T4;\n readonly yzxz: T4;\n readonly yzyx: T4;\n readonly yzyy: T4;\n readonly yzyz: T4;\n readonly yzzx: T4;\n readonly yzzy: T4;\n readonly yzzz: T4;\n readonly zxxx: T4;\n readonly zxxy: T4;\n readonly zxxz: T4;\n readonly zxyx: T4;\n readonly zxyy: T4;\n readonly zxyz: T4;\n readonly zxzx: T4;\n readonly zxzy: T4;\n readonly zxzz: T4;\n readonly zyxx: T4;\n readonly zyxy: T4;\n readonly zyxz: T4;\n readonly zyyx: T4;\n readonly zyyy: T4;\n readonly zyyz: T4;\n readonly zyzx: T4;\n readonly zyzy: T4;\n readonly zyzz: T4;\n readonly zzxx: T4;\n readonly zzxy: T4;\n readonly zzxz: T4;\n readonly zzyx: T4;\n readonly zzyy: T4;\n readonly zzyz: T4;\n readonly zzzx: T4;\n readonly zzzy: T4;\n readonly zzzz: T4;\n}\n\ninterface Swizzle4<T2, T3, T4> extends Swizzle3<T2, T3, T4> {\n readonly yw: T2;\n readonly zw: T2;\n readonly wx: T2;\n readonly wy: T2;\n readonly wz: T2;\n readonly ww: T2;\n\n readonly xxw: T3;\n readonly xyw: T3;\n readonly xzw: T3;\n readonly xwx: T3;\n readonly xwy: T3;\n readonly xwz: T3;\n readonly xww: T3;\n readonly yxw: T3;\n readonly yyw: T3;\n readonly yzw: T3;\n readonly ywx: T3;\n readonly ywy: T3;\n readonly ywz: T3;\n readonly yww: T3;\n readonly zxw: T3;\n readonly zyw: T3;\n readonly zzw: T3;\n readonly zwx: T3;\n readonly zwy: T3;\n readonly zwz: T3;\n readonly zww: T3;\n readonly wxx: T3;\n readonly wxz: T3;\n readonly wxy: T3;\n readonly wyy: T3;\n readonly wyz: T3;\n readonly wzz: T3;\n readonly wwx: T3;\n readonly wwy: T3;\n readonly wwz: T3;\n readonly www: T3;\n\n readonly xxxw: T4;\n readonly xxyw: T4;\n readonly xxzw: T4;\n readonly xxwx: T4;\n readonly xxwy: T4;\n readonly xxwz: T4;\n readonly xxww: T4;\n readonly xyxw: T4;\n readonly xyyw: T4;\n readonly xyzw: T4;\n readonly xywx: T4;\n readonly xywy: T4;\n readonly xywz: T4;\n readonly xyww: T4;\n readonly xzxw: T4;\n readonly xzyw: T4;\n readonly xzzw: T4;\n readonly xzwx: T4;\n readonly xzwy: T4;\n readonly xzwz: T4;\n readonly xzww: T4;\n readonly xwxx: T4;\n readonly xwxy: T4;\n readonly xwxz: T4;\n readonly xwyy: T4;\n readonly xwyz: T4;\n readonly xwzz: T4;\n readonly xwwx: T4;\n readonly xwwy: T4;\n readonly xwwz: T4;\n readonly xwww: T4;\n readonly yxxw: T4;\n readonly yxyw: T4;\n readonly yxzw: T4;\n readonly yxwx: T4;\n readonly yxwy: T4;\n readonly yxwz: T4;\n readonly yxww: T4;\n readonly yyxw: T4;\n readonly yyyw: T4;\n readonly yyzw: T4;\n readonly yywx: T4;\n readonly yywy: T4;\n readonly yywz: T4;\n readonly yyww: T4;\n readonly yzxw: T4;\n readonly yzyw: T4;\n readonly yzzw: T4;\n readonly yzwx: T4;\n readonly yzwy: T4;\n readonly yzwz: T4;\n readonly yzww: T4;\n readonly ywxx: T4;\n readonly ywxy: T4;\n readonly ywxz: T4;\n readonly ywxw: T4;\n readonly ywyy: T4;\n readonly ywyz: T4;\n readonly ywzz: T4;\n readonly ywwx: T4;\n readonly ywwy: T4;\n readonly ywwz: T4;\n readonly ywww: T4;\n readonly zxxw: T4;\n readonly zxyw: T4;\n readonly zxzw: T4;\n readonly zxwx: T4;\n readonly zxwy: T4;\n readonly zxwz: T4;\n readonly zxww: T4;\n readonly zyxw: T4;\n readonly zyyw: T4;\n readonly zyzw: T4;\n readonly zywx: T4;\n readonly zywy: T4;\n readonly zywz: T4;\n readonly zyww: T4;\n readonly zzxw: T4;\n readonly zzyw: T4;\n readonly zzzw: T4;\n readonly zzwx: T4;\n readonly zzwy: T4;\n readonly zzwz: T4;\n readonly zzww: T4;\n readonly zwxx: T4;\n readonly zwxy: T4;\n readonly zwxz: T4;\n readonly zwxw: T4;\n readonly zwyy: T4;\n readonly zwyz: T4;\n readonly zwzz: T4;\n readonly zwwx: T4;\n readonly zwwy: T4;\n readonly zwwz: T4;\n readonly zwww: T4;\n readonly wxxx: T4;\n readonly wxxy: T4;\n readonly wxxz: T4;\n readonly wxxw: T4;\n readonly wxyx: T4;\n readonly wxyy: T4;\n readonly wxyz: T4;\n readonly wxyw: T4;\n readonly wxzx: T4;\n readonly wxzy: T4;\n readonly wxzz: T4;\n readonly wxzw: T4;\n readonly wxwx: T4;\n readonly wxwy: T4;\n readonly wxwz: T4;\n readonly wxww: T4;\n readonly wyxx: T4;\n readonly wyxy: T4;\n readonly wyxz: T4;\n readonly wyxw: T4;\n readonly wyyy: T4;\n readonly wyyz: T4;\n readonly wyzw: T4;\n readonly wywx: T4;\n readonly wywy: T4;\n readonly wywz: T4;\n readonly wyww: T4;\n readonly wzxx: T4;\n readonly wzxy: T4;\n readonly wzxz: T4;\n readonly wzxw: T4;\n readonly wzyy: T4;\n readonly wzyz: T4;\n readonly wzzy: T4;\n readonly wzzw: T4;\n readonly wzwx: T4;\n readonly wzwy: T4;\n readonly wzwz: T4;\n readonly wzww: T4;\n readonly wwxx: T4;\n readonly wwxy: T4;\n readonly wwxz: T4;\n readonly wwxw: T4;\n readonly wwyy: T4;\n readonly wwyz: T4;\n readonly wwzz: T4;\n readonly wwwx: T4;\n readonly wwwy: T4;\n readonly wwwz: T4;\n readonly wwww: T4;\n}\n\ninterface vec2 extends NumberArrayView {\n x: number;\n y: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\ninterface vec3 extends NumberArrayView {\n x: number;\n y: number;\n z: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\ninterface vec4 extends NumberArrayView {\n x: number;\n y: number;\n z: number;\n w: number;\n [Symbol.iterator](): Iterator<number>;\n}\n\nconst vecProxyHandler: ProxyHandler<vecBase> = {\n get: (target, prop) => {\n if (typeof prop === 'symbol' || !Number.isNaN(Number.parseInt(prop))) {\n return Reflect.get(target, prop);\n }\n\n const targetAsVec4 = target as unknown as vec4uImpl;\n const values = new Array(prop.length) as number[];\n\n let idx = 0;\n for (const char of prop as string) {\n switch (char) {\n case 'x':\n values[idx] = targetAsVec4.x;\n break;\n case 'y':\n values[idx] = targetAsVec4.y;\n break;\n case 'z':\n values[idx] = targetAsVec4.z;\n break;\n case 'w':\n values[idx] = targetAsVec4.w;\n break;\n default:\n return Reflect.get(targetAsVec4, prop);\n }\n idx++;\n }\n\n if (prop.length === 4) {\n return new Proxy(\n targetAsVec4.make4(\n values[0] as number,\n values[1] as number,\n values[2] as number,\n values[3] as number,\n ),\n vecProxyHandler,\n );\n }\n\n if (prop.length === 3) {\n return new Proxy(\n targetAsVec4.make3(\n values[0] as number,\n values[1] as number,\n values[2] as number,\n ),\n vecProxyHandler,\n );\n }\n\n if (prop.length === 2) {\n return new Proxy(\n targetAsVec4.make2(values[0] as number, values[1] as number),\n vecProxyHandler,\n );\n }\n\n return Reflect.get(target, prop);\n },\n};\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Type encompassing all available kinds of vector.\n */\nexport type VecKind =\n | 'vec2f'\n | 'vec2i'\n | 'vec2u'\n | 'vec3f'\n | 'vec3i'\n | 'vec3u'\n | 'vec4f'\n | 'vec4i'\n | 'vec4u';\n\n/**\n * Common interface for all vector types, no matter their size and inner type.\n */\nexport interface vecBase {\n kind: VecKind;\n [Symbol.iterator](): Iterator<number>;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2f or vec2<f32>.\n * A vector with 2 elements of type d.f32\n */\nexport interface vec2f extends vec2, Swizzle2<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2f';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec2i or vec2<i32>.\n * A vector with 2 elements of type d.i32\n */\nexport interface vec2i extends vec2, Swizzle2<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2i';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec2u or vec2<u32>.\n * A vector with 2 elements of type d.u32\n */\nexport interface vec2u extends vec2, Swizzle2<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec2u';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3f or vec3<f32>.\n * A vector with 3 elements of type d.f32\n */\nexport interface vec3f extends vec3, Swizzle3<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3f';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3i or vec3<i32>.\n * A vector with 3 elements of type d.i32\n */\nexport interface vec3i extends vec3, Swizzle3<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3i';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3u or vec3<u32>.\n * A vector with 3 elements of type d.u32\n */\nexport interface vec3u extends vec3, Swizzle3<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec3u';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4f or vec4<f32>.\n * A vector with 4 elements of type d.f32\n */\nexport interface vec4f extends vec4, Swizzle4<vec2f, vec3f, vec4f> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4f';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec4i or vec4<i32>.\n * A vector with 4 elements of type d.i32\n */\nexport interface vec4i extends vec4, Swizzle4<vec2i, vec3i, vec4i> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4i';\n}\n/**\n * Interface representing its WGSL vector type counterpart: vec4u or vec4<u32>.\n * A vector with 4 elements of type d.u32\n */\nexport interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {\n /** use to distinguish between vectors of the same size on the type level */\n kind: 'vec4u';\n}\n\n/**\n * Type of the `d.vec2f` object/function: vector data type schema/constructor\n */\nexport type Vec2f = TgpuData<vec2f> & { kind: 'vec2f' } & ((\n x: number,\n y: number,\n ) => vec2f) &\n ((xy: number) => vec2f) &\n (() => vec2f);\n\n/**\n *\n * Schema representing vec2f - a vector with 2 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2f(); // (0.0, 0.0)\n * const vector = d.vec2f(1); // (1.0, 1.0)\n * const vector = d.vec2f(0.5, 0.1); // (0.5, 0.1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2f, d.vec2f(0, 1)); // buffer holding a d.vec2f value, with an initial value of vec2f(0, 1);\n */\nexport const vec2f = makeVecSchema({\n unitType: f32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2f',\n make: (x: number, y: number) =>\n new Proxy(new vec2fImpl(x, y), vecProxyHandler) as vec2f,\n makeFromScalar: (x) =>\n new Proxy(new vec2fImpl(x, x), vecProxyHandler) as vec2f,\n}) as Vec2f;\n\n/**\n * Type of the `d.vec2i` object/function: vector data type schema/constructor\n */\nexport type Vec2i = TgpuData<vec2i> & { kind: 'vec2i' } & ((\n x: number,\n y: number,\n ) => vec2i) &\n ((xy: number) => vec2i) &\n (() => vec2i);\n\n/**\n *\n * Schema representing vec2i - a vector with 2 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2i(); // (0, 0)\n * const vector = d.vec2i(1); // (1, 1)\n * const vector = d.vec2i(-1, 1); // (-1, 1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2i, d.vec2i(0, 1)); // buffer holding a d.vec2i value, with an initial value of vec2i(0, 1);\n */\nexport const vec2i = makeVecSchema({\n unitType: i32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2i',\n make: (x: number, y: number) =>\n new Proxy(new vec2iImpl(x, y), vecProxyHandler) as vec2i,\n makeFromScalar: (x) =>\n new Proxy(new vec2iImpl(x, x), vecProxyHandler) as vec2i,\n}) as Vec2i;\n\n/**\n * Type of the `d.vec2u` object/function: vector data type schema/constructor\n */\nexport type Vec2u = TgpuData<vec2u> & { kind: 'vec2u' } & ((\n x: number,\n y: number,\n ) => vec2u) &\n ((xy: number) => vec2u) &\n (() => vec2u);\n\n/**\n *\n * Schema representing vec2u - a vector with 2 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2u(); // (0, 0)\n * const vector = d.vec2u(1); // (1, 1)\n * const vector = d.vec2u(1, 2); // (1, 2)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2u, d.vec2u(0, 1)); // buffer holding a d.vec2u value, with an initial value of vec2u(0, 1);\n */\nexport const vec2u = makeVecSchema({\n unitType: u32,\n byteAlignment: 8,\n length: 2,\n label: 'vec2u',\n make: (x: number, y: number) =>\n new Proxy(new vec2uImpl(x, y), vecProxyHandler) as vec2u,\n makeFromScalar: (x) =>\n new Proxy(new vec2uImpl(x, x), vecProxyHandler) as vec2u,\n}) as Vec2u;\n\n/**\n * Type of the `d.vec3f` object/function: vector data type schema/constructor\n */\nexport type Vec3f = TgpuData<vec3f> & { kind: 'vec3f' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3f) &\n ((xyz: number) => vec3f) &\n (() => vec3f);\n\n/**\n *\n * Schema representing vec3f - a vector with 3 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3f(); // (0.0, 0.0, 0.0)\n * const vector = d.vec3f(1); // (1.0, 1.0, 1.0)\n * const vector = d.vec3f(1, 2, 3.5); // (1.0, 2.0, 3.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3f, d.vec3f(0, 1, 2)); // buffer holding a d.vec3f value, with an initial value of vec3f(0, 1, 2);\n */\nexport const vec3f = makeVecSchema({\n unitType: f32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3f',\n make: (x, y, z) =>\n new Proxy(new vec3fImpl(x, y, z), vecProxyHandler) as vec3f,\n makeFromScalar: (x) =>\n new Proxy(new vec3fImpl(x, x, x), vecProxyHandler) as vec3f,\n}) as Vec3f;\n\n/**\n * Type of the `d.vec3i` object/function: vector data type schema/constructor\n */\nexport type Vec3i = TgpuData<vec3i> & { kind: 'vec3i' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3i) &\n ((xyz: number) => vec3i) &\n (() => vec3i);\n\n/**\n *\n * Schema representing vec3i - a vector with 3 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3i(); // (0, 0, 0)\n * const vector = d.vec3i(1); // (1, 1, 1)\n * const vector = d.vec3i(1, 2, -3); // (1, 2, -3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3i, d.vec3i(0, 1, 2)); // buffer holding a d.vec3i value, with an initial value of vec3i(0, 1, 2);\n */\nexport const vec3i = makeVecSchema({\n unitType: i32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3i',\n make: (x, y, z) =>\n new Proxy(new vec3iImpl(x, y, z), vecProxyHandler) as vec3i,\n makeFromScalar: (x) =>\n new Proxy(new vec3iImpl(x, x, x), vecProxyHandler) as vec3i,\n}) as Vec3i;\n\n/**\n * Type of the `d.vec3u` object/function: vector data type schema/constructor\n */\nexport type Vec3u = TgpuData<vec3u> & { kind: 'vec3u' } & ((\n x: number,\n y: number,\n z: number,\n ) => vec3u) &\n ((xyz: number) => vec3u) &\n (() => vec3u);\n\n/**\n *\n * Schema representing vec3u - a vector with 3 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3u(); // (0, 0, 0)\n * const vector = d.vec3u(1); // (1, 1, 1)\n * const vector = d.vec3u(1, 2, 3); // (1, 2, 3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3u, d.vec3u(0, 1, 2)); // buffer holding a d.vec3u value, with an initial value of vec3u(0, 1, 2);\n */\nexport const vec3u = makeVecSchema({\n unitType: u32,\n byteAlignment: 16,\n length: 3,\n label: 'vec3u',\n make: (x, y, z) =>\n new Proxy(new vec3uImpl(x, y, z), vecProxyHandler) as vec3u,\n makeFromScalar: (x) =>\n new Proxy(new vec3uImpl(x, x, x), vecProxyHandler) as vec3u,\n}) as Vec3u;\n\n/**\n * Type of the `d.vec4f` object/function: vector data type schema/constructor\n */\nexport type Vec4f = TgpuData<vec4f> & { kind: 'vec4f' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4f) &\n ((xyzw: number) => vec4f) &\n (() => vec4f);\n\n/**\n *\n * Schema representing vec4f - a vector with 4 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4f(); // (0.0, 0.0, 0.0, 0.0)\n * const vector = d.vec4f(1); // (1.0, 1.0, 1.0, 1.0)\n * const vector = d.vec4f(1, 2, 3, 4.5); // (1.0, 2.0, 3.0, 4.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4f, d.vec4f(0, 1, 2, 3)); // buffer holding a d.vec4f value, with an initial value of vec4f(0, 1, 2, 3);\n */\nexport const vec4f = makeVecSchema({\n unitType: f32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4f',\n make: (x, y, z, w) =>\n new Proxy(new vec4fImpl(x, y, z, w), vecProxyHandler) as vec4f,\n makeFromScalar: (x) =>\n new Proxy(new vec4fImpl(x, x, x, x), vecProxyHandler) as vec4f,\n}) as Vec4f;\n\n/**\n * Type of the `d.vec4i` object/function: vector data type schema/constructor\n */\nexport type Vec4i = TgpuData<vec4i> & { kind: 'vec4i' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4i) &\n ((xyzw: number) => vec4i) &\n (() => vec4i);\n\n/**\n *\n * Schema representing vec4i - a vector with 4 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4i(); // (0, 0, 0, 0)\n * const vector = d.vec4i(1); // (1, 1, 1, 1)\n * const vector = d.vec4i(1, 2, 3, -4); // (1, 2, 3, -4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4i, d.vec4i(0, 1, 2, 3)); // buffer holding a d.vec4i value, with an initial value of vec4i(0, 1, 2, 3);\n */\nexport const vec4i = makeVecSchema({\n unitType: i32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4i',\n make: (x, y, z, w) =>\n new Proxy(new vec4iImpl(x, y, z, w), vecProxyHandler) as vec4i,\n makeFromScalar: (x) =>\n new Proxy(new vec4iImpl(x, x, x, x), vecProxyHandler) as vec4i,\n}) as Vec4i;\n\n/**\n * Type of the `d.vec4u` object/function: vector data type schema/constructor\n */\nexport type Vec4u = TgpuData<vec4u> & { kind: 'vec4u' } & ((\n x: number,\n y: number,\n z: number,\n w: number,\n ) => vec4u) &\n ((xyzw: number) => vec4u) &\n (() => vec4u);\n\n/**\n *\n * Schema representing vec4u - a vector with 4 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4u(); // (0, 0, 0, 0)\n * const vector = d.vec4u(1); // (1, 1, 1, 1)\n * const vector = d.vec4u(1, 2, 3, 4); // (1, 2, 3, 4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4u, d.vec4u(0, 1, 2, 3)); // buffer holding a d.vec4u value, with an initial value of vec4u(0, 1, 2, 3);\n */\nexport const vec4u = makeVecSchema({\n unitType: u32,\n byteAlignment: 16,\n length: 4,\n label: 'vec4u',\n make: (x, y, z, w) =>\n new Proxy(new vec4uImpl(x, y, z, w), vecProxyHandler) as vec4u,\n makeFromScalar: (x) =>\n new Proxy(new vec4uImpl(x, x, x, x), vecProxyHandler) as vec4u,\n}) as Vec4u;\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type Parsed,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport { roundUp } from '../mathUtils';\nimport type { NumberArrayView, TgpuData } from '../types';\nimport { vec2f, vec3f, vec4f, type vecBase } from './vector';\n\n// --------------\n// Implementation\n// --------------\n\ninterface MatSchemaOptions<ValueType, ColumnType extends vecBase> {\n label: string;\n columnType: TgpuData<ColumnType>;\n rows: number;\n columns: number;\n makeFromColumnVectors(...columns: ColumnType[]): ValueType;\n makeFromElements(...elements: number[]): ValueType;\n}\n\ntype MatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n> = TgpuData<ValueType> & ((...args: (number | ColumnType)[]) => ValueType);\n\nfunction createMatSchema<\n ValueType extends matBase<ColumnType>,\n ColumnType extends vecBase,\n>(\n options: MatSchemaOptions<ValueType, ColumnType>,\n): MatSchema<ValueType, ColumnType> {\n const MatSchema: TgpuData<ValueType> = {\n // Type-token, not available at runtime.\n __unwrapped: undefined as unknown as ValueType,\n isLoose: false as const,\n\n label: options.label,\n byteAlignment: options.columnType.byteAlignment,\n size: roundUp(\n options.columnType.size * options.columns,\n options.columnType.byteAlignment,\n ),\n\n resolveReferences() {\n throw new RecursiveDataTypeError();\n },\n\n write(output: ISerialOutput, value: Parsed<ValueType>): void {\n for (const col of value.columns) {\n options.columnType.write(output, col as Parsed<ColumnType>);\n }\n },\n\n read(input: ISerialInput): Parsed<ValueType> {\n const columns = new Array(options.columns) as ColumnType[];\n\n for (let c = 0; c < options.columns; ++c) {\n columns[c] = options.columnType.read(input) as ColumnType;\n }\n\n return options.makeFromColumnVectors(...columns) as Parsed<ValueType>;\n },\n\n measure(_value: MaxValue, measurer: IMeasurer = new Measurer()): IMeasurer {\n return measurer.add(this.size);\n },\n\n seekProperty() {\n throw new Error('Method not implemented.');\n },\n\n resolve(): string {\n return options.label;\n },\n };\n\n const construct = (...args: (number | ColumnType)[]): ValueType => {\n const elements: number[] = [];\n\n for (const arg of args) {\n if (typeof arg === 'number') {\n elements.push(arg);\n } else {\n elements.push(...arg);\n }\n }\n\n // Fill the rest with zeros\n for (let i = elements.length; i < options.columns * options.rows; ++i) {\n elements.push(0);\n }\n\n return options.makeFromElements(...elements);\n };\n\n return Object.assign(construct, MatSchema);\n}\n\ninterface matBase<TColumn> extends NumberArrayView {\n readonly columns: readonly TColumn[];\n elements(): Iterable<number>;\n}\n\nabstract class mat2x2Impl<TColumn extends vec2f> implements mat2x2<TColumn> {\n public readonly columns: readonly [TColumn, TColumn];\n public readonly length = 4;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n this.columns = [\n this.makeColumn(elements[0] as number, elements[1] as number),\n this.makeColumn(elements[2] as number, elements[3] as number),\n ];\n }\n\n abstract makeColumn(e0: number, e1: number): TColumn;\n\n *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n }\n\n get [0]() {\n return this.columns[0].x;\n }\n\n get [1]() {\n return this.columns[0].y;\n }\n\n get [2]() {\n return this.columns[1].x;\n }\n\n get [3]() {\n return this.columns[1].y;\n }\n\n set [0](value: number) {\n this.columns[0].x = value;\n }\n\n set [1](value: number) {\n this.columns[0].y = value;\n }\n\n set [2](value: number) {\n this.columns[1].x = value;\n }\n\n set [3](value: number) {\n this.columns[1].y = value;\n }\n}\n\nclass mat2x2fImpl extends mat2x2Impl<vec2f> implements mat2x2f {\n makeColumn(e0: number, e1: number): vec2f {\n return vec2f(e0, e1);\n }\n}\n\nabstract class mat3x3Impl<TColumn extends vec3f> implements mat3x3<TColumn> {\n public readonly columns: readonly [TColumn, TColumn, TColumn];\n public readonly length = 12;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n ),\n this.makeColumn(\n elements[3] as number,\n elements[4] as number,\n elements[5] as number,\n ),\n this.makeColumn(\n elements[6] as number,\n elements[7] as number,\n elements[8] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number): TColumn;\n\n *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n yield* this.columns[2];\n }\n\n get [0]() {\n return this.columns[0].x;\n }\n\n get [1]() {\n return this.columns[0].y;\n }\n\n get [2]() {\n return this.columns[0].z;\n }\n\n get [3]() {\n return 0;\n }\n\n get [4]() {\n return this.columns[1].x;\n }\n\n get [5]() {\n return this.columns[1].y;\n }\n\n get [6]() {\n return this.columns[1].z;\n }\n\n get [7]() {\n return 0;\n }\n\n get [8]() {\n return this.columns[2].x;\n }\n\n get [9]() {\n return this.columns[2].y;\n }\n\n get [10]() {\n return this.columns[2].z;\n }\n\n get [11]() {\n return 0;\n }\n\n set [0](value: number) {\n this.columns[0].x = value;\n }\n\n set [1](value: number) {\n this.columns[0].y = value;\n }\n\n set [2](value: number) {\n this.columns[0].z = value;\n }\n\n set [3](_: number) {}\n\n set [4](value: number) {\n this.columns[1].x = value;\n }\n\n set [5](value: number) {\n this.columns[1].y = value;\n }\n\n set [6](value: number) {\n this.columns[1].z = value;\n }\n\n set [7](_: number) {}\n\n set [8](value: number) {\n this.columns[2].x = value;\n }\n\n set [9](value: number) {\n this.columns[2].y = value;\n }\n\n set [10](value: number) {\n this.columns[2].z = value;\n }\n\n set [11](_: number) {}\n}\n\nclass mat3x3fImpl extends mat3x3Impl<vec3f> implements mat3x3f {\n makeColumn(x: number, y: number, z: number): vec3f {\n return vec3f(x, y, z);\n }\n}\n\nabstract class mat4x4Impl<TColumn extends vec4f> implements mat4x4<TColumn> {\n public readonly columns: readonly [TColumn, TColumn, TColumn, TColumn];\n\n constructor(...elements: number[]) {\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n elements[3] as number,\n ),\n this.makeColumn(\n elements[4] as number,\n elements[5] as number,\n elements[6] as number,\n elements[7] as number,\n ),\n this.makeColumn(\n elements[8] as number,\n elements[9] as number,\n elements[10] as number,\n elements[11] as number,\n ),\n this.makeColumn(\n elements[12] as number,\n elements[13] as number,\n elements[14] as number,\n elements[15] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number, w: number): TColumn;\n\n *elements() {\n yield* this.columns[0];\n yield* this.columns[1];\n yield* this.columns[2];\n yield* this.columns[3];\n }\n\n public readonly length = 16;\n [n: number]: number;\n\n get [0]() {\n return this.columns[0].x;\n }\n\n get [1]() {\n return this.columns[0].y;\n }\n\n get [2]() {\n return this.columns[0].z;\n }\n\n get [3]() {\n return this.columns[0].w;\n }\n\n get [4]() {\n return this.columns[1].x;\n }\n\n get [5]() {\n return this.columns[1].y;\n }\n\n get [6]() {\n return this.columns[1].z;\n }\n\n get [7]() {\n return this.columns[1].w;\n }\n\n get [8]() {\n return this.columns[2].x;\n }\n\n get [9]() {\n return this.columns[2].y;\n }\n\n get [10]() {\n return this.columns[2].z;\n }\n\n get [11]() {\n return this.columns[2].w;\n }\n\n get [12]() {\n return this.columns[3].x;\n }\n\n get [13]() {\n return this.columns[3].y;\n }\n\n get [14]() {\n return this.columns[3].z;\n }\n\n get [15]() {\n return this.columns[3].w;\n }\n\n set [0](value: number) {\n this.columns[0].x = value;\n }\n\n set [1](value: number) {\n this.columns[0].y = value;\n }\n\n set [2](value: number) {\n this.columns[0].z = value;\n }\n\n set [3](value: number) {\n this.columns[0].w = value;\n }\n\n set [4](value: number) {\n this.columns[1].x = value;\n }\n\n set [5](value: number) {\n this.columns[1].y = value;\n }\n\n set [6](value: number) {\n this.columns[1].z = value;\n }\n\n set [7](value: number) {\n this.columns[1].w = value;\n }\n\n set [8](value: number) {\n this.columns[2].x = value;\n }\n\n set [9](value: number) {\n this.columns[2].y = value;\n }\n\n set [10](value: number) {\n this.columns[2].z = value;\n }\n\n set [11](value: number) {\n this.columns[2].w = value;\n }\n\n set [12](value: number) {\n this.columns[3].x = value;\n }\n\n set [13](value: number) {\n this.columns[3].y = value;\n }\n\n set [14](value: number) {\n this.columns[3].z = value;\n }\n\n set [15](value: number) {\n this.columns[3].w = value;\n }\n}\n\nclass mat4x4fImpl extends mat4x4Impl<vec4f> implements mat4x4f {\n makeColumn(x: number, y: number, z: number, w: number): vec4f {\n return vec4f(x, y, z, w);\n }\n}\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2\n * A matrix with 2 rows and 2 columns, with elements of type `TColumn`\n */\ninterface mat2x2<TColumn> extends matBase<TColumn> {\n readonly length: 4;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2f or mat2x2<f32>\n * A matrix with 2 rows and 2 columns, with elements of type d.f32\n */\nexport interface mat2x2f extends mat2x2<vec2f> {}\n\n/**\n * Type of the `d.mat2x2f` object/function: matrix data type schema/constructor\n */\nexport type Mat2x2f = TgpuData<mat2x2f> &\n ((...elements: number[]) => mat2x2f) &\n ((...columns: vec2f[]) => mat2x2f) &\n (() => mat2x2f);\n\n/**\n *\n * Schema representing mat2x2f - a matrix with 2 rows and 2 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero2x2 = mat2x2f(); // filled with zeros\n *\n * @example\n * const mat = mat2x2f(0, 1, 2, 3);\n * mat[0] // vec2f(0, 1)\n * mat[1] // vec2f(2, 3)\n *\n * @example\n * const mat = mat2x2f(\n * vec2f(0, 1), // column 0\n * vec2f(1, 2), // column 1\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat2x2f, d.mat2x2f(0, 1, 2, 3)); // buffer holding a d.mat2x2f value, with an initial value of ((0, 1), (2, 3))\n */\nexport const mat2x2f = createMatSchema({\n label: 'mat2x2f',\n columnType: vec2f,\n rows: 2,\n columns: 2,\n makeFromColumnVectors: (...columns: [vec2f, vec2f]) =>\n new mat2x2fImpl(...columns[0], ...columns[1]),\n makeFromElements: (...elements: number[]) => new mat2x2fImpl(...elements),\n}) as Mat2x2f;\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3\n * A matrix with 3 rows and 3 columns, with elements of type `TColumn`\n */\ninterface mat3x3<TColumn> extends matBase<TColumn> {\n readonly length: 12;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3f or mat3x3<f32>\n * A matrix with 3 rows and 3 columns, with elements of type d.f32\n */\nexport interface mat3x3f extends mat3x3<vec3f> {}\n\n/**\n * Type of the `d.mat3x3f` object/function: matrix data type schema/constructor\n */\nexport type Mat3x3f = TgpuData<mat3x3f> &\n ((...elements: number[]) => mat3x3f) &\n ((...columns: vec3f[]) => mat3x3f) &\n (() => mat3x3f);\n\n/**\n *\n * Schema representing mat3x3f - a matrix with 3 rows and 3 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero3x3 = mat3x3f(); // filled with zeros\n *\n * @example\n * const mat = mat3x3f(0, 1, 2, 3, 4, 5, 6, 7, 8);\n * mat[0] // vec3f(0, 1, 2)\n * mat[1] // vec3f(3, 4, 5)\n * mat[2] // vec3f(6, 7, 8)\n *\n * @example\n * const mat = mat3x3f(\n * vec3f(0, 1, 2), // column 0\n * vec3f(2, 3, 4), // column 1\n * vec3f(5, 6, 7), // column 2\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat3x3f, d.mat3x3f()); // buffer holding a d.mat3x3f value, with an initial value of mat3x3f filled with zeros\n */\nexport const mat3x3f = createMatSchema({\n label: 'mat3x3f',\n columnType: vec3f,\n rows: 3,\n columns: 3,\n makeFromColumnVectors(...[v0, v1, v2]: [vec3f, vec3f, vec3f]) {\n return new mat3x3fImpl(...v0, ...v1, ...v2);\n },\n makeFromElements: (...elements: number[]) => new mat3x3fImpl(...elements),\n}) as Mat3x3f;\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4\n * A matrix with 4 rows and 4 columns, with elements of type `TColumn`\n */\ninterface mat4x4<TColumn> extends matBase<TColumn> {\n readonly length: 16;\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4f or mat4x4<f32>\n * A matrix with 4 rows and 4 columns, with elements of type d.f32\n */\nexport interface mat4x4f extends mat4x4<vec4f> {}\n\n/**\n * Type of the `d.mat4x4f` object/function: matrix data type schema/constructor\n */\nexport type Mat4x4f = TgpuData<mat4x4f> &\n ((...elements: number[]) => mat4x4f) &\n ((...columns: vec4f[]) => mat4x4f) &\n (() => mat4x4f);\n\n/**\n *\n * Schema representing mat4x4f - a matrix with 4 rows and 4 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero4x4 = mat4x4f(); // filled with zeros\n *\n * @example\n * const mat = mat3x3f(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n * mat[0] // vec4f(0, 1, 2, 3)\n * mat[1] // vec4f(4, 5, 6, 7)\n * mat[2] // vec4f(8, 9, 10, 11)\n * mat[3] // vec4f(12, 13, 14, 15)\n *\n * @example\n * const mat = mat3x3f(\n * vec4f(0, 1, 2, 3), // column 0\n * vec4f(4, 5, 6, 7), // column 1\n * vec4f(8, 9, 10, 11), // column 2\n * vec4f(12, 13, 14, 15), // column 3\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat4x4f, d.mat4x4f()); // buffer holding a d.mat4x4f value, with an initial value of mat4x4f filled with zeros\n */\nexport const mat4x4f = createMatSchema({\n label: 'mat4x4f',\n columnType: vec4f,\n rows: 4,\n columns: 4,\n makeFromColumnVectors(...[v0, v1, v2, v3]: [vec4f, vec4f, vec4f, vec4f]) {\n return new mat4x4fImpl(...v0, ...v1, ...v2, ...v3);\n },\n makeFromElements: (...elements: number[]) => new mat4x4fImpl(...elements),\n}) as Mat4x4f;\n","import type {\n IMeasurer,\n ISerialInput,\n ISerialOutput,\n MaxValue,\n Parsed,\n} from 'typed-binary';\nimport { BufferReader, Measurer, Schema } from 'typed-binary';\nimport type { VertexFormat } from '../shared/vertexFormat';\nimport type { TgpuLooseData } from '../types';\nimport { f32, i32, u32 } from './numeric';\nimport {\n type Vec2f,\n type Vec2i,\n type Vec2u,\n type Vec3f,\n type Vec3i,\n type Vec3u,\n type Vec4f,\n type Vec4i,\n type Vec4u,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n} from './vector';\n\nexport type FormatToWGSLType<T extends VertexFormat> =\n (typeof formatToWGSLType)[T];\n\nexport interface TgpuVertexFormatData<T extends VertexFormat>\n extends TgpuLooseData<FormatToWGSLType<T>> {\n readonly kind: T;\n}\n\nclass TgpuVertexFormatDataImpl<T extends VertexFormat>\n extends Schema<FormatToWGSLType<T>>\n implements TgpuVertexFormatData<T>\n{\n private underlyingType: FormatToWGSLType<T>;\n private elementSize: 1 | 2 | 4;\n private elementCount: number;\n private isSigned: boolean;\n readonly byteAlignment = 1;\n readonly isLoose = true;\n\n constructor(\n readonly size: number,\n readonly kind: T,\n ) {\n super();\n this.underlyingType = formatToWGSLType[kind];\n this.isSigned = normalizedToIsSigned[kind] ?? false;\n this.elementCount = this.underlyingType.size / 4;\n const elementSize = size / this.elementCount;\n if (elementSize !== 1 && elementSize !== 2 && elementSize !== 4) {\n throw new Error('Invalid element size');\n }\n this.elementSize = elementSize;\n }\n\n write(\n output: ISerialOutput,\n value: Parsed<typeof this.underlyingType>,\n ): void {\n if (typeof value === 'number') {\n // since the value is not a vector, we can just write it directly\n // (all single component attributes are 32-bit)\n switch (this.underlyingType) {\n case u32:\n output.writeUint32(value);\n break;\n case f32:\n output.writeFloat32(value);\n break;\n case i32:\n output.writeInt32(value);\n break;\n default:\n throw new Error('Invalid underlying type');\n }\n return;\n }\n writeSizedVector(output, value, this.elementSize, this.isSigned);\n }\n\n read(input: ISerialInput): Parsed<typeof this.underlyingType> {\n const readBuffer = new ArrayBuffer(this.size);\n const readView = new DataView(readBuffer);\n for (let i = 0; i < this.size; i++) {\n readView.setUint8(i, input.readByte());\n }\n if (this.elementCount === 1) {\n switch (this.underlyingType) {\n case u32:\n return readView.getUint32(0) as Parsed<typeof this.underlyingType>;\n case f32:\n return readView.getFloat32(0) as Parsed<typeof this.underlyingType>;\n case i32:\n return readView.getInt32(0) as Parsed<typeof this.underlyingType>;\n default:\n throw new Error('Invalid underlying type');\n }\n }\n\n const vector = this.underlyingType as\n | Vec2u\n | Vec3u\n | Vec4u\n | Vec2f\n | Vec3f\n | Vec4f\n | Vec2i\n | Vec3i\n | Vec4i;\n const primitive =\n vectorKindToPrimitive[vector.label as keyof typeof vectorKindToPrimitive];\n\n const values = new Array(this.elementCount);\n const reader = new BufferReader(readBuffer);\n for (let i = 0; i < this.elementCount; i++) {\n values[i] = readSizedPrimitive(\n primitive,\n this.elementSize,\n reader,\n this.isSigned,\n );\n }\n\n switch (vector) {\n case vec2u:\n case vec2f:\n case vec2i:\n return vector(values[0], values[1]) as Parsed<\n typeof this.underlyingType\n >;\n case vec3u:\n case vec3f:\n case vec3i:\n return vector(values[0], values[1], values[2]) as Parsed<\n typeof this.underlyingType\n >;\n case vec4u:\n case vec4f:\n case vec4i:\n return vector(values[0], values[1], values[2], values[3]) as Parsed<\n typeof this.underlyingType\n >;\n default:\n throw new Error('Invalid underlying type');\n }\n }\n\n measure(\n _: Parsed<FormatToWGSLType<T>, Record<string, never>> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return measurer.add(this.size);\n }\n}\n\nconst vectorKindToPrimitive = {\n vec2u: 'u32',\n vec3u: 'u32',\n vec4u: 'u32',\n vec2f: 'f32',\n vec3f: 'f32',\n vec4f: 'f32',\n vec2i: 'i32',\n vec3i: 'i32',\n vec4i: 'i32',\n} as const;\n\nfunction writeSizedVector(\n output: ISerialOutput,\n value: vec2u | vec3u | vec4u | vec2f | vec3f | vec4f | vec2i | vec3i | vec4i,\n elementSize: 1 | 2 | 4,\n isSigned: boolean,\n): void {\n const primitive = vectorKindToPrimitive[value.kind];\n for (const entry of value) {\n writeSizedPrimitive(primitive, entry, elementSize, output, isSigned);\n }\n}\n\nfunction writeSizedPrimitive(\n primitive: 'u32' | 'f32' | 'i32',\n value: number,\n size: 1 | 2 | 4,\n output: ISerialOutput,\n floatSigned = true,\n): void {\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n\n const writef8 = (offset: number, value: number) => {\n const asInt = floatSigned ? value * 127 + 128 : value * 255;\n view.setUint8(offset, Math.floor(asInt));\n };\n const writef16 = (offset: number, value: number) => {\n const asInt = floatSigned ? value * 32767 + 32768 : value * 65535;\n view.setUint16(offset, Math.floor(asInt));\n };\n\n const setters = {\n u32: [view.setUint8, view.setUint16, view.setUint32],\n f32: [writef8, writef16, view.setFloat32],\n i32: [view.setInt8, view.setInt16, view.setInt32],\n };\n\n const setter = setters[primitive][Math.log2(size)];\n if (setter) {\n setter.call(view, 0, value);\n }\n for (let i = 0; i < size; i++) {\n output.writeByte(view.getUint8(i));\n }\n}\n\nfunction readSizedPrimitive(\n primitive: 'u32' | 'f32' | 'i32',\n size: 1 | 2 | 4,\n input: ISerialInput,\n floatSigned = true,\n): number {\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n for (let i = 0; i < size; i++) {\n view.setUint8(i, input.readByte());\n }\n\n const readf8 = (offset: number) => {\n const asInt = view.getUint8(offset);\n return floatSigned ? (asInt - 128) / 127 : asInt / 255;\n };\n const readf16 = (offset: number) => {\n const asInt = view.getUint16(offset);\n return floatSigned ? (asInt - 32768) / 32767 : asInt / 65535;\n };\n\n const getters = {\n u32: [view.getUint8, view.getUint16, view.getUint32],\n f32: [readf8, readf16, view.getFloat32],\n i32: [view.getInt8, view.getInt16, view.getInt32],\n };\n\n const getter = getters[primitive][Math.log2(size)];\n if (getter) {\n return getter.call(view, 0);\n }\n throw new Error('Invalid primitive');\n}\n\nconst formatToWGSLType = {\n uint8x2: vec2u,\n uint8x4: vec4u,\n sint8x2: vec2i,\n sint8x4: vec4i,\n unorm8x2: vec2f,\n unorm8x4: vec4f,\n snorm8x2: vec2f,\n snorm8x4: vec4f,\n uint16x2: vec2u,\n uint16x4: vec4u,\n sint16x2: vec2i,\n sint16x4: vec4i,\n unorm16x2: vec2f,\n unorm16x4: vec4f,\n snorm16x2: vec2f,\n snorm16x4: vec4f,\n float16x2: vec2f,\n float16x4: vec4f,\n float32: f32,\n float32x2: vec2f,\n float32x3: vec3f,\n float32x4: vec4f,\n uint32: u32,\n uint32x2: vec2u,\n uint32x3: vec3u,\n uint32x4: vec4u,\n sint32: i32,\n sint32x2: vec2i,\n sint32x3: vec3i,\n sint32x4: vec4i,\n unorm10_10_10_2: vec4f,\n} as const;\n\nconst normalizedToIsSigned = {\n unorm8x2: false,\n unorm8x4: false,\n snorm8x2: true,\n snorm8x4: true,\n unorm16x2: false,\n unorm16x4: false,\n snorm16x2: true,\n snorm16x4: true,\n float16x2: true,\n float16x4: true,\n unorm10_10_10_2: false,\n} as Record<VertexFormat, boolean | undefined>;\n\nexport type uint8x2 = TgpuVertexFormatData<'uint8x2'>;\nexport const uint8x2 = new TgpuVertexFormatDataImpl(2, 'uint8x2') as uint8x2;\n\nexport type uint8x4 = TgpuVertexFormatData<'uint8x4'>;\nexport const uint8x4 = new TgpuVertexFormatDataImpl(4, 'uint8x4') as uint8x4;\n\nexport type sint8x2 = TgpuVertexFormatData<'sint8x2'>;\nexport const sint8x2 = new TgpuVertexFormatDataImpl(2, 'sint8x2') as sint8x2;\n\nexport type sint8x4 = TgpuVertexFormatData<'sint8x4'>;\nexport const sint8x4 = new TgpuVertexFormatDataImpl(4, 'sint8x4') as sint8x4;\n\nexport type unorm8x2 = TgpuVertexFormatData<'unorm8x2'>;\nexport const unorm8x2 = new TgpuVertexFormatDataImpl(2, 'unorm8x2') as unorm8x2;\n\nexport type unorm8x4 = TgpuVertexFormatData<'unorm8x4'>;\nexport const unorm8x4 = new TgpuVertexFormatDataImpl(4, 'unorm8x4') as unorm8x4;\n\nexport type snorm8x2 = TgpuVertexFormatData<'snorm8x2'>;\nexport const snorm8x2 = new TgpuVertexFormatDataImpl(2, 'snorm8x2') as snorm8x2;\n\nexport type snorm8x4 = TgpuVertexFormatData<'snorm8x4'>;\nexport const snorm8x4 = new TgpuVertexFormatDataImpl(4, 'snorm8x4') as snorm8x4;\n\nexport type uint16x2 = TgpuVertexFormatData<'uint16x2'>;\nexport const uint16x2 = new TgpuVertexFormatDataImpl(4, 'uint16x2') as uint16x2;\n\nexport type uint16x4 = TgpuVertexFormatData<'uint16x4'>;\nexport const uint16x4 = new TgpuVertexFormatDataImpl(8, 'uint16x4') as uint16x4;\n\nexport type sint16x2 = TgpuVertexFormatData<'sint16x2'>;\nexport const sint16x2 = new TgpuVertexFormatDataImpl(4, 'sint16x2') as sint16x2;\n\nexport type sint16x4 = TgpuVertexFormatData<'sint16x4'>;\nexport const sint16x4 = new TgpuVertexFormatDataImpl(8, 'sint16x4') as sint16x4;\n\nexport type unorm16x2 = TgpuVertexFormatData<'unorm16x2'>;\nexport const unorm16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'unorm16x2',\n) as unorm16x2;\n\nexport type unorm16x4 = TgpuVertexFormatData<'unorm16x4'>;\nexport const unorm16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'unorm16x4',\n) as unorm16x4;\n\nexport type snorm16x2 = TgpuVertexFormatData<'snorm16x2'>;\nexport const snorm16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'snorm16x2',\n) as snorm16x2;\n\nexport type snorm16x4 = TgpuVertexFormatData<'snorm16x4'>;\nexport const snorm16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'snorm16x4',\n) as snorm16x4;\n\nexport type float16x2 = TgpuVertexFormatData<'float16x2'>;\nexport const float16x2 = new TgpuVertexFormatDataImpl(\n 4,\n 'float16x2',\n) as float16x2;\n\nexport type float16x4 = TgpuVertexFormatData<'float16x4'>;\nexport const float16x4 = new TgpuVertexFormatDataImpl(\n 8,\n 'float16x4',\n) as float16x4;\n\nexport type float32 = TgpuVertexFormatData<'float32'>;\nexport const float32 = new TgpuVertexFormatDataImpl(4, 'float32') as float32;\n\nexport type float32x2 = TgpuVertexFormatData<'float32x2'>;\nexport const float32x2 = new TgpuVertexFormatDataImpl(\n 8,\n 'float32x2',\n) as float32x2;\n\nexport type float32x3 = TgpuVertexFormatData<'float32x3'>;\nexport const float32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'float32x3',\n) as float32x3;\n\nexport type float32x4 = TgpuVertexFormatData<'float32x4'>;\nexport const float32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'float32x4',\n) as float32x4;\n\nexport type uint32 = TgpuVertexFormatData<'uint32'>;\nexport const uint32 = new TgpuVertexFormatDataImpl(4, 'uint32') as uint32;\n\nexport type uint32x2 = TgpuVertexFormatData<'uint32x2'>;\nexport const uint32x2 = new TgpuVertexFormatDataImpl(8, 'uint32x2') as uint32x2;\n\nexport type uint32x3 = TgpuVertexFormatData<'uint32x3'>;\nexport const uint32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'uint32x3',\n) as uint32x3;\n\nexport type uint32x4 = TgpuVertexFormatData<'uint32x4'>;\nexport const uint32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'uint32x4',\n) as uint32x4;\n\nexport type sint32 = TgpuVertexFormatData<'sint32'>;\nexport const sint32 = new TgpuVertexFormatDataImpl(4, 'sint32') as sint32;\n\nexport type sint32x2 = TgpuVertexFormatData<'sint32x2'>;\nexport const sint32x2 = new TgpuVertexFormatDataImpl(8, 'sint32x2') as sint32x2;\n\nexport type sint32x3 = TgpuVertexFormatData<'sint32x3'>;\nexport const sint32x3 = new TgpuVertexFormatDataImpl(\n 12,\n 'sint32x3',\n) as sint32x3;\n\nexport type sint32x4 = TgpuVertexFormatData<'sint32x4'>;\nexport const sint32x4 = new TgpuVertexFormatDataImpl(\n 16,\n 'sint32x4',\n) as sint32x4;\n\nexport type unorm10_10_10_2 = TgpuVertexFormatData<'unorm10_10_10_2'>;\nexport const unorm10_10_10_2 = new TgpuVertexFormatDataImpl(\n 4,\n 'unorm10_10_10_2',\n) as unorm10_10_10_2;\n","import type { AnyTgpuData, TgpuPointer } from '../types';\n\nexport function ptr<TDataType extends AnyTgpuData>(\n pointsTo: TDataType,\n): TgpuPointer<'function', TDataType> {\n return {\n scope: 'function',\n pointsTo,\n };\n}\n","import {\n type IMeasurer,\n type ISerialInput,\n type ISerialOutput,\n type MaxValue,\n Measurer,\n type ParseUnwrapped,\n Schema,\n type Unwrap,\n} from 'typed-binary';\nimport { RecursiveDataTypeError } from '../errors';\nimport type { ResolutionCtx, TgpuData } from '../types';\nimport type { I32, U32 } from './numeric';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Marks a concrete integer scalar type schema (u32 or i32) as a WGSL atomic.\n *\n * @example\n * const atomicU32 = d.atomic(d.u32);\n * const atomicI32 = d.atomic(d.i32);\n *\n * @param data Underlying type schema.\n */\nexport function atomic<TSchema extends U32 | I32>(\n data: TSchema,\n): Atomic<TSchema> {\n return new AtomicImpl(data);\n}\n\n/**\n * Atomic schema constructed via `d.atomic` function.\n */\nexport interface Atomic<TSchema extends U32 | I32>\n extends TgpuData<Unwrap<TSchema>> {}\n\n/**\n * Checks whether the passed in value is a d.atomic schema.\n *\n * @example\n * isAtomicSchema(d.atomic(d.u32)) // true\n * isAtomicSchema(d.u32) // false\n */\nexport function isAtomicSchema<T extends Atomic<U32 | I32>>(\n schema: T | unknown,\n): schema is T {\n return schema instanceof AtomicImpl;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass AtomicImpl<TSchema extends U32 | I32>\n extends Schema<Unwrap<TSchema>>\n implements Atomic<TSchema>\n{\n public readonly size: number;\n public readonly byteAlignment: number;\n public readonly isLoose = false as const;\n\n constructor(private readonly innerData: TSchema) {\n super();\n this.size = this.innerData.size;\n this.byteAlignment = this.innerData.byteAlignment;\n }\n\n resolveReferences(): void {\n throw new RecursiveDataTypeError();\n }\n\n write(output: ISerialOutput, value: ParseUnwrapped<TSchema>): void {\n this.innerData.write(output, value);\n }\n\n read(input: ISerialInput): ParseUnwrapped<TSchema> {\n return this.innerData.read(input) as ParseUnwrapped<TSchema>;\n }\n\n measure(\n value: ParseUnwrapped<TSchema> | MaxValue,\n measurer: IMeasurer = new Measurer(),\n ): IMeasurer {\n return this.innerData.measure(value, measurer);\n }\n\n resolve(ctx: ResolutionCtx): string {\n return `atomic<${ctx.resolve(this.innerData)}>`;\n }\n}\n"],"mappings":"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","names":["MaxValue","Measurer","Schema","ResolutionError","_ResolutionError","cause","trace","entries","ancestor","newTrace","MissingSlotValueError","_MissingSlotValueError","slot","RecursiveDataTypeError","_RecursiveDataTypeError","NotUniformError","_NotUniformError","value","_a","SimpleTgpuData","Schema","schema","byteAlignment","code","__publicField","MaxValue","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx","TB","gpuDepth","onGPU","callback","inGPUMode","primitiveNumeric","schema","code","output","value","input","measurer","ctx","RecursiveDataTypeError","reference","prop","bool","SimpleTgpuData","u32Cast","v","inGPUMode","u32","i32Cast","i32","f32Cast","f32","MaxValue","Measurer","Schema","identifier","TgpuIdentifierImpl","__publicField","label","ctx","_a","builtinNames","builtinSymbolToName","name","builtinNameToSymbol","s","n","identifierMap","nameForBuiltin","key","idForBuiltin","id","identifier","UnknownData","isResolvable","value","isWgsl","isSamplerType","type","isDepthTextureType","type","isExternalTextureType","type","isDataLoose","data","isDataNotLoose","isGPUBuffer","value","isSlot","code","strings","params","segments","string","idx","param","TgpuCodeImpl","__publicField","label","ctx","s","isResolvable","result","eventual","idForBuiltin","slot","value","BoundTgpuCodeImpl","_a","_BoundTgpuCodeImpl","_innerFn","_slotValuePair","_b","alignIO","io","baseAlignment","currentPos","bitMask","offset","alignIO_default","Measurer","Schema","roundUp","value","modulo","bitMask","invBitMask","MaxValue","Measurer","attribute","data","attrib","isDecorated","DecoratedImpl","isLooseDecorated","LooseDecoratedImpl","isDataLoose","align","alignment","size","location","value","getCustomAlignment","getAttributesString","field","isDecorated","isLooseDecorated","attrib","BaseDecoratedImpl","inner","attributes","__publicField","_a","_b","_c","_d","a","MaxValue","isDataNotLoose","_","RecursiveDataTypeError","output","value","alignIO_default","beginning","input","measurer","Measurer","reference","prop","DecoratedImpl","ctx","LooseDecoratedImpl","arrayOf","elementType","count","TgpuArrayImpl","looseArrayOf","TgpuLooseArrayImpl","isArraySchema","schema","isLooseArraySchema","Schema","elementCount","__publicField","roundUp","output","value","alignIO_default","beginning","i","input","elements","_","measurer","Measurer","ctx","elementTypeResolved","arrayType","_a","getCustomAlignment","struct","properties","TgpuStructImpl","looseStruct","TgpuLooseStructImpl","isStructSchema","schema","isLooseStructSchema","generateField","key","field","code","getAttributesString","Schema","__publicField","prop","a","b","MaxValue","label","RecursiveDataTypeError","output","value","alignIO_default","property","input","result","measurer","Measurer","structMeasurer","maxing","isArraySchema","ctx","ident","identifier","Measurer","f32","i32","u32","makeVecSchema","options","VecSchema","ctx","RecursiveDataTypeError","output","value","element","input","_","_value","measurer","Measurer","_reference","_prop","args","_a","values","inGPUMode","vec2Impl","x","y","__publicField","vec2fImpl","_vec2fImpl","z","vec3fImpl","w","vec4fImpl","vec2iImpl","_vec2iImpl","vec3iImpl","vec4iImpl","vec2uImpl","_vec2uImpl","vec3uImpl","vec4uImpl","vec3Impl","_vec3fImpl","_vec3iImpl","_vec3uImpl","vec4Impl","_vec4fImpl","_vec4iImpl","_vec4uImpl","vecProxyHandler","target","prop","targetAsVec4","idx","char","vec2f","f32","vec2i","i32","vec2u","u32","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","Measurer","createMatSchema","options","MatSchema","roundUp","RecursiveDataTypeError","output","value","col","input","columns","c","_value","measurer","Measurer","args","elements","arg","i","mat2x2Impl","__publicField","__yieldStar","mat2x2fImpl","e0","e1","vec2f","mat3x3Impl","_","mat3x3fImpl","x","y","z","vec3f","mat4x4Impl","mat4x4fImpl","w","vec4f","mat2x2f","mat3x3f","v0","v1","v2","mat4x4f","v3","BufferReader","Measurer","Schema","TgpuVertexFormatDataImpl","Schema","size","kind","_a","__publicField","formatToWGSLType","normalizedToIsSigned","elementSize","output","value","u32","f32","i32","writeSizedVector","input","readBuffer","readView","i","vector","primitive","vectorKindToPrimitive","values","reader","BufferReader","readSizedPrimitive","vec2u","vec2f","vec2i","vec3u","vec3f","vec3i","vec4u","vec4f","vec4i","_","measurer","Measurer","isSigned","entry","writeSizedPrimitive","floatSigned","buffer","view","writef8","offset","asInt","writef16","setter","readf8","readf16","getter","uint8x2","uint8x4","sint8x2","sint8x4","unorm8x2","unorm8x4","snorm8x2","snorm8x4","uint16x2","uint16x4","sint16x2","sint16x4","unorm16x2","unorm16x4","snorm16x2","snorm16x4","float16x2","float16x4","float32","float32x2","float32x3","float32x4","uint32","uint32x2","uint32x3","uint32x4","sint32","sint32x2","sint32x3","sint32x4","unorm10_10_10_2","ptr","pointsTo","Measurer","Schema","atomic","data","AtomicImpl","isAtomicSchema","schema","Schema","innerData","__publicField","RecursiveDataTypeError","output","value","input","measurer","Measurer","ctx"]}
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var Ke=Object.defineProperty,He=Object.defineProperties;var qe=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var Pe=Object.prototype.hasOwnProperty,_e=Object.prototype.propertyIsEnumerable;var ue=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e);var ie=(e,t,n)=>t in e?Ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rt= exports.a =(e,t)=>{for(var n in t||(t={}))Pe.call(t,n)&&ie(e,n,t[n]);if(G)for(var n of G(t))_e.call(t,n)&&ie(e,n,t[n]);return e},Ct= exports.b =(e,t)=>He(e,qe(t));var Ut=(e,t)=>{var n={};for(var r in e)Pe.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&G)for(var r of G(e))t.indexOf(r)<0&&_e.call(e,r)&&(n[r]=e[r]);return n};var s=(e,t,n)=>(ie(e,typeof t!="symbol"?t+"":t,n),n);var Je=function(e,t){this[0]=e,this[1]=t};var f=e=>{var t=e[ue("asyncIterator")],n=!1,r,a={};return t==null?(t=e[ue("iterator")](),r=o=>a[o]=i=>t[o](i)):(t=t.call(e),r=o=>a[o]=i=>{if(n){if(n=!1,o==="throw")throw i;return i}return n=!0,{done:!1,value:new Je(new Promise(y=>{var h=t[o](i);if(!(h instanceof Object))throw TypeError("Object expected");y(h)}),1)}}),a[ue("iterator")]=()=>a,r("next"),"throw"in t?r("throw"):a.throw=o=>{throw o},"return"in t&&r("return"),a};var _typedbinary = require('typed-binary'); var w = _interopRequireWildcard(_typedbinary);var Re=class e extends Error{constructor(n,r){let a=r.map(o=>`- ${o}`);a.length>20&&(a=[...a.slice(0,11),"...",...a.slice(-10)]);super(`Resolution of the following tree failed:
2
+ ${a.join(`
3
+ `)}`);this.cause=n;this.trace=r;Object.setPrototypeOf(this,e.prototype)}appendToTrace(n){let r=[n,...this.trace];return new e(this.cause,r)}},Ce= exports.h =class e extends Error{constructor(n){super(`Missing value for '${n}'`);this.slot=n;Object.setPrototypeOf(this,e.prototype)}},p= exports.i =class e extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,e.prototype)}},Ue= exports.j =class e extends Error{constructor(t){var n;super(`Buffer '${(n=t.label)!=null?n:"<unnamed>"}' is not bindable as a uniform. Use .$usage(tgu.Uniform) to allow it.`),Object.setPrototypeOf(this,e.prototype)}};var K=class extends _typedbinary.Schema{constructor({schema:n,byteAlignment:r,code:a}){super();s(this,"size");s(this,"byteAlignment");s(this,"expressionCode");s(this,"_innerSchema");s(this,"isLoose",!1);s(this,"label");this._innerSchema=n,this.byteAlignment=r,this.expressionCode=a,this.size=this.measure(_typedbinary.MaxValue).size,this.label=a}resolveReferences(){throw new p}write(n,r){this._innerSchema.write(n,r)}read(n){return this._innerSchema.read(n)}measure(n,r=new _typedbinary.Measurer){return this._innerSchema.measure(n,r),r}resolve(n){return this.expressionCode}};var le=0;function $t(e){le++;try{return e()}finally{le--}}var z=()=>le>0;var ye=(e,t)=>({__unwrapped:void 0,isLoose:!1,kind:t,size:4,byteAlignment:4,expressionCode:t,write(n,r){e.write(n,r)},read(n){return e.read(n)},measure(n,r=new w.Measurer){return e.measure(n,r),r},resolveReferences(n){throw new p},seekProperty(n,r){throw new Error("Method not implemented.")},resolve(){return t},toString(){return t}}),Kt= exports.l =new K({schema:w.bool,byteAlignment:4,code:"bool"}),Ze=e=>z()?`u32(${e})`:typeof e=="boolean"?e?1:0:Number.isInteger(e)?((e<0||e>4294967295)&&console.warn(`u32 value ${e} overflowed`),(e&4294967295)>>>0):Math.max(0,Math.min(4294967295,Math.floor(e))),H= exports.m =Object.assign(Ze,ye(w.u32,"u32")),et=e=>{if(z())return`i32(${e})`;if(typeof e=="boolean")return e?1:0;if(Number.isInteger(e))return(e<-2147483648||e>2147483647)&&console.warn(`i32 value ${e} overflowed`),(e|0)&4294967295;let t=e<0?Math.ceil(e):Math.floor(e);return Math.max(-2147483648,Math.min(2147483647,t))},q= exports.n =Object.assign(et,ye(w.i32,"i32")),tt=e=>z()?`f32(${e})`:typeof e=="boolean"?e?1:0:e,J= exports.o =Object.assign(tt,ye(w.f32,"f32"));function Q(){return new me}var me=class{constructor(){s(this,"label")}$name(t){return this.label=t,this}resolve(t){return t.nameFor(this)}toString(){var t;return`id:${(t=this.label)!=null?t:"<unnamed>"}`}};var nt=["vertex_index","instance_index","position","clip_distances","front_facing","frag_depth","sample_index","sample_mask","fragment","local_invocation_id","local_invocation_index","global_invocation_id","workgroup_id","num_workgroups"],pe= exports.p =new Map(nt.map(e=>[Symbol(e),e])),Xt= exports.q =new Map(Array.from(pe).map(([e,t])=>[t,e])),Be=new Map;function Yt(e){let t=pe.get(e);if(!t)throw new Error(`The symbol ${String(e)} in not a valid 'builtin'`);return t}function Me(e){let t=Be.get(e);return t===void 0&&(t=Q().$name(pe.get(e)),Be.set(e,t)),t}var en=Symbol("Unknown data type");function ce(e){return!!e&&(typeof e=="object"||typeof e=="function")&&"resolve"in e}function tn(e){return typeof e=="number"||typeof e=="boolean"||typeof e=="string"||ce(e)}function nn(e){return e==="sampler"||e==="sampler_comparison"}function rn(e){return["texture_depth_2d","texture_depth_2d_array","texture_depth_cube","texture_depth_cube_array","texture_depth_multisampled_2d"].includes(e)}function an(e){return e==="texture_external"}function Le(e){return e.isLoose}function Ee(e){return!e.isLoose}function on(e){return!!e&&typeof e=="object"&&"getMappedRange"in e&&"mapAsync"in e}function sn(e){return e.__brand==="TgpuSlot"}function xe(e,...t){let n=e.flatMap((r,a)=>{let o=t[a];return o===void 0?[r]:Array.isArray(o)?[r,...o]:[r,o]});return new Te(n)}var Te=class{constructor(t){this.segments=t;s(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let n="";for(let r of this.segments)if(ce(r))n+=t.resolve(r);else if(typeof r=="function"){let a=r(o=>t.unwrap(o));n+=t.resolve(a)}else typeof r=="symbol"?(t.addBuiltin(r),n+=t.resolve(Me(r))):n+=String(r);return n}with(t,n){return new de(this,[t,n])}toString(){var t;return`code:${(t=this._label)!=null?t:"<unnamed>"}`}},de=class e{constructor(t,n){this._innerFn=t;this._slotValuePair=n}get label(){return this._innerFn.label}with(t,n){return new e(this,[t,n])}resolve(t){return t.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,a;let[t,n]=this._slotValuePair;return`code:${(r=this.label)!=null?r:"<unnamed>"}[${(a=t.label)!=null?a:"<unnamed>"}=${n}]`}};function rt(e,t){let n="size"in e?e.size:e.currentByteOffset,r=t-1,a=n&r;"skipBytes"in e?e.skipBytes(t-a&r):e.add(t-a&r)}var l=rt;var B=(e,t)=>{let n=t-1,r=~n;return e&n?(e&r)+t:e};function be(e,t){return fe(e)?new M(e.inner,[t,...e.attributes]):we(e)?new L(e.inner,[t,...e.attributes]):Le(e)?new L(e,[t]):new M(e,[t])}function st(e,t){return be(t,{type:"align",alignment:e})}function ut(e,t){return be(t,{type:"size",size:e})}function it(e,t){return be(t,{type:"location",location:e})}function fe(e){return e instanceof M}function we(e){return e instanceof L}function Fe(e){return e.alignAttrib}function Oe(e){return!fe(e)&&!we(e)?"":e.attributes.map(t=>t.type==="align"?`@align(${t.alignment}) `:t.type==="size"?`@size(${t.size}) `:t.type==="location"?`@location(${t.location}) `:"").join("")}var X=class{constructor(t,n){this.inner=t;this.attributes=n;s(this,"__unwrapped");s(this,"label");s(this,"byteAlignment");s(this,"size");s(this,"alignAttrib");s(this,"sizeAttrib");s(this,"locationAttrib");var r,a,o,i;if(this.alignAttrib=(r=n.find(y=>y.type==="align"))==null?void 0:r.alignment,this.sizeAttrib=(a=n.find(y=>y.type==="size"))==null?void 0:a.size,this.locationAttrib=(o=n.find(y=>y.type==="location"))==null?void 0:o.location,this.byteAlignment=(i=this.alignAttrib)!=null?i:t.byteAlignment,this.size=this.measure(_typedbinary.MaxValue).size,this.byteAlignment<=0)throw new Error(`Custom data alignment must be a positive number, got: ${this.byteAlignment}.`);if(Math.log2(this.byteAlignment)%1!==0)throw new Error(`Alignment has to be a power of 2, got: ${this.byteAlignment}.`);if(Ee(this.inner)&&this.byteAlignment%this.inner.byteAlignment!==0)throw new Error(`Custom alignment has to be a multiple of the standard data byteAlignment. Got: ${this.byteAlignment}, expected multiple of: ${this.inner.byteAlignment}.`);if(this.size<this.inner.size)throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${this.size}, expected at least: ${this.inner.size}.`);if(this.size<=0)throw new Error(`Custom data size must be a positive number. Got: ${this.size}.`)}resolveReferences(t){throw new p}write(t,n){var a;l(t,(a=this.alignAttrib)!=null?a:1);let r=t.currentByteOffset;this.inner.write(t,n),t.seekTo(r+this.size)}read(t){var a;l(t,(a=this.alignAttrib)!=null?a:1);let n=t.currentByteOffset,r=this.inner.read(t);return t.seekTo(n+this.size),r}measure(t,n=new _typedbinary.Measurer){var r;return l(n,(r=this.alignAttrib)!=null?r:1),this.sizeAttrib!==void 0?n.add(this.sizeAttrib):this.inner.measure(t,n)}seekProperty(t,n){return this.inner.seekProperty(t,n)}},M=class extends X{constructor(){super(...arguments);s(this,"isLoose",!1)}resolve(n){return n.resolve(this.inner)}},L=class extends X{constructor(){super(...arguments);s(this,"isLoose",!0)}};var lt=(e,t)=>new Y(e,t),yt= exports.I =(e,t)=>new Z(e,t);function ge(e){return e instanceof Y}function mt(e){return e instanceof Z}var Y=class extends _typedbinary.Schema{constructor(n,r){super();this.elementType=n;this.elementCount=r;s(this,"_size");s(this,"isRuntimeSized");s(this,"byteAlignment");s(this,"stride");s(this,"isLoose",!1);this.byteAlignment=n.byteAlignment,this.stride=B(n.size,n.byteAlignment),this._size=this.stride*r,this.isRuntimeSized=r===0}get size(){if(this.isRuntimeSized)throw new Error("Cannot get the size of a runtime-sized array");return this._size}write(n,r){if(this.isRuntimeSized)throw new Error("Cannot write a runtime-sized array");l(n,this.byteAlignment);let a=n.currentByteOffset;for(let o=0;o<Math.min(this.elementCount,r.length);o++)l(n,this.byteAlignment),this.elementType.write(n,r[o]);n.seekTo(a+this.size)}read(n){if(this.isRuntimeSized)throw new Error("Cannot read a runtime-sized array");l(n,this.byteAlignment);let r=[];for(let a=0;a<this.elementCount;a++)l(n,this.byteAlignment),r.push(this.elementType.read(n));return l(n,this.byteAlignment),r}measure(n,r=new _typedbinary.Measurer){return this.isRuntimeSized?r.unbounded:(l(r,this.byteAlignment),r.add(this.size))}resolve(n){let r=n.resolve(this.elementType),a=this.isRuntimeSized?`array<${r}>`:`array<${r}, ${this.elementCount}>`;return n.resolve(a)}},Z=class extends _typedbinary.Schema{constructor(n,r){var a;super();this.elementType=n;this.elementCount=r;s(this,"byteAlignment");s(this,"size");s(this,"stride");s(this,"isLoose",!0);this.byteAlignment=(a=Fe(n))!=null?a:1,this.stride=B(n.size,this.byteAlignment),this.size=this.stride*r}write(n,r){l(n,this.byteAlignment);let a=n.currentByteOffset;for(let o=0;o<Math.min(this.elementCount,r.length);o++)l(n,this.byteAlignment),this.elementType.write(n,r[o]);n.seekTo(a+this.size)}read(n){l(n,this.byteAlignment);let r=[];for(let a=0;a<this.elementCount;a++)l(n,this.byteAlignment),r.push(this.elementType.read(n));return l(n,this.byteAlignment),r}measure(n,r=new _typedbinary.Measurer){return l(r,this.byteAlignment),r.add(this.size)}};var pt=e=>new ee(e),ct= exports.M =e=>new te(e);function Tt(e){return e instanceof ee}function dt(e){return e instanceof te}function xt([e,t]){return xe` ${Oe(t)}${e}: ${t},\n`}var ee=class extends _typedbinary.Schema{constructor(n){super();this.properties=n;s(this,"_label");s(this,"_size");s(this,"byteAlignment");s(this,"isLoose",!1);s(this,"isRuntimeSized");this.byteAlignment=Object.values(n).map(r=>r.byteAlignment).reduce((r,a)=>r>a?r:a),this._size=this.measure(_typedbinary.MaxValue).size,this.isRuntimeSized=Number.isNaN(this._size)}get size(){if(this.isRuntimeSized)throw new Error("Cannot get size of struct with runtime sized properties");return this._size}get label(){return this._label}$name(n){return this._label=n,this}resolveReferences(){throw new p}write(n,r){if(this.isRuntimeSized)throw new Error("Cannot write struct with runtime sized properties");l(n,this.byteAlignment);for(let[a,o]of Object.entries(this.properties))l(n,o.byteAlignment),o.write(n,r[a]);l(n,this.byteAlignment)}read(n){if(this.isRuntimeSized)throw new Error("Cannot read struct with runtime sized properties");l(n,this.byteAlignment);let r={};for(let[a,o]of Object.entries(this.properties))l(n,o.byteAlignment),r[a]=o.read(n);return l(n,this.byteAlignment),r}measure(n,r=new _typedbinary.Measurer){let a=r;l(a,this.byteAlignment);let o=n===_typedbinary.MaxValue;for(let[i,y]of Object.entries(this.properties)){if(a.isUnbounded)throw new Error("Only the last property of a struct can be unbounded");if(l(a,y.byteAlignment),a=y.measure(o?_typedbinary.MaxValue:n[i],a),a.isUnbounded&&!ge(y))throw new Error("Cannot nest unbounded struct within another struct")}return l(a,this.byteAlignment),a}resolve(n){let r=Q().$name(this._label);return n.addDeclaration(xe`
4
+ struct ${r} {
5
+ ${Object.entries(this.properties).map(xt)}\
6
+ }
7
+ `),n.resolve(r)}},te=class extends _typedbinary.Schema{constructor(n){super();this.properties=n;s(this,"_label");s(this,"byteAlignment",1);s(this,"isLoose",!0);s(this,"size");this.size=this.measure(_typedbinary.MaxValue).size}get label(){return this._label}$name(n){return this._label=n,this}resolveReferences(){throw new p}write(n,r){for(let[a,o]of Object.entries(this.properties))o.write(n,r[a])}read(n){let r={};for(let[a,o]of Object.entries(this.properties))r[a]=o.read(n);return r}measure(n,r=new _typedbinary.Measurer){let a=n===_typedbinary.MaxValue;for(let[o,i]of Object.entries(this.properties))i.measure(a?_typedbinary.MaxValue:n[o],r);return r}};function g(e){let t={__unwrapped:void 0,isLoose:!1,size:e.length*4,label:e.label,byteAlignment:e.byteAlignment,kind:e.label,expressionCode:e.label,resolveReferences(r){throw new p},write(r,a){for(let o of a)e.unitType.write(r,o)},read(r){return e.make(...Array.from({length:e.length}).map(a=>e.unitType.read(r)))},measure(r,a=new _typedbinary.Measurer){return a.add(this.size)},seekProperty(r,a){throw new Error("Method not implemented.")},resolve(){return e.label},toString(){return e.label}};return Object.assign((...r)=>{var o;let a=r;if(z())return`${t.kind}(${a.join(", ")})`;if(a.length<=1)return e.makeFromScalar((o=a[0])!=null?o:0);if(a.length===e.length)return e.make(...a);throw new Error(`'${e.label}' constructor called with invalid number of arguments.`)},t)}var E=class{constructor(t,n){this.x=t;this.y=n;s(this,"length",2)}*[Symbol.iterator](){yield this.x,yield this.y}get 0(){return this.x}get 1(){return this.y}set 0(t){this.x=t}set 1(t){this.y=t}},A=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2f")}make2(n,r){return new e(n,r)}make3(n,r,a){return new k(n,r,a)}make4(n,r,a,o){return new P(n,r,a,o)}},D=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2i")}make2(n,r){return new e(n,r)}make3(n,r,a){return new V(n,r,a)}make4(n,r,a,o){return new _(n,r,a,o)}},S=class e extends E{constructor(){super(...arguments);s(this,"kind","vec2u")}make2(n,r){return new e(n,r)}make3(n,r,a){return new I(n,r,a)}make4(n,r,a,o){return new R(n,r,a,o)}},F=class{constructor(t,n,r){this.x=t;this.y=n;this.z=r;s(this,"length",3)}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}set 0(t){this.x=t}set 1(t){this.y=t}set 2(t){this.z=t}},k=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3f")}make2(n,r){return new A(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new P(n,r,a,o)}},V=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3i")}make2(n,r){return new D(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new _(n,r,a,o)}},I=class e extends F{constructor(){super(...arguments);s(this,"kind","vec3u")}make2(n,r){return new S(n,r)}make3(n,r,a){return new e(n,r,a)}make4(n,r,a,o){return new R(n,r,a,o)}},O=class{constructor(t,n,r,a){this.x=t;this.y=n;this.z=r;this.w=a;s(this,"length",4)}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}get 3(){return this.w}set 0(t){this.x=t}set 1(t){this.y=t}set 2(t){this.z=t}set 3(t){this.w=t}},P=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4f")}make2(n,r){return new A(n,r)}make3(n,r,a){return new k(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},_=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4i")}make2(n,r){return new D(n,r)}make3(n,r,a){return new V(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},R=class e extends O{constructor(){super(...arguments);s(this,"kind","vec4u")}make2(n,r){return new S(n,r)}make3(n,r,a){return new I(n,r,a)}make4(n,r,a,o){return new e(n,r,a,o)}},m={get:(e,t)=>{if(typeof t=="symbol"||!Number.isNaN(Number.parseInt(t)))return Reflect.get(e,t);let n=e,r=new Array(t.length),a=0;for(let o of t){switch(o){case"x":r[a]=n.x;break;case"y":r[a]=n.y;break;case"z":r[a]=n.z;break;case"w":r[a]=n.w;break;default:return Reflect.get(n,t)}a++}return t.length===4?new Proxy(n.make4(r[0],r[1],r[2],r[3]),m):t.length===3?new Proxy(n.make3(r[0],r[1],r[2]),m):t.length===2?new Proxy(n.make2(r[0],r[1]),m):Reflect.get(e,t)}},x= exports.P =g({unitType:_typedbinary.f32,byteAlignment:8,length:2,label:"vec2f",make:(e,t)=>new Proxy(new A(e,t),m),makeFromScalar:e=>new Proxy(new A(e,e),m)}),$= exports.Q =g({unitType:_typedbinary.i32,byteAlignment:8,length:2,label:"vec2i",make:(e,t)=>new Proxy(new D(e,t),m),makeFromScalar:e=>new Proxy(new D(e,e),m)}),N= exports.R =g({unitType:_typedbinary.u32,byteAlignment:8,length:2,label:"vec2u",make:(e,t)=>new Proxy(new S(e,t),m),makeFromScalar:e=>new Proxy(new S(e,e),m)}),C= exports.S =g({unitType:_typedbinary.f32,byteAlignment:16,length:3,label:"vec3f",make:(e,t,n)=>new Proxy(new k(e,t,n),m),makeFromScalar:e=>new Proxy(new k(e,e,e),m)}),Ae= exports.T =g({unitType:_typedbinary.i32,byteAlignment:16,length:3,label:"vec3i",make:(e,t,n)=>new Proxy(new V(e,t,n),m),makeFromScalar:e=>new Proxy(new V(e,e,e),m)}),De= exports.U =g({unitType:_typedbinary.u32,byteAlignment:16,length:3,label:"vec3u",make:(e,t,n)=>new Proxy(new I(e,t,n),m),makeFromScalar:e=>new Proxy(new I(e,e,e),m)}),T= exports.V =g({unitType:_typedbinary.f32,byteAlignment:16,length:4,label:"vec4f",make:(e,t,n,r)=>new Proxy(new P(e,t,n,r),m),makeFromScalar:e=>new Proxy(new P(e,e,e,e),m)}),j= exports.W =g({unitType:_typedbinary.i32,byteAlignment:16,length:4,label:"vec4i",make:(e,t,n,r)=>new Proxy(new _(e,t,n,r),m),makeFromScalar:e=>new Proxy(new _(e,e,e,e),m)}),W= exports.X =g({unitType:_typedbinary.u32,byteAlignment:16,length:4,label:"vec4u",make:(e,t,n,r)=>new Proxy(new R(e,t,n,r),m),makeFromScalar:e=>new Proxy(new R(e,e,e,e),m)});function Ie(e){let t={__unwrapped:void 0,isLoose:!1,label:e.label,byteAlignment:e.columnType.byteAlignment,size:B(e.columnType.size*e.columns,e.columnType.byteAlignment),resolveReferences(){throw new p},write(r,a){for(let o of a.columns)e.columnType.write(r,o)},read(r){let a=new Array(e.columns);for(let o=0;o<e.columns;++o)a[o]=e.columnType.read(r);return e.makeFromColumnVectors(...a)},measure(r,a=new _typedbinary.Measurer){return a.add(this.size)},seekProperty(){throw new Error("Method not implemented.")},resolve(){return e.label}};return Object.assign((...r)=>{let a=[];for(let o of r)typeof o=="number"?a.push(o):a.push(...o);for(let o=a.length;o<e.columns*e.rows;++o)a.push(0);return e.makeFromElements(...a)},t)}var Se=class{constructor(...t){s(this,"columns");s(this,"length",4);this.columns=[this.makeColumn(t[0],t[1]),this.makeColumn(t[2],t[3])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1])}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}},ne=class extends Se{makeColumn(t,n){return x(t,n)}},ke=class{constructor(...t){s(this,"columns");s(this,"length",12);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])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1]),yield*f(this.columns[2])}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){}},re=class extends ke{makeColumn(t,n,r){return C(t,n,r)}},Ve=class{constructor(...t){s(this,"columns");s(this,"length",16);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])]}*elements(){yield*f(this.columns[0]),yield*f(this.columns[1]),yield*f(this.columns[2]),yield*f(this.columns[3])}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}},ae=class extends Ve{makeColumn(t,n,r,a){return T(t,n,r,a)}},Gn= exports.Y =Ie({label:"mat2x2f",columnType:x,rows:2,columns:2,makeFromColumnVectors:(...e)=>new ne(...e[0],...e[1]),makeFromElements:(...e)=>new ne(...e)}),Kn= exports.Z =Ie({label:"mat3x3f",columnType:C,rows:3,columns:3,makeFromColumnVectors(...[e,t,n]){return new re(...e,...t,...n)},makeFromElements:(...e)=>new re(...e)}),Hn= exports._ =Ie({label:"mat4x4f",columnType:T,rows:4,columns:4,makeFromColumnVectors(...[e,t,n,r]){return new ae(...e,...t,...n,...r)},makeFromElements:(...e)=>new ae(...e)});var u=class extends _typedbinary.Schema{constructor(n,r){var o;super();this.size=n;this.kind=r;s(this,"underlyingType");s(this,"elementSize");s(this,"elementCount");s(this,"isSigned");s(this,"byteAlignment",1);s(this,"isLoose",!0);this.underlyingType=Dt[r],this.isSigned=(o=St[r])!=null?o:!1,this.elementCount=this.underlyingType.size/4;let a=n/this.elementCount;if(a!==1&&a!==2&&a!==4)throw new Error("Invalid element size");this.elementSize=a}write(n,r){if(typeof r=="number"){switch(this.underlyingType){case H:n.writeUint32(r);break;case J:n.writeFloat32(r);break;case q:n.writeInt32(r);break;default:throw new Error("Invalid underlying type")}return}zt(n,r,this.elementSize,this.isSigned)}read(n){let r=new ArrayBuffer(this.size),a=new DataView(r);for(let d=0;d<this.size;d++)a.setUint8(d,n.readByte());if(this.elementCount===1)switch(this.underlyingType){case H:return a.getUint32(0);case J:return a.getFloat32(0);case q:return a.getInt32(0);default:throw new Error("Invalid underlying type")}let o=this.underlyingType,i=Ge[o.label],y=new Array(this.elementCount),h=new (0, _typedbinary.BufferReader)(r);for(let d=0;d<this.elementCount;d++)y[d]=At(i,this.elementSize,h,this.isSigned);switch(o){case N:case x:case $:return o(y[0],y[1]);case De:case C:case Ae:return o(y[0],y[1],y[2]);case W:case T:case j:return o(y[0],y[1],y[2],y[3]);default:throw new Error("Invalid underlying type")}}measure(n,r=new _typedbinary.Measurer){return r.add(this.size)}},Ge={vec2u:"u32",vec3u:"u32",vec4u:"u32",vec2f:"f32",vec3f:"f32",vec4f:"f32",vec2i:"i32",vec3i:"i32",vec4i:"i32"};function zt(e,t,n,r){let a=Ge[t.kind];for(let o of t)vt(a,o,n,e,r)}function vt(e,t,n,r,a=!0){let o=new ArrayBuffer(n),i=new DataView(o),y=(c,U)=>{let se=a?U*127+128:U*255;i.setUint8(c,Math.floor(se))},h=(c,U)=>{let se=a?U*32767+32768:U*65535;i.setUint16(c,Math.floor(se))},b={u32:[i.setUint8,i.setUint16,i.setUint32],f32:[y,h,i.setFloat32],i32:[i.setInt8,i.setInt16,i.setInt32]}[e][Math.log2(n)];b&&b.call(i,0,t);for(let c=0;c<n;c++)r.writeByte(i.getUint8(c))}function At(e,t,n,r=!0){let a=new ArrayBuffer(t),o=new DataView(a);for(let b=0;b<t;b++)o.setUint8(b,n.readByte());let i=b=>{let c=o.getUint8(b);return r?(c-128)/127:c/255},y=b=>{let c=o.getUint16(b);return r?(c-32768)/32767:c/65535},d={u32:[o.getUint8,o.getUint16,o.getUint32],f32:[i,y,o.getFloat32],i32:[o.getInt8,o.getInt16,o.getInt32]}[e][Math.log2(t)];if(d)return d.call(o,0);throw new Error("Invalid primitive")}var Dt={uint8x2:N,uint8x4:W,sint8x2:$,sint8x4:j,unorm8x2:x,unorm8x4:T,snorm8x2:x,snorm8x4:T,uint16x2:N,uint16x4:W,sint16x2:$,sint16x4:j,unorm16x2:x,unorm16x4:T,snorm16x2:x,snorm16x4:T,float16x2:x,float16x4:T,float32:J,float32x2:x,float32x3:C,float32x4:T,uint32:H,uint32x2:N,uint32x3:De,uint32x4:W,sint32:q,sint32x2:$,sint32x3:Ae,sint32x4:j,unorm10_10_10_2:T},St={unorm8x2:!1,unorm8x4:!1,snorm8x2:!0,snorm8x4:!0,unorm16x2:!1,unorm16x4:!1,snorm16x2:!0,snorm16x4:!0,float16x2:!0,float16x4:!0,unorm10_10_10_2:!1},Zn= exports.$ =new u(2,"uint8x2"),er= exports.aa =new u(4,"uint8x4"),tr= exports.ba =new u(2,"sint8x2"),nr= exports.ca =new u(4,"sint8x4"),rr= exports.da =new u(2,"unorm8x2"),ar= exports.ea =new u(4,"unorm8x4"),or= exports.fa =new u(2,"snorm8x2"),sr= exports.ga =new u(4,"snorm8x4"),ur= exports.ha =new u(4,"uint16x2"),ir= exports.ia =new u(8,"uint16x4"),lr= exports.ja =new u(4,"sint16x2"),yr= exports.ka =new u(8,"sint16x4"),mr= exports.la =new u(4,"unorm16x2"),pr= exports.ma =new u(8,"unorm16x4"),cr= exports.na =new u(4,"snorm16x2"),Tr= exports.oa =new u(8,"snorm16x4"),dr= exports.pa =new u(4,"float16x2"),xr= exports.qa =new u(8,"float16x4"),br= exports.ra =new u(4,"float32"),fr= exports.sa =new u(8,"float32x2"),wr= exports.ta =new u(12,"float32x3"),gr= exports.ua =new u(16,"float32x4"),hr= exports.va =new u(4,"uint32"),zr= exports.wa =new u(8,"uint32x2"),vr= exports.xa =new u(12,"uint32x3"),Ar= exports.ya =new u(16,"uint32x4"),Dr= exports.za =new u(4,"sint32"),Sr= exports.Aa =new u(8,"sint32x2"),kr= exports.Ba =new u(12,"sint32x3"),Vr= exports.Ca =new u(16,"sint32x4"),Ir= exports.Da =new u(4,"unorm10_10_10_2");function kt(e){return{scope:"function",pointsTo:e}}function Pt(e){return new oe(e)}function _t(e){return e instanceof oe}var oe=class extends _typedbinary.Schema{constructor(n){super();this.innerData=n;s(this,"size");s(this,"byteAlignment");s(this,"isLoose",!1);this.size=this.innerData.size,this.byteAlignment=this.innerData.byteAlignment}resolveReferences(){throw new p}write(n,r){this.innerData.write(n,r)}read(n){return this.innerData.read(n)}measure(n,r=new _typedbinary.Measurer){return this.innerData.measure(n,r)}resolve(n){return`atomic<${n.resolve(this.innerData)}>`}};exports.a = Rt; exports.b = Ct; exports.c = Ut; exports.d = s; exports.e = $t; exports.f = z; exports.g = Re; exports.h = Ce; exports.i = p; exports.j = Ue; exports.k = K; exports.l = Kt; exports.m = H; exports.n = q; exports.o = J; exports.p = pe; exports.q = Xt; exports.r = Yt; exports.s = Me; exports.t = en; exports.u = ce; exports.v = tn; exports.w = nn; exports.x = rn; exports.y = an; exports.z = on; exports.A = sn; exports.B = xe; exports.C = st; exports.D = ut; exports.E = it; exports.F = fe; exports.G = we; exports.H = lt; exports.I = yt; exports.J = ge; exports.K = mt; exports.L = pt; exports.M = ct; exports.N = Tt; exports.O = dt; exports.P = x; exports.Q = $; exports.R = N; exports.S = C; exports.T = Ae; exports.U = De; exports.V = T; exports.W = j; exports.X = W; exports.Y = Gn; exports.Z = Kn; exports._ = Hn; exports.$ = Zn; exports.aa = er; exports.ba = tr; exports.ca = nr; exports.da = rr; exports.ea = ar; exports.fa = or; exports.ga = sr; exports.ha = ur; exports.ia = ir; exports.ja = lr; exports.ka = yr; exports.la = mr; exports.ma = pr; exports.na = cr; exports.oa = Tr; exports.pa = dr; exports.qa = xr; exports.ra = br; exports.sa = fr; exports.ta = wr; exports.ua = gr; exports.va = hr; exports.wa = zr; exports.xa = vr; exports.ya = Ar; exports.za = Dr; exports.Aa = Sr; exports.Ba = kr; exports.Ca = Vr; exports.Da = Ir; exports.Ea = kt; exports.Fa = Pt; exports.Ga = _t;
8
+ //# sourceMappingURL=chunk-SBJR5ZQJ.cjs.map