typegpu 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
package/index.d.ts CHANGED
@@ -1,40 +1,20 @@
1
1
  import { Parsed } from 'typed-binary';
2
- import { A as AnyTgpuData, T as TgpuAllocatable, a as TgpuNamable, b as TgpuPlum, v as vecBase, c as vec3f, d as vec3i, e as vec3u } from './vector-D5Vx-xhb.js';
3
- export { f as TgpuData } from './vector-D5Vx-xhb.js';
2
+ import { A as AnyTgpuData, T as TgpuPlum, a as TgpuBuffer, v as vecBase, b as vec3f, c as vec3i, d as vec3u, U as Uniform, S as Storage, V as Vertex } from './tgpuBuffer-BVk2wCHR.js';
3
+ export { e as TgpuData, i as isUsableAsStorage, f as isUsableAsUniform, g as isUsableAsVertex } from './tgpuBuffer-BVk2wCHR.js';
4
4
 
5
- interface Unmanaged {
6
- readonly device: GPUDevice;
7
- readonly buffer: GPUBuffer;
8
- }
9
- interface Uniform {
10
- usableAsUniform: true;
11
- }
12
- declare const Uniform: Uniform;
13
- interface Storage {
14
- usableAsStorage: true;
15
- }
16
- declare const Storage: Storage;
17
- interface Vertex {
18
- usableAsVertex: true;
19
- }
20
- declare const Vertex: Vertex;
21
- type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
22
- interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuAllocatable<TData>, TgpuNamable {
23
- readonly destroyed: boolean;
24
- readonly label: string | undefined;
25
- $usage<T extends (Uniform | Storage | Vertex)[]>(...usages: T): this & UnionToIntersection<T[number]>;
26
- $addFlags(flags: GPUBufferUsageFlags): this;
27
- $device(device: GPUDevice): this & Unmanaged;
28
- destroy(): void;
29
- }
5
+ /**
6
+ * @param typeSchema The type of data that this buffer will hold.
7
+ * @param initial The initial value of the buffer. (optional)
8
+ */
30
9
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
10
+ /**
11
+ * @param typeSchema The type of data that this buffer will hold.
12
+ * @param gpuBuffer A vanilla WebGPU buffer.
13
+ */
31
14
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
32
- declare function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Uniform;
33
- declare function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Storage;
34
- declare function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Vertex;
35
15
 
36
- declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged, data: Parsed<TData>): void;
37
- declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged): Promise<Parsed<TData>>;
16
+ declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData>, data: Parsed<TData>): void;
17
+ declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData>): Promise<Parsed<TData>>;
38
18
 
39
19
  /**
40
20
  * @category Errors
@@ -44,16 +24,16 @@ declare class RecursiveDataTypeError extends Error {
44
24
  }
45
25
 
46
26
  declare const std: {
47
- add: <T extends vecBase>(lhs: T, rhs: T) => T;
48
- sub: <T extends vecBase>(lhs: T, rhs: T) => T;
27
+ add<T extends vecBase>(lhs: T, rhs: T): T;
28
+ sub<T extends vecBase>(lhs: T, rhs: T): T;
49
29
  mul: <T extends vecBase>(s: number, v: T) => T;
50
- dot: <T extends vecBase>(lhs: T, rhs: T) => number;
30
+ dot<T extends vecBase>(lhs: T, rhs: T): number;
51
31
  normalize: <T extends vecBase>(v: T) => T;
52
- cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T;
53
- fract: (a: number) => number;
54
- length: <T extends vecBase>(vector: T) => number;
55
- sin: (x: number) => number;
56
- cos: (x: number) => number;
32
+ cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T;
33
+ fract(a: number): number;
34
+ length<T extends vecBase>(vector: T): number;
35
+ sin(radians: number): number;
36
+ cos(radians: number): number;
57
37
  };
58
38
 
59
39
  /**
@@ -69,4 +49,4 @@ declare const tgpu: {
69
49
  write: typeof write;
70
50
  };
71
51
 
72
- export { AnyTgpuData, RecursiveDataTypeError, type TgpuBuffer, type Unmanaged, tgpu as default, isUsableAsStorage, isUsableAsUniform, isUsableAsVertex, std, tgpu };
52
+ export { AnyTgpuData, RecursiveDataTypeError, TgpuBuffer, tgpu as default, std, tgpu };
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a,d as h,e as G,g as y,h as p,i as T,j as u,k as i,l as s,m as g,n as m,o as l}from"./chunk-3I5VAGHS.js";import{BufferWriter as R}from"typed-binary";var U={usableAsUniform:!0},B={usableAsStorage:!0},D={usableAsVertex:!0};function V(e,t){return new w(e,t)}function M(e){return!!e.usableAsUniform}function E(e){return!!e.usableAsStorage}function k(e){return!!e.usableAsVertex}var w=class{constructor(t,r){this.dataType=t;this.initialOrBuffer=r;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"_device",null);a(this,"_buffer",null);a(this,"_destroyed",!1);a(this,"_label");a(this,"initial");a(this,"usableAsUniform",!1);a(this,"usableAsStorage",!1);a(this,"usableAsVertex",!1);h(r)?this._buffer=r:this.initial=r}get label(){return this._label}get buffer(){if(!this._device)throw new Error("To use this property, make the buffer unmanaged by passing a GPUDevice to $device");if(this._destroyed)throw new Error("This buffer has been destroyed");if(!this._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new R(this._buffer.getMappedRange());this.dataType.write(t,this.initial),this._buffer.unmap()}return this._buffer}get device(){if(!this._device)throw new Error("This buffer has not been assigned a device. Use .$device(device) to assign a device");return this._device}get destroyed(){return this._destroyed}$name(t){return this._label=t,this}$usage(...t){for(let r of t)this.flags|=r===U?GPUBufferUsage.UNIFORM:0,this.flags|=r===B?GPUBufferUsage.STORAGE:0,this.flags|=r===D?GPUBufferUsage.VERTEX:0,this.usableAsUniform=this.usableAsUniform||r===U,this.usableAsStorage=this.usableAsStorage||r===B,this.usableAsVertex=this.usableAsVertex||r===D;return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}destroy(){var t;this._destroyed||(this._destroyed=!0,(t=this._buffer)==null||t.destroy())}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};import{BufferReader as P,BufferWriter as b}from"typed-binary";function _(e,t){let r=e.buffer,c=e.device;if(r.mapState==="mapped"){let x=r.getMappedRange();e.dataType.write(new b(x),t);return}let v=e.dataType.size,z=new ArrayBuffer(v);e.dataType.write(new b(z),t),c.queue.writeBuffer(r,0,z,0,v)}async function S(e){let t=e.buffer,r=e.device;if(t.mapState==="mapped"){let x=t.getMappedRange();return e.dataType.read(new P(x))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let x=t.getMappedRange(),A=e.dataType.read(new P(x));return t.unmap(),A}let c=r.createBuffer({size:e.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=r.createCommandEncoder();v.copyBufferToBuffer(t,0,c,0,e.dataType.size),r.queue.submit([v.finish()]),await r.queue.onSubmittedWorkDone(),await c.mapAsync(GPUMapMode.READ,0,e.dataType.size);let z=e.dataType.read(new P(c.getMappedRange()));return c.unmap(),c.destroy(),z}var f=e=>Math.sqrt(e.x**2+e.y**2),o=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),d=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),n={length:{vec2f:f,vec2i:f,vec2u:f,vec3f:o,vec3i:o,vec3u:o,vec4f:d,vec4i:d,vec4u:d},add:{vec2f:(e,t)=>y(e.x+t.x,e.y+t.y),vec2i:(e,t)=>p(e.x+t.x,e.y+t.y),vec2u:(e,t)=>T(e.x+t.x,e.y+t.y),vec3f:(e,t)=>u(e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>i(e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>s(e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>g(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>m(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>l(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>y(e.x-t.x,e.y-t.y),vec2i:(e,t)=>p(e.x-t.x,e.y-t.y),vec2u:(e,t)=>T(e.x-t.x,e.y-t.y),vec3f:(e,t)=>u(e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>i(e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>s(e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>g(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>m(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>l(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>y(e*t.x,e*t.y),vec2i:(e,t)=>p(e*t.x,e*t.y),vec2u:(e,t)=>T(e*t.x,e*t.y),vec3f:(e,t)=>u(e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>i(e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>s(e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>g(e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>m(e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>l(e*t.x,e*t.y,e*t.z,e*t.w)},dot:{vec2f:(e,t)=>e.x*t.x+e.y*t.y,vec2i:(e,t)=>e.x*t.x+e.y*t.y,vec2u:(e,t)=>e.x*t.x+e.y*t.y,vec3f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec4f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},normalize:{vec2f:e=>{let t=f(e);return y(e.x/t,e.y/t)},vec2i:e=>{let t=f(e);return p(e.x/t,e.y/t)},vec2u:e=>{let t=f(e);return T(e.x/t,e.y/t)},vec3f:e=>{let t=o(e);return u(e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=o(e);return i(e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=o(e);return s(e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=d(e);return g(e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=d(e);return m(e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=d(e);return l(e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>u(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3i:(e,t)=>i(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3u:(e,t)=>s(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}};var $={add:(e,t)=>n.add[e.kind](e,t),sub:(e,t)=>n.sub[e.kind](e,t),mul:(e,t)=>n.mul[t.kind](e,t),dot:(e,t)=>n.dot[e.kind](e,t),normalize:e=>n.normalize[e.kind](e),cross:(e,t)=>n.cross[e.kind](e,t),fract:e=>e-Math.floor(e),length:e=>n.length[e.kind](e),sin:Math.sin,cos:Math.cos};var K={Uniform:U,Storage:B,Vertex:D,createBuffer:V,read:S,write:_},L=K;export{G as RecursiveDataTypeError,L as default,E as isUsableAsStorage,M as isUsableAsUniform,k as isUsableAsVertex,$ as std,K as tgpu};
1
+ import{a as n,f as _,g as $,h as x,i as v,j as l,k as o,l as p,m as d,n as g,o as P,p as w}from"./chunk-2FWG5LPQ.js";import{BufferReader as B,BufferWriter as U}from"typed-binary";var N=Symbol("This plum's value is sourced from outside the runtime.");function V(e){return e.__brand==="TgpuPlum"}var b={usableAsUniform:!0},D={usableAsStorage:!0},z={usableAsVertex:!0};function k(e,t,r){return new h(e,t,r)}function G(e){return e.resourceType==="buffer"}function M(e){return!!e.usableAsUniform}function C(e){return!!e.usableAsStorage}function I(e){return!!e.usableAsVertex}var h=class{constructor(t,r,u){this._group=t;this.dataType=r;this.initialOrBuffer=u;n(this,"resourceType","buffer");n(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);n(this,"_device",null);n(this,"_buffer",null);n(this,"_destroyed",!1);n(this,"_subscription",null);n(this,"_label");n(this,"initial");n(this,"usableAsUniform",!1);n(this,"usableAsStorage",!1);n(this,"usableAsVertex",!1);_(u)?this._buffer=u:this.initial=u}get label(){return this._label}get buffer(){if(!this._device)throw new Error("Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.");if(this._destroyed)throw new Error("This buffer has been destroyed");if(!this._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new U(this._buffer.getMappedRange());if(V(this.initial)){let r=this._group;if(!r)throw new Error("Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.");let u=this.initial;this.dataType.write(t,r.readPlum(u)),this._subscription=r.onPlumChange(u,()=>{this.write(r.readPlum(u))})}else this.dataType.write(t,this.initial);this._buffer.unmap()}return this._buffer}get device(){if(!this._device)throw new Error("This buffer has not been assigned a device. Use .$device(device) to assign a device");return this._device}get destroyed(){return this._destroyed}$name(t){return this._label=t,this}$usage(...t){for(let r of t)this.flags|=r===b?GPUBufferUsage.UNIFORM:0,this.flags|=r===D?GPUBufferUsage.STORAGE:0,this.flags|=r===z?GPUBufferUsage.VERTEX:0,this.usableAsUniform=this.usableAsUniform||r===b,this.usableAsStorage=this.usableAsStorage||r===D,this.usableAsVertex=this.usableAsVertex||r===z;return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}write(t){let r=this.buffer,u=this.device;if(r.mapState==="mapped"){let i=r.getMappedRange();if(G(t))throw new Error("Cannot copy to a mapped buffer.");this.dataType.write(new U(i),t);return}let c=this.dataType.size;if(G(t)){let i=t.buffer;if(this._group)this._group.commandEncoder.copyBufferToBuffer(i,0,r,0,c);else{let f=u.createCommandEncoder();f.copyBufferToBuffer(i,0,r,0,c),u.queue.submit([f.finish()])}}else{this._group&&this._group.flush();let i=new ArrayBuffer(c);this.dataType.write(new U(i),t),u.queue.writeBuffer(r,0,i,0,c)}}async read(){this._group&&this._group.flush();let t=this.buffer,r=this.device;if(t.mapState==="mapped"){let f=t.getMappedRange();return this.dataType.read(new B(f))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let f=t.getMappedRange(),A=this.dataType.read(new B(f));return t.unmap(),A}let u=r.createBuffer({size:this.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=r.createCommandEncoder();c.copyBufferToBuffer(t,0,u,0,this.dataType.size),r.queue.submit([c.finish()]),await r.queue.onSubmittedWorkDone(),await u.mapAsync(GPUMapMode.READ,0,this.dataType.size);let i=this.dataType.read(new B(u.getMappedRange()));return u.unmap(),u.destroy(),i}destroy(){var t;this._destroyed||(this._destroyed=!0,this._subscription&&this._subscription(),(t=this._buffer)==null||t.destroy())}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};function S(e,t){return k(void 0,e,t)}function E(e,t){e.write(t)}async function R(e){return e.read()}var T=e=>Math.sqrt(e.x**2+e.y**2),y=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),m=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),s={length:{vec2f:T,vec2i:T,vec2u:T,vec3f:y,vec3i:y,vec3u:y,vec4f:m,vec4i:m,vec4u:m},add:{vec2f:(e,t)=>x(e.x+t.x,e.y+t.y),vec2i:(e,t)=>v(e.x+t.x,e.y+t.y),vec2u:(e,t)=>l(e.x+t.x,e.y+t.y),vec3f:(e,t)=>o(e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>p(e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>d(e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>g(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>P(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>w(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>x(e.x-t.x,e.y-t.y),vec2i:(e,t)=>v(e.x-t.x,e.y-t.y),vec2u:(e,t)=>l(e.x-t.x,e.y-t.y),vec3f:(e,t)=>o(e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>p(e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>d(e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>g(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>P(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>w(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>x(e*t.x,e*t.y),vec2i:(e,t)=>v(e*t.x,e*t.y),vec2u:(e,t)=>l(e*t.x,e*t.y),vec3f:(e,t)=>o(e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>p(e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>d(e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>g(e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>P(e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>w(e*t.x,e*t.y,e*t.z,e*t.w)},dot:{vec2f:(e,t)=>e.x*t.x+e.y*t.y,vec2i:(e,t)=>e.x*t.x+e.y*t.y,vec2u:(e,t)=>e.x*t.x+e.y*t.y,vec3f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec4f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},normalize:{vec2f:e=>{let t=T(e);return x(e.x/t,e.y/t)},vec2i:e=>{let t=T(e);return v(e.x/t,e.y/t)},vec2u:e=>{let t=T(e);return l(e.x/t,e.y/t)},vec3f:e=>{let t=y(e);return o(e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=y(e);return p(e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=y(e);return d(e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=m(e);return g(e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=m(e);return P(e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=m(e);return w(e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>o(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3i:(e,t)=>p(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3u:(e,t)=>d(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}};var q=0;var a=()=>q>0;var K={add(e,t){return a()?`(${e} + ${t})`:s.add[e.kind](e,t)},sub(e,t){return a()?`(${e} - ${t})`:s.sub[e.kind](e,t)},mul:(e,t)=>a()?`(${e} * ${t})`:s.mul[t.kind](e,t),dot(e,t){return a()?`dot(${e}, ${t})`:s.dot[e.kind](e,t)},normalize:e=>a()?`normalize(${e})`:s.normalize[e.kind](e),cross(e,t){return a()?`cross(${e}, ${t})`:s.cross[e.kind](e,t)},fract(e){return a()?`fract(${e})`:e-Math.floor(e)},length(e){return a()?`length(${e})`:s.length[e.kind](e)},sin(e){return a()?`sin(${e})`:Math.sin(e)},cos(e){return a()?`cos(${e})`:Math.cos(e)}};var F={Uniform:b,Storage:D,Vertex:z,createBuffer:S,read:R,write:E},ce=F;export{$ as RecursiveDataTypeError,ce as default,C as isUsableAsStorage,M as isUsableAsUniform,I as isUsableAsVertex,K as std,F as tgpu};
2
2
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tgpuBuffer.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/std.ts","../src/index.ts"],"sourcesContent":["import { BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from './namable';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport { type AnyTgpuData, type TgpuAllocatable, isGPUBuffer } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Unmanaged {\n readonly device: GPUDevice;\n readonly buffer: GPUBuffer;\n}\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData>\n extends TgpuAllocatable<TData>,\n TgpuNamable {\n readonly destroyed: boolean;\n readonly label: string | undefined;\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this & Unmanaged;\n\n destroy(): void;\n}\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(typeSchema, initialOrBuffer);\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'To use this property, make the buffer unmanaged by passing a GPUDevice to $device',\n );\n }\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n this.dataType.write(writer, this.initial);\n this._buffer.unmap();\n }\n }\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]> {\n for (const usage of usages) {\n this.flags |= usage === Uniform ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === Storage ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === Vertex ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === Uniform;\n this.usableAsStorage = this.usableAsStorage || usage === Storage;\n this.usableAsVertex = this.usableAsVertex || usage === Vertex;\n }\n return this as this & UnionToIntersection<T[number]>;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuBuffer, Unmanaged } from './tgpuBuffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n data: Parsed<TData>,\n): void {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n buffer.dataType.write(new BufferWriter(mapped), data);\n return;\n }\n\n const size = buffer.dataType.size;\n const hostBuffer = new ArrayBuffer(size);\n buffer.dataType.write(new BufferWriter(hostBuffer), data);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData> & Unmanaged,\n): Promise<Parsed<TData>> {\n const gpuBuffer = buffer.buffer;\n const device = buffer.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = buffer.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: buffer.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n buffer.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, buffer.dataType.size);\n\n const res = buffer.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n}\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\n","import type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\n\nexport const std = {\n add: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.add[lhs.kind](lhs, rhs),\n sub: <T extends vecBase>(lhs: T, rhs: T): T =>\n VectorOps.sub[lhs.kind](lhs, rhs),\n mul: <T extends vecBase>(s: number, v: T): T => VectorOps.mul[v.kind](s, v),\n dot: <T extends vecBase>(lhs: T, rhs: T): number =>\n VectorOps.dot[lhs.kind](lhs, rhs),\n normalize: <T extends vecBase>(v: T): T => VectorOps.normalize[v.kind](v),\n cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T): T =>\n VectorOps.cross[a.kind](a, b),\n fract: (a: number): number => a - Math.floor(a),\n length: <T extends vecBase>(vector: T): number =>\n VectorOps.length[vector.kind](vector),\n sin: Math.sin,\n cos: Math.cos,\n};\n","/**\n * @module typegpu\n */\n\nimport { Storage, Uniform, Vertex, createBuffer } from './tgpuBuffer';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n Uniform,\n Storage,\n Vertex,\n\n createBuffer,\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './tgpuBuffer';\n\nexport type {\n TgpuBuffer,\n Unmanaged,\n} from './tgpuBuffer';\n"],"mappings":"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","names":["BufferWriter","Uniform","Storage","Vertex","createBuffer","typeSchema","initialOrBuffer","TgpuBufferImpl","isUsableAsUniform","buffer","isUsableAsStorage","isUsableAsVertex","dataType","__publicField","isGPUBuffer","writer","BufferWriter","label","usages","usage","flags","device","_a","BufferReader","BufferWriter","write","buffer","data","gpuBuffer","device","mapped","size","hostBuffer","read","res","stagingBuffer","commandEncoder","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","std","lhs","rhs","VectorOps","s","v","a","b","vector","tgpu","Uniform","Storage","Vertex","createBuffer","read","write","src_default"]}
1
+ {"version":3,"sources":["../src/tgpuBuffer.ts","../src/tgpuPlumTypes.ts","../src/legacyBufferApi.ts","../src/tgpuBufferUtils.ts","../src/data/vectorOps.ts","../src/gpuMode.ts","../src/std.ts","../src/index.ts"],"sourcesContent":["import { BufferReader, BufferWriter, type Parsed } from 'typed-binary';\nimport type { TgpuNamable } from './namable';\nimport { type TgpuPlum, type Unsubscribe, isPlum } from './tgpuPlumTypes';\nimport type { TgpuRuntime } from './tgpuRuntime';\nimport { type AnyTgpuData, isGPUBuffer } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface Uniform {\n usableAsUniform: true;\n}\n\nexport interface Storage {\n usableAsStorage: true;\n}\n\nexport interface Vertex {\n usableAsVertex: true;\n}\n\nexport const Uniform = { usableAsUniform: true } as Uniform;\nexport const Storage = { usableAsStorage: true } as Storage;\nexport const Vertex = { usableAsVertex: true } as Vertex;\n\ntype UnionToIntersection<U> =\n // biome-ignore lint/suspicious/noExplicitAny: <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\nexport interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {\n readonly resourceType: 'buffer';\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n readonly label: string | undefined;\n\n readonly buffer: GPUBuffer;\n readonly device: GPUDevice;\n readonly destroyed: boolean;\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]>;\n $addFlags(flags: GPUBufferUsageFlags): this;\n $device(device: GPUDevice): this;\n\n write(data: Parsed<TData> | TgpuBuffer<TData>): void;\n read(): Promise<Parsed<TData>>;\n destroy(): void;\n}\n\nexport function createBufferImpl<TData extends AnyTgpuData>(\n group: TgpuRuntime | undefined,\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);\n}\n\nexport function isBuffer<T extends TgpuBuffer<AnyTgpuData>>(\n value: T | unknown,\n): value is T {\n return (value as TgpuBuffer<AnyTgpuData>).resourceType === 'buffer';\n}\n\nexport function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Uniform {\n return !!(buffer as unknown as Uniform).usableAsUniform;\n}\n\nexport function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Storage {\n return !!(buffer as unknown as Storage).usableAsStorage;\n}\n\nexport function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(\n buffer: T,\n): buffer is T & Vertex {\n return !!(buffer as unknown as Vertex).usableAsVertex;\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass TgpuBufferImpl<TData extends AnyTgpuData> implements TgpuBuffer<TData> {\n public readonly resourceType = 'buffer';\n public flags: GPUBufferUsageFlags =\n GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n private _device: GPUDevice | null = null;\n private _buffer: GPUBuffer | null = null;\n private _destroyed = false;\n private _subscription: Unsubscribe | null = null;\n\n private _label: string | undefined;\n readonly initial: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;\n\n public usableAsUniform = false;\n public usableAsStorage = false;\n public usableAsVertex = false;\n\n constructor(\n private readonly _group: TgpuRuntime | undefined,\n public readonly dataType: TData,\n public readonly initialOrBuffer?:\n | Parsed<TData>\n | TgpuPlum<Parsed<TData>>\n | GPUBuffer\n | undefined,\n ) {\n if (isGPUBuffer(initialOrBuffer)) {\n this._buffer = initialOrBuffer;\n } else {\n this.initial = initialOrBuffer;\n }\n }\n\n get label() {\n return this._label;\n }\n\n get buffer() {\n if (!this._device) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n if (this._destroyed) {\n throw new Error('This buffer has been destroyed');\n }\n\n if (!this._buffer) {\n this._buffer = this._device.createBuffer({\n size: this.dataType.size,\n usage: this.flags,\n mappedAtCreation: !!this.initial,\n });\n\n if (this.initial) {\n const writer = new BufferWriter(this._buffer.getMappedRange());\n\n if (isPlum(this.initial)) {\n const group = this._group;\n\n if (!group) {\n throw new Error(\n 'Create this buffer using `root.createBuffer` instead of `tgpu.createBuffer`.',\n );\n }\n\n const plum = this.initial;\n\n this.dataType.write(writer, group.readPlum(plum));\n\n this._subscription = group.onPlumChange(plum, () => {\n this.write(group.readPlum(plum));\n });\n } else {\n this.dataType.write(writer, this.initial);\n }\n\n this._buffer.unmap();\n }\n }\n\n return this._buffer;\n }\n\n get device() {\n if (!this._device) {\n throw new Error(\n 'This buffer has not been assigned a device. Use .$device(device) to assign a device',\n );\n }\n return this._device;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n\n $name(label: string) {\n this._label = label;\n return this;\n }\n\n $usage<T extends (Uniform | Storage | Vertex)[]>(\n ...usages: T\n ): this & UnionToIntersection<T[number]> {\n for (const usage of usages) {\n this.flags |= usage === Uniform ? GPUBufferUsage.UNIFORM : 0;\n this.flags |= usage === Storage ? GPUBufferUsage.STORAGE : 0;\n this.flags |= usage === Vertex ? GPUBufferUsage.VERTEX : 0;\n this.usableAsUniform = this.usableAsUniform || usage === Uniform;\n this.usableAsStorage = this.usableAsStorage || usage === Storage;\n this.usableAsVertex = this.usableAsVertex || usage === Vertex;\n }\n return this as this & UnionToIntersection<T[number]>;\n }\n\n // Temporary solution\n $addFlags(flags: GPUBufferUsageFlags) {\n this.flags |= flags;\n return this;\n }\n\n $device(device: GPUDevice) {\n this._device = device;\n return this;\n }\n\n write(dataOrBuffer: Parsed<TData> | TgpuBuffer<TData>): void {\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n if (isBuffer(dataOrBuffer)) {\n throw new Error('Cannot copy to a mapped buffer.');\n }\n this.dataType.write(new BufferWriter(mapped), dataOrBuffer);\n return;\n }\n\n const size = this.dataType.size;\n if (isBuffer(dataOrBuffer)) {\n const sourceBuffer = dataOrBuffer.buffer;\n\n if (this._group) {\n const encoder = this._group.commandEncoder;\n encoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n } else {\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(sourceBuffer, 0, gpuBuffer, 0, size);\n device.queue.submit([commandEncoder.finish()]);\n }\n } else {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const hostBuffer = new ArrayBuffer(size);\n this.dataType.write(new BufferWriter(hostBuffer), dataOrBuffer);\n device.queue.writeBuffer(gpuBuffer, 0, hostBuffer, 0, size);\n }\n }\n\n async read(): Promise<Parsed<TData>> {\n if (this._group) {\n // Flushing any commands yet to be encoded.\n this._group.flush();\n }\n\n const gpuBuffer = this.buffer;\n const device = this.device;\n\n if (gpuBuffer.mapState === 'mapped') {\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n return res;\n }\n\n if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {\n await gpuBuffer.mapAsync(GPUMapMode.READ);\n const mapped = gpuBuffer.getMappedRange();\n const res = this.dataType.read(new BufferReader(mapped)) as Parsed<TData>;\n gpuBuffer.unmap();\n return res;\n }\n\n const stagingBuffer = device.createBuffer({\n size: this.dataType.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n });\n\n const commandEncoder = device.createCommandEncoder();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer,\n 0,\n stagingBuffer,\n 0,\n this.dataType.size,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n await device.queue.onSubmittedWorkDone();\n await stagingBuffer.mapAsync(GPUMapMode.READ, 0, this.dataType.size);\n\n const res = this.dataType.read(\n new BufferReader(stagingBuffer.getMappedRange()),\n ) as Parsed<TData>;\n\n stagingBuffer.unmap();\n stagingBuffer.destroy();\n\n return res;\n }\n\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n if (this._subscription) {\n this._subscription();\n }\n this._buffer?.destroy();\n }\n\n toString(): string {\n return `buffer:${this._label ?? '<unnamed>'}`;\n }\n}\n","import type { TgpuNamable } from './namable';\n\nexport type Getter = <T>(plum: TgpuPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends TgpuPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface TgpuPlum<TValue = unknown> extends TgpuNamable {\n readonly __brand: 'TgpuPlum';\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const TgpuExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\n\nexport interface TgpuExternalPlum {\n readonly [TgpuExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | TgpuExternalPlum,\n): value is TgpuExternalPlum {\n return (value as TgpuExternalPlum)[TgpuExternalPlumTrait] === true;\n}\n\nexport function isPlum<T>(value: TgpuPlum<T> | unknown): value is TgpuPlum<T> {\n return (value as TgpuPlum).__brand === 'TgpuPlum';\n}\n","import type { Parsed } from 'typed-binary';\nimport { type TgpuBuffer, createBufferImpl } from './tgpuBuffer';\nimport type { TgpuPlum } from './tgpuPlumTypes';\nimport type { AnyTgpuData } from './types';\n\n// * -deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`.\n\n/**\n * @param typeSchema The type of data that this buffer will hold.\n * @param initial The initial value of the buffer. (optional)\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined,\n): TgpuBuffer<TData>;\n\n/**\n * @param typeSchema The type of data that this buffer will hold.\n * @param gpuBuffer A vanilla WebGPU buffer.\n */\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n gpuBuffer: GPUBuffer,\n): TgpuBuffer<TData>;\n\nexport function createBuffer<TData extends AnyTgpuData>(\n typeSchema: TData,\n initialOrBuffer?: Parsed<TData> | TgpuPlum<Parsed<TData>> | GPUBuffer,\n): TgpuBuffer<TData> {\n return createBufferImpl(undefined, typeSchema, initialOrBuffer);\n}\n","import type { Parsed } from 'typed-binary';\nimport type { TgpuBuffer } from './tgpuBuffer';\nimport type { AnyTgpuData } from './types';\n\nexport function write<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n data: Parsed<TData>,\n): void {\n buffer.write(data);\n}\n\nexport async function read<TData extends AnyTgpuData>(\n buffer: TgpuBuffer<TData>,\n): Promise<Parsed<TData>> {\n return buffer.read();\n}\n","import {\n type VecKind,\n vec2f,\n vec2i,\n vec2u,\n vec3f,\n vec3i,\n vec3u,\n vec4f,\n vec4i,\n vec4u,\n type vecBase,\n} from './vector';\n\nconst lengthVec2 = (v: vec2f | vec2i | vec2u) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: vec3f | vec3i | vec3u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: vec4f | vec4i | vec4u) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nexport const VectorOps = {\n length: {\n vec2f: lengthVec2,\n vec2i: lengthVec2,\n vec2u: lengthVec2,\n vec3f: lengthVec3,\n vec3i: lengthVec3,\n vec3u: lengthVec3,\n vec4f: lengthVec4,\n vec4i: lengthVec4,\n vec4u: lengthVec4,\n } as Record<VecKind, (v: vecBase) => number>,\n\n add: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x + b.x, a.y + b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x + b.x, a.y + b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x + b.x, a.y + b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x + b.x, a.y + b.y, a.z + b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x + b.x, a.y + b.y, a.z + b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n sub: {\n vec2f: (a: vec2f, b: vec2f) => vec2f(a.x - b.x, a.y - b.y),\n vec2i: (a: vec2i, b: vec2i) => vec2i(a.x - b.x, a.y - b.y),\n vec2u: (a: vec2u, b: vec2u) => vec2u(a.x - b.x, a.y - b.y),\n\n vec3f: (a: vec3f, b: vec3f) => vec3f(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3i: (a: vec3i, b: vec3i) => vec3i(a.x - b.x, a.y - b.y, a.z - b.z),\n vec3u: (a: vec3u, b: vec3u) => vec3u(a.x - b.x, a.y - b.y, a.z - b.z),\n\n vec4f: (a: vec4f, b: vec4f) =>\n vec4f(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4i: (a: vec4i, b: vec4i) =>\n vec4i(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n vec4u: (a: vec4u, b: vec4u) =>\n vec4u(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w),\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => T>,\n\n mul: {\n vec2f: (s: number, v: vec2f) => vec2f(s * v.x, s * v.y),\n vec2i: (s: number, v: vec2i) => vec2i(s * v.x, s * v.y),\n vec2u: (s: number, v: vec2u) => vec2u(s * v.x, s * v.y),\n\n vec3f: (s: number, v: vec3f) => vec3f(s * v.x, s * v.y, s * v.z),\n vec3i: (s: number, v: vec3i) => vec3i(s * v.x, s * v.y, s * v.z),\n vec3u: (s: number, v: vec3u) => vec3u(s * v.x, s * v.y, s * v.z),\n\n vec4f: (s: number, v: vec4f) => vec4f(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4i: (s: number, v: vec4i) => vec4i(s * v.x, s * v.y, s * v.z, s * v.w),\n vec4u: (s: number, v: vec4u) => vec4u(s * v.x, s * v.y, s * v.z, s * v.w),\n } as Record<VecKind, <T extends vecBase>(s: number, v: T) => T>,\n\n dot: {\n vec2f: (lhs: vec2f, rhs: vec2f) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2i: (lhs: vec2i, rhs: vec2i) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec2u: (lhs: vec2u, rhs: vec2u) => lhs.x * rhs.x + lhs.y * rhs.y,\n vec3f: (lhs: vec3f, rhs: vec3f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3i: (lhs: vec3i, rhs: vec3i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec3u: (lhs: vec3u, rhs: vec3u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z,\n vec4f: (lhs: vec4f, rhs: vec4f) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4i: (lhs: vec4i, rhs: vec4i) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n vec4u: (lhs: vec4u, rhs: vec4u) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w,\n } as Record<VecKind, <T extends vecBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: vec2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2i: (v: vec2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: vec2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: vec3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: vec3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: vec3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: vec4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: vec4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: vec4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vecBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: vec3f, b: vec3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3i: (a: vec3i, b: vec3i) => {\n return vec3i(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3u: (a: vec3u, b: vec3u) => {\n return vec3u(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3i' | 'vec3u',\n <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T\n >,\n};\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 type { vec3f, vec3i, vec3u, vecBase } from './data';\nimport { VectorOps } from './data/vectorOps';\nimport { inGPUMode } from './gpuMode';\n\nexport const std = {\n add<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} + ${rhs})` as unknown as T;\n }\n return VectorOps.add[lhs.kind](lhs, rhs);\n },\n sub<T extends vecBase>(lhs: T, rhs: T): T {\n if (inGPUMode()) {\n return `(${lhs} - ${rhs})` as unknown as T;\n }\n return VectorOps.sub[lhs.kind](lhs, rhs);\n },\n mul: <T extends vecBase>(s: number, v: T): T => {\n if (inGPUMode()) {\n return `(${s} * ${v})` as unknown as T;\n }\n return VectorOps.mul[v.kind](s, v);\n },\n dot<T extends vecBase>(lhs: T, rhs: T): number {\n if (inGPUMode()) {\n return `dot(${lhs}, ${rhs})` as unknown as number;\n }\n return VectorOps.dot[lhs.kind](lhs, rhs);\n },\n normalize: <T extends vecBase>(v: T): T => {\n if (inGPUMode()) {\n return `normalize(${v})` as unknown as T;\n }\n return VectorOps.normalize[v.kind](v);\n },\n cross<T extends vec3f | vec3i | vec3u>(a: T, b: T): T {\n if (inGPUMode()) {\n return `cross(${a}, ${b})` as unknown as T;\n }\n return VectorOps.cross[a.kind](a, b);\n },\n fract(a: number): number {\n if (inGPUMode()) {\n return `fract(${a})` as unknown as number;\n }\n return a - Math.floor(a);\n },\n length<T extends vecBase>(vector: T): number {\n if (inGPUMode()) {\n return `length(${vector})` as unknown as number;\n }\n return VectorOps.length[vector.kind](vector);\n },\n sin(radians: number): number {\n if (inGPUMode()) {\n return `sin(${radians})` as unknown as number;\n }\n return Math.sin(radians);\n },\n cos(radians: number): number {\n if (inGPUMode()) {\n return `cos(${radians})` as unknown as number;\n }\n return Math.cos(radians);\n },\n};\n","/**\n * @module typegpu\n */\n\nimport { createBuffer } from './legacyBufferApi';\nimport { Storage, Uniform, Vertex } from './tgpuBuffer';\nimport { read, write } from './tgpuBufferUtils';\n\nexport const tgpu = {\n Uniform,\n Storage,\n Vertex,\n\n createBuffer,\n\n read,\n write,\n};\nexport default tgpu;\n\nexport { RecursiveDataTypeError } from './errors';\nexport {\n TgpuData,\n AnyTgpuData,\n} from './types';\nexport { std } from './std';\nexport {\n isUsableAsStorage,\n isUsableAsUniform,\n isUsableAsVertex,\n} from './tgpuBuffer';\n\nexport type { TgpuBuffer } from './tgpuBuffer';\n"],"mappings":"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","names":["BufferReader","BufferWriter","TgpuExternalPlumTrait","isPlum","value","Uniform","Storage","Vertex","createBufferImpl","group","typeSchema","initialOrBuffer","TgpuBufferImpl","isBuffer","value","isUsableAsUniform","buffer","isUsableAsStorage","isUsableAsVertex","_group","dataType","__publicField","isGPUBuffer","writer","BufferWriter","isPlum","plum","label","usages","usage","flags","device","dataOrBuffer","gpuBuffer","mapped","size","sourceBuffer","commandEncoder","hostBuffer","BufferReader","res","stagingBuffer","_a","createBuffer","typeSchema","initialOrBuffer","createBufferImpl","write","buffer","data","read","lengthVec2","v","lengthVec3","lengthVec4","VectorOps","a","b","vec2f","vec2i","vec2u","vec3f","vec3i","vec3u","vec4f","vec4i","vec4u","s","lhs","rhs","len","gpuDepth","inGPUMode","gpuDepth","std","lhs","rhs","inGPUMode","VectorOps","s","v","a","b","vector","radians","tgpu","Uniform","Storage","Vertex","createBuffer","read","write","src_default"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typegpu",
3
3
  "private": false,
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "description": "A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -38,6 +38,12 @@
38
38
  "module": "./experimental/index.js",
39
39
  "import": "./experimental/index.js",
40
40
  "default": "./experimental/index.cjs"
41
+ },
42
+ "./smol": {
43
+ "types": "./smol/index.d.ts",
44
+ "module": "./smol/index.js",
45
+ "import": "./smol/index.js",
46
+ "default": "./smol/index.cjs"
41
47
  }
42
48
  },
43
49
  "sideEffects": false,
@@ -43,7 +43,7 @@ interface TgpuFnBase<Args extends AnyTgpuDataTuple, Return extends AnyTgpuData |
43
43
  /** The JS function body passed as an implementation of a TypeGPU function. */
44
44
  readonly body: (...args: UnwrapArgs<Args>) => UnwrapReturn<Return>;
45
45
  readonly bodyResolvable: TgpuResolvable;
46
- $uses(dependencyMap: Record<string, Wgsl>): this;
46
+ $uses(dependencyMap: Record<string, unknown>): this;
47
47
  }
48
48
  type TgpuFn<Args extends AnyTgpuDataTuple, Return extends AnyTgpuData | undefined = undefined> = TgpuFnBase<Args, Return> & ((...args: UnwrapArgs<Args>) => UnwrapReturn<Return>);
49
49
 
@@ -53,10 +53,6 @@ type Wgsl = string | number | TgpuResolvable | symbol | boolean;
53
53
  * and a new resolution ctx is made when going down each level in the tree.
54
54
  */
55
55
  interface ResolutionCtx {
56
- /**
57
- * Slots that were used by items resolved by this context.
58
- */
59
- readonly usedSlots: Iterable<TgpuSlot<unknown>>;
60
56
  addDeclaration(item: TgpuResolvable): void;
61
57
  addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;
62
58
  addRenderResource(resource: TgpuRenderResource, identifier: TgpuIdentifier): void;
@@ -68,7 +64,7 @@ interface ResolutionCtx {
68
64
  */
69
65
  unwrap<T>(eventual: Eventual<T>): T;
70
66
  resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
71
- transpileFn(fn: TgpuFn<any, any>, externalMap: Record<string, Wgsl>): {
67
+ fnToWgsl(fn: TgpuFn<any, any>, externalMap: Record<string, unknown>): {
72
68
  head: Wgsl;
73
69
  body: Wgsl;
74
70
  };
@@ -84,18 +80,8 @@ interface TgpuIdentifier extends TgpuNamable, TgpuResolvable {
84
80
  */
85
81
  type Eventual<T> = T | TgpuSlot<T>;
86
82
  type SlotValuePair<T> = [TgpuSlot<T>, T];
87
- interface TgpuAllocatable<TData extends AnyTgpuData = AnyTgpuData> {
88
- /**
89
- * The data type this allocatable was constructed with.
90
- * It informs the size and format of data in both JS and
91
- * binary.
92
- */
93
- readonly dataType: TData;
94
- readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
95
- readonly flags: GPUBufferUsageFlags;
96
- }
97
83
  interface TgpuBindable<TData extends AnyTgpuData = AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuResolvable {
98
- readonly allocatable: TgpuAllocatable<TData>;
84
+ readonly allocatable: TgpuBuffer<TData>;
99
85
  readonly usage: TUsage;
100
86
  }
101
87
  type TgpuSamplerType = 'sampler' | 'sampler_comparison';
@@ -110,10 +96,17 @@ interface TgpuRenderResource extends TgpuResolvable {
110
96
  type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';
111
97
  type ValueOf<T> = T extends TgpuSlot<infer I> ? ValueOf<I> : T extends TgpuBufferUsage<infer D> ? ValueOf<D> : T extends TgpuData<unknown> ? Unwrap<T> : T;
112
98
  interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {
99
+ readonly isLoose: false;
100
+ readonly isCustomAligned: boolean;
113
101
  readonly byteAlignment: number;
114
102
  readonly size: number;
115
103
  }
104
+ interface TgpuLooseData<TInner> extends ISchema<TInner>, TgpuResolvable {
105
+ readonly isLoose: true;
106
+ readonly size: number;
107
+ }
116
108
  type AnyTgpuData = TgpuData<unknown>;
109
+ type AnyTgpuLooseData = TgpuLooseData<unknown>;
117
110
  interface TgpuPointer<TScope extends 'function', TInner extends AnyTgpuData> {
118
111
  readonly scope: TScope;
119
112
  readonly pointsTo: TInner;
@@ -513,4 +506,36 @@ interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {
513
506
  }
514
507
  declare const vec4u: Vec4u;
515
508
 
516
- export { type AnyTgpuData as A, type ResolutionCtx as R, type TgpuAllocatable as T, type VecKind as V, type TgpuNamable as a, type TgpuPlum as b, vec3f as c, vec3i as d, vec3u as e, type TgpuData as f, vec2f as g, vec4f as h, type TgpuPointer as i, vec2i as j, vec2u as k, vec4i as l, vec4u as m, type Vec2f as n, type Vec2i as o, type Vec2u as p, type Vec3f as q, type Vec3i as r, type Vec3u as s, type Vec4f as t, type Vec4i as u, type vecBase as v, type Vec4u as w };
509
+ interface Uniform {
510
+ usableAsUniform: true;
511
+ }
512
+ declare const Uniform: Uniform;
513
+ interface Storage {
514
+ usableAsStorage: true;
515
+ }
516
+ declare const Storage: Storage;
517
+ interface Vertex {
518
+ usableAsVertex: true;
519
+ }
520
+ declare const Vertex: Vertex;
521
+ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
522
+ interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {
523
+ readonly resourceType: 'buffer';
524
+ readonly dataType: TData;
525
+ readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
526
+ readonly label: string | undefined;
527
+ readonly buffer: GPUBuffer;
528
+ readonly device: GPUDevice;
529
+ readonly destroyed: boolean;
530
+ $usage<T extends (Uniform | Storage | Vertex)[]>(...usages: T): this & UnionToIntersection<T[number]>;
531
+ $addFlags(flags: GPUBufferUsageFlags): this;
532
+ $device(device: GPUDevice): this;
533
+ write(data: Parsed<TData> | TgpuBuffer<TData>): void;
534
+ read(): Promise<Parsed<TData>>;
535
+ destroy(): void;
536
+ }
537
+ declare function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Uniform;
538
+ declare function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Storage;
539
+ declare function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Vertex;
540
+
541
+ export { type AnyTgpuData as A, type Vec4f as B, type Vec4i as C, type Vec4u as D, type ResolutionCtx as R, Storage as S, type TgpuPlum as T, Uniform as U, Vertex as V, type TgpuBuffer as a, vec3f as b, vec3i as c, vec3u as d, type TgpuData as e, isUsableAsUniform as f, isUsableAsVertex as g, type TgpuNamable as h, isUsableAsStorage as i, vec2f as j, vec4f as k, type TgpuPointer as l, type AnyTgpuLooseData as m, type TgpuLooseData as n, type VecKind as o, vec2i as p, vec2u as q, vec4i as r, vec4u as s, type Vec2f as t, type Vec2i as u, type vecBase as v, type Vec2u as w, type Vec3f as x, type Vec3i as y, type Vec3u as z };
@@ -43,7 +43,7 @@ interface TgpuFnBase<Args extends AnyTgpuDataTuple, Return extends AnyTgpuData |
43
43
  /** The JS function body passed as an implementation of a TypeGPU function. */
44
44
  readonly body: (...args: UnwrapArgs<Args>) => UnwrapReturn<Return>;
45
45
  readonly bodyResolvable: TgpuResolvable;
46
- $uses(dependencyMap: Record<string, Wgsl>): this;
46
+ $uses(dependencyMap: Record<string, unknown>): this;
47
47
  }
48
48
  type TgpuFn<Args extends AnyTgpuDataTuple, Return extends AnyTgpuData | undefined = undefined> = TgpuFnBase<Args, Return> & ((...args: UnwrapArgs<Args>) => UnwrapReturn<Return>);
49
49
 
@@ -53,10 +53,6 @@ type Wgsl = string | number | TgpuResolvable | symbol | boolean;
53
53
  * and a new resolution ctx is made when going down each level in the tree.
54
54
  */
55
55
  interface ResolutionCtx {
56
- /**
57
- * Slots that were used by items resolved by this context.
58
- */
59
- readonly usedSlots: Iterable<TgpuSlot<unknown>>;
60
56
  addDeclaration(item: TgpuResolvable): void;
61
57
  addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;
62
58
  addRenderResource(resource: TgpuRenderResource, identifier: TgpuIdentifier): void;
@@ -68,7 +64,7 @@ interface ResolutionCtx {
68
64
  */
69
65
  unwrap<T>(eventual: Eventual<T>): T;
70
66
  resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
71
- transpileFn(fn: TgpuFn<any, any>, externalMap: Record<string, Wgsl>): {
67
+ fnToWgsl(fn: TgpuFn<any, any>, externalMap: Record<string, unknown>): {
72
68
  head: Wgsl;
73
69
  body: Wgsl;
74
70
  };
@@ -84,18 +80,8 @@ interface TgpuIdentifier extends TgpuNamable, TgpuResolvable {
84
80
  */
85
81
  type Eventual<T> = T | TgpuSlot<T>;
86
82
  type SlotValuePair<T> = [TgpuSlot<T>, T];
87
- interface TgpuAllocatable<TData extends AnyTgpuData = AnyTgpuData> {
88
- /**
89
- * The data type this allocatable was constructed with.
90
- * It informs the size and format of data in both JS and
91
- * binary.
92
- */
93
- readonly dataType: TData;
94
- readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
95
- readonly flags: GPUBufferUsageFlags;
96
- }
97
83
  interface TgpuBindable<TData extends AnyTgpuData = AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuResolvable {
98
- readonly allocatable: TgpuAllocatable<TData>;
84
+ readonly allocatable: TgpuBuffer<TData>;
99
85
  readonly usage: TUsage;
100
86
  }
101
87
  type TgpuSamplerType = 'sampler' | 'sampler_comparison';
@@ -110,10 +96,17 @@ interface TgpuRenderResource extends TgpuResolvable {
110
96
  type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';
111
97
  type ValueOf<T> = T extends TgpuSlot<infer I> ? ValueOf<I> : T extends TgpuBufferUsage<infer D> ? ValueOf<D> : T extends TgpuData<unknown> ? Unwrap<T> : T;
112
98
  interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {
99
+ readonly isLoose: false;
100
+ readonly isCustomAligned: boolean;
113
101
  readonly byteAlignment: number;
114
102
  readonly size: number;
115
103
  }
104
+ interface TgpuLooseData<TInner> extends ISchema<TInner>, TgpuResolvable {
105
+ readonly isLoose: true;
106
+ readonly size: number;
107
+ }
116
108
  type AnyTgpuData = TgpuData<unknown>;
109
+ type AnyTgpuLooseData = TgpuLooseData<unknown>;
117
110
  interface TgpuPointer<TScope extends 'function', TInner extends AnyTgpuData> {
118
111
  readonly scope: TScope;
119
112
  readonly pointsTo: TInner;
@@ -513,4 +506,36 @@ interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {
513
506
  }
514
507
  declare const vec4u: Vec4u;
515
508
 
516
- export { type AnyTgpuData as A, type ResolutionCtx as R, type TgpuAllocatable as T, type VecKind as V, type TgpuNamable as a, type TgpuPlum as b, vec3f as c, vec3i as d, vec3u as e, type TgpuData as f, vec2f as g, vec4f as h, type TgpuPointer as i, vec2i as j, vec2u as k, vec4i as l, vec4u as m, type Vec2f as n, type Vec2i as o, type Vec2u as p, type Vec3f as q, type Vec3i as r, type Vec3u as s, type Vec4f as t, type Vec4i as u, type vecBase as v, type Vec4u as w };
509
+ interface Uniform {
510
+ usableAsUniform: true;
511
+ }
512
+ declare const Uniform: Uniform;
513
+ interface Storage {
514
+ usableAsStorage: true;
515
+ }
516
+ declare const Storage: Storage;
517
+ interface Vertex {
518
+ usableAsVertex: true;
519
+ }
520
+ declare const Vertex: Vertex;
521
+ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
522
+ interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuNamable {
523
+ readonly resourceType: 'buffer';
524
+ readonly dataType: TData;
525
+ readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
526
+ readonly label: string | undefined;
527
+ readonly buffer: GPUBuffer;
528
+ readonly device: GPUDevice;
529
+ readonly destroyed: boolean;
530
+ $usage<T extends (Uniform | Storage | Vertex)[]>(...usages: T): this & UnionToIntersection<T[number]>;
531
+ $addFlags(flags: GPUBufferUsageFlags): this;
532
+ $device(device: GPUDevice): this;
533
+ write(data: Parsed<TData> | TgpuBuffer<TData>): void;
534
+ read(): Promise<Parsed<TData>>;
535
+ destroy(): void;
536
+ }
537
+ declare function isUsableAsUniform<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Uniform;
538
+ declare function isUsableAsStorage<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Storage;
539
+ declare function isUsableAsVertex<T extends TgpuBuffer<AnyTgpuData>>(buffer: T): buffer is T & Vertex;
540
+
541
+ export { type AnyTgpuData as A, type Vec4f as B, type Vec4i as C, type Vec4u as D, type ResolutionCtx as R, Storage as S, type TgpuPlum as T, Uniform as U, Vertex as V, type TgpuBuffer as a, vec3f as b, vec3i as c, vec3u as d, type TgpuData as e, isUsableAsUniform as f, isUsableAsVertex as g, type TgpuNamable as h, isUsableAsStorage as i, vec2f as j, vec4f as k, type TgpuPointer as l, type AnyTgpuLooseData as m, type TgpuLooseData as n, type VecKind as o, vec2i as p, vec2u as q, vec4i as r, vec4u as s, type Vec2f as t, type Vec2i as u, type vecBase as v, type Vec2u as w, type Vec3f as x, type Vec3i as y, type Vec3u as z };
package/chunk-3I5VAGHS.js DELETED
@@ -1,2 +0,0 @@
1
- var D=Object.defineProperty;var S=(e,a)=>(a=Symbol[e])?a:Symbol.for("Symbol."+e);var A=(e,a,r)=>a in e?D(e,a,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[a]=r;var l=(e,a,r)=>(A(e,typeof a!="symbol"?a+"":a,r),r);var I=function(e,a){this[0]=e,this[1]=a};var F=e=>{var a=e[S("asyncIterator")],r=!1,n,y={};return a==null?(a=e[S("iterator")](),n=t=>y[t]=z=>a[t](z)):(a=a.call(e),n=t=>y[t]=z=>{if(r){if(r=!1,t==="throw")throw z;return z}return r=!0,{done:!1,value:new I(new Promise(R=>{var P=a[t](z);if(!(P instanceof Object))throw TypeError("Object expected");R(P)}),1)}}),y[S("iterator")]=()=>y,n("next"),"throw"in a?n("throw"):y.throw=t=>{throw t},"return"in a&&n("return"),y};function U(e){return!!e&&(typeof e=="object"||typeof e=="function")&&"resolve"in e}function M(e){return!!e&&typeof e=="object"&&"getMappedRange"in e&&"mapAsync"in e}var g=class e extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,e.prototype)}};import{Measurer as O,f32 as h,i32 as _,u32 as V}from"typed-binary";function B(e,a){let r="size"in e?e.size:e.currentByteOffset,n=a-1,y=r&n;"skipBytes"in e?e.skipBytes(a-y&n):e.add(a-y&n)}var k=B;function u(e){let a={__unwrapped:void 0,size:e.length*4,label:e.label,byteAlignment:e.byteAlignment,expressionCode:e.label,resolveReferences(n){throw new g},write(n,y){k(n,this.byteAlignment);for(let t of y)e.unitType.write(n,t)},read(n){return k(n,this.byteAlignment),e.make(...Array.from({length:e.length}).map(y=>e.unitType.read(n)))},measure(n,y=new O){return k(y,this.byteAlignment),y.add(this.size)},seekProperty(n,y){throw new Error("Method not implemented.")},resolve(){return e.label}};return Object.assign((...n)=>{var t;let y=n;if(y.length<=1)return e.makeFromScalar((t=y[0])!=null?t:0);if(y.length===e.length)return e.make(...y);throw new Error(`'${e.label}' constructor called with invalid number of arguments.`)},a)}var b=class{constructor(a,r){this.x=a;this.y=r}*[Symbol.iterator](){yield this.x,yield this.y}},T=class e extends b{constructor(){super(...arguments);l(this,"kind","vec2f")}make2(r,n){return new e(r,n)}make3(r,n,y){return new c(r,n,y)}make4(r,n,y,t){return new i(r,n,y,t)}},d=class e extends b{constructor(){super(...arguments);l(this,"kind","vec2i")}make2(r,n){return new e(r,n)}make3(r,n,y){return new s(r,n,y)}make4(r,n,y,t){return new p(r,n,y,t)}},x=class e extends b{constructor(){super(...arguments);l(this,"kind","vec2u")}make2(r,n){return new e(r,n)}make3(r,n,y){return new w(r,n,y)}make4(r,n,y,t){return new m(r,n,y,t)}},v=class{constructor(a,r,n){this.x=a;this.y=r;this.z=n}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},c=class e extends v{constructor(){super(...arguments);l(this,"kind","vec3f")}make2(r,n){return new T(r,n)}make3(r,n,y){return new e(r,n,y)}make4(r,n,y,t){return new i(r,n,y,t)}},s=class e extends v{constructor(){super(...arguments);l(this,"kind","vec3i")}make2(r,n){return new d(r,n)}make3(r,n,y){return new e(r,n,y)}make4(r,n,y,t){return new p(r,n,y,t)}},w=class e extends v{constructor(){super(...arguments);l(this,"kind","vec3u")}make2(r,n){return new x(r,n)}make3(r,n,y){return new e(r,n,y)}make4(r,n,y,t){return new m(r,n,y,t)}},f=class{constructor(a,r,n,y){this.x=a;this.y=r;this.z=n;this.w=y}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},i=class e extends f{constructor(){super(...arguments);l(this,"kind","vec4f")}make2(r,n){return new T(r,n)}make3(r,n,y){return new c(r,n,y)}make4(r,n,y,t){return new e(r,n,y,t)}},p=class e extends f{constructor(){super(...arguments);l(this,"kind","vec4i")}make2(r,n){return new d(r,n)}make3(r,n,y){return new s(r,n,y)}make4(r,n,y,t){return new e(r,n,y,t)}},m=class e extends f{constructor(){super(...arguments);l(this,"kind","vec4u")}make2(r,n){return new x(r,n)}make3(r,n,y){return new w(r,n,y)}make4(r,n,y,t){return new e(r,n,y,t)}},o={get:(e,a)=>{if(typeof a=="symbol")return Reflect.get(e,a);let r=e,n=new Array(a.length),y=0;for(let t of a){switch(t){case"x":n[y]=r.x;break;case"y":n[y]=r.y;break;case"z":n[y]=r.z;break;case"w":n[y]=r.w;break;default:return Reflect.get(r,a)}y++}return a.length===4?new Proxy(r.make4(n[0],n[1],n[2],n[3]),o):a.length===3?new Proxy(r.make3(n[0],n[1],n[2]),o):a.length===2?new Proxy(r.make2(n[0],n[1]),o):Reflect.get(e,a)}},H=u({unitType:h,byteAlignment:8,length:2,label:"vec2f",make:(e,a)=>new Proxy(new T(e,a),o),makeFromScalar:e=>new Proxy(new T(e,e),o)}),K=u({unitType:_,byteAlignment:8,length:2,label:"vec2i",make:(e,a)=>new Proxy(new d(e,a),o),makeFromScalar:e=>new Proxy(new d(e,e),o)}),q=u({unitType:V,byteAlignment:8,length:2,label:"vec2u",make:(e,a)=>new Proxy(new x(e,a),o),makeFromScalar:e=>new Proxy(new x(e,e),o)}),L=u({unitType:h,byteAlignment:16,length:3,label:"vec3f",make:(e,a,r)=>new Proxy(new c(e,a,r),o),makeFromScalar:e=>new Proxy(new c(e,e,e),o)}),J=u({unitType:_,byteAlignment:16,length:3,label:"vec3i",make:(e,a,r)=>new Proxy(new s(e,a,r),o),makeFromScalar:e=>new Proxy(new s(e,e,e),o)}),Q=u({unitType:V,byteAlignment:16,length:3,label:"vec3u",make:(e,a,r)=>new Proxy(new w(e,a,r),o),makeFromScalar:e=>new Proxy(new w(e,e,e),o)}),X=u({unitType:h,byteAlignment:16,length:4,label:"vec4f",make:(e,a,r,n)=>new Proxy(new i(e,a,r,n),o),makeFromScalar:e=>new Proxy(new i(e,e,e,e),o)}),Y=u({unitType:_,byteAlignment:16,length:4,label:"vec4i",make:(e,a,r,n)=>new Proxy(new p(e,a,r,n),o),makeFromScalar:e=>new Proxy(new p(e,e,e,e),o)}),Z=u({unitType:V,byteAlignment:16,length:4,label:"vec4u",make:(e,a,r,n)=>new Proxy(new m(e,a,r,n),o),makeFromScalar:e=>new Proxy(new m(e,e,e,e),o)});export{l as a,F as b,U as c,M as d,g as e,k as f,H as g,K as h,q as i,L as j,J as k,Q as l,X as m,Y as n,Z as o};
2
- //# sourceMappingURL=chunk-3I5VAGHS.js.map