@derschmale/tiny-helix 0.1.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/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/BindGroup.d.ts +121 -0
- package/dist/BlendMode.d.ts +21 -0
- package/dist/Buffer.d.ts +66 -0
- package/dist/BufferDataWriter.d.ts +67 -0
- package/dist/CommandEncoder.d.ts +50 -0
- package/dist/ComputePass.d.ts +37 -0
- package/dist/ComputePipeline.d.ts +18 -0
- package/dist/Mesh.d.ts +177 -0
- package/dist/Pipeline.d.ts +47 -0
- package/dist/RenderPass.d.ts +101 -0
- package/dist/RenderPipeline.d.ts +77 -0
- package/dist/RenderTarget.d.ts +44 -0
- package/dist/Renderer.d.ts +44 -0
- package/dist/Sampler.d.ts +31 -0
- package/dist/Shader.d.ts +77 -0
- package/dist/Texture.d.ts +55 -0
- package/dist/TinyHelix.d.ts +163 -0
- package/dist/UniformBuffer.d.ts +84 -0
- package/dist/WebGPUContext.d.ts +70 -0
- package/dist/buffers/Buffer.d.ts +79 -0
- package/dist/buffers/BufferDataWriter.d.ts +68 -0
- package/dist/buffers/IBuffer.d.ts +4 -0
- package/dist/buffers/UniformBuffer.d.ts +111 -0
- package/dist/enums.d.ts +158 -0
- package/dist/index.d.ts +24 -0
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -0
- package/dist/tiny-helix.debug.js +3351 -0
- package/dist/tiny-helix.debug.js.map +1 -0
- package/dist/tiny-helix.esm.debug.js +3386 -0
- package/dist/tiny-helix.esm.debug.js.map +1 -0
- package/dist/tiny-helix.esm.js +2 -0
- package/dist/tiny-helix.esm.js.map +1 -0
- package/dist/tiny-helix.js +2 -0
- package/dist/tiny-helix.js.map +1 -0
- package/dist/utils/IndexedCollection.d.ts +4 -0
- package/dist/utils/float32ToFloat16.d.ts +5 -0
- package/dist/utils/mapUndefined.d.ts +6 -0
- package/dist/utils/padArrayBuffer.d.ts +10 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiny-helix.esm.js","mappings":"AACA,ICDYA,EAKAC,EAKAC,EASAC,EAMAC,EAwGAC,EAoBAC,EAWAC,ECvJAC,EAaAC,ECZAC,EAqBPC,GF/BL,SAAYX,GACR,cACA,wBACH,EAHD,CAAYA,IAAAA,EAAU,KAKtB,SAAYC,GACR,oBACA,iBACH,CAHD,CAAYA,IAAAA,EAAU,KAKtB,SAAYC,GACR,8BACA,kBACA,8BACH,CAJD,CAAYA,IAAAA,EAAW,KASvB,SAAYC,GACR,cACA,gBACA,aACH,CAJD,CAAYA,IAAAA,EAAQ,KAMpB,SAAYC,GACR,oBACA,oBACA,kBACA,kBACA,sBACA,sBACA,oBACA,oBACA,sBACA,sBACA,sBACA,oBACA,oBACA,oBACA,oBACA,sBACA,wBACA,wBACA,sBACA,sBACA,wBACA,0BACA,mCACA,0BACA,wBACA,wBACA,0BACA,mCACA,8BACA,4BACA,8BACA,gCACA,sBACA,sBACA,wBACA,4BACA,4BACA,0BACA,0BACA,4BACA,0BACA,0BACA,4BACA,sBACA,8BACA,4BACA,6CACA,8BACA,+CACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,0BACA,0BACA,4BACA,4BACA,kCACA,gCACA,gCACA,yCACA,iCACA,0CACA,qCACA,8CACA,mCACA,4CACA,6BACA,6BACA,+BACA,+BACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,gCACA,yCACA,kCACA,2CACA,kCACA,2CACA,kCACA,2CACA,oCACA,6CACA,oCACA,6CACA,oCACA,4CACH,CAtGD,CAAYA,IAAAA,EAAa,KAwGzB,SAAYC,GACR,cACA,YACA,iBACA,mCACA,uBACA,yCACA,iBACA,mCACA,uBACA,yCACA,0CACA,sBACA,wCACA,mBACA,qCACA,yBACA,0CACH,CAlBD,CAAYA,IAAAA,EAAW,KAoBvB,SAAYC,GACR,gBACA,cACA,gBACA,yBACA,oBACA,uBACA,+BACA,iBACH,CATD,CAAYA,IAAAA,EAAe,KAW3B,SAAYC,GACR,yBACA,mBACA,oBA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","sources":["webpack://@derschmale/tiny-helix/webpack/bootstrap","webpack://@derschmale/tiny-helix/./src/enums.ts","webpack://@derschmale/tiny-helix/./src/buffers/Buffer.ts","webpack://@derschmale/tiny-helix/./src/buffers/UniformBuffer.ts","webpack://@derschmale/tiny-helix/./src/WebGPUContext.ts","webpack://@derschmale/tiny-helix/./src/utils/mapUndefined.ts","webpack://@derschmale/tiny-helix/./src/RenderPass.ts","webpack://@derschmale/tiny-helix/./src/ComputePass.ts","webpack://@derschmale/tiny-helix/./src/CommandEncoder.ts","webpack://@derschmale/tiny-helix/./src/Texture.ts","webpack://@derschmale/tiny-helix/./src/RenderTarget.ts","webpack://@derschmale/tiny-helix/./src/utils/padArrayBuffer.ts","webpack://@derschmale/tiny-helix/./src/utils/float32ToFloat16.ts","webpack://@derschmale/tiny-helix/./src/BindGroup.ts","webpack://@derschmale/tiny-helix/./src/Shader.ts","webpack://@derschmale/tiny-helix/./src/RenderPipeline.ts","webpack://@derschmale/tiny-helix/./src/Mesh.ts","webpack://@derschmale/tiny-helix/./src/Sampler.ts","webpack://@derschmale/tiny-helix/./src/ComputePipeline.ts","webpack://@derschmale/tiny-helix/./src/TinyHelix.ts","webpack://@derschmale/tiny-helix/./src/BlendMode.ts","webpack://@derschmale/tiny-helix/./src/buffers/BufferDataWriter.ts","webpack://@derschmale/tiny-helix/./src/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","export enum ColorSpace {\r\n sRGB = 'srgb',\r\n DisplayP3 = 'display-p3'\r\n}\r\n\r\nexport enum FilterMode {\r\n Nearest = \"nearest\",\r\n Linear = \"linear\"\r\n}\r\n\r\nexport enum AddressMode {\r\n ClampToEdge = \"clamp-to-edge\",\r\n Repeat = \"repeat\",\r\n MirrorRepeat = \"mirror-repeat\"\r\n}\r\n\r\n/**\r\n * Face culling modes used by the render pipeline primitive state.\r\n */\r\nexport enum CullMode {\r\n None = 'none',\r\n Front = 'front',\r\n Back = 'back'\r\n}\r\n\r\nexport enum TextureFormat {\r\n R8Unorm = \"r8unorm\",\r\n R8Snorm = \"r8snorm\",\r\n R8Uint = \"r8uint\",\r\n R8Sint = \"r8sint\",\r\n R16Unorm = \"r16unorm\",\r\n R16Snorm = \"r16snorm\",\r\n R16Uint = \"r16uint\",\r\n R16Sint = \"r16sint\",\r\n R16Float = \"r16float\",\r\n RG8Unorm = \"rg8unorm\",\r\n RG8Snorm = \"rg8snorm\",\r\n RG8Uint = \"rg8uint\",\r\n RG8Sint = \"rg8sint\",\r\n R32Uint = \"r32uint\",\r\n R32Sint = \"r32sint\",\r\n R32Float = \"r32float\",\r\n RG16Unorm = \"rg16unorm\",\r\n RG16Snorm = \"rg16snorm\",\r\n RG16Uint = \"rg16uint\",\r\n RG16Sint = \"rg16sint\",\r\n RG16Float = \"rg16float\",\r\n Rgba8Unorm = \"rgba8unorm\",\r\n Rgba8UnormSrgb = \"rgba8unorm-srgb\",\r\n Rgba8Snorm = \"rgba8snorm\",\r\n Rgba8Uint = \"rgba8uint\",\r\n Rgba8Sint = \"rgba8sint\",\r\n Bgra8Unorm = \"bgra8unorm\",\r\n Bgra8UnormSrgb = \"bgra8unorm-srgb\",\r\n Rgb9e5Ufloat = \"rgb9e5ufloat\",\r\n Rgb10a2Uint = \"rgb10a2uint\",\r\n Rgb10a2Unorm = \"rgb10a2unorm\",\r\n Rg11b10Ufloat = \"rg11b10ufloat\",\r\n RG32Uint = \"rg32uint\",\r\n RG32Sint = \"rg32sint\",\r\n RG32Float = \"rg32float\",\r\n Rgba16Unorm = \"rgba16unorm\",\r\n Rgba16Snorm = \"rgba16snorm\",\r\n Rgba16Uint = \"rgba16uint\",\r\n Rgba16Sint = \"rgba16sint\",\r\n Rgba16Float = \"rgba16float\",\r\n Rgba32Uint = \"rgba32uint\",\r\n Rgba32Sint = \"rgba32sint\",\r\n Rgba32Float = \"rgba32float\",\r\n Stencil8 = \"stencil8\",\r\n Depth16Unorm = \"depth16unorm\",\r\n Depth24Plus = \"depth24plus\",\r\n Depth24PlusStencil8 = \"depth24plus-stencil8\",\r\n Depth32Float = \"depth32float\",\r\n Depth32FloatStencil8 = \"depth32float-stencil8\",\r\n Bc1RgbaUnorm = \"bc1-rgba-unorm\",\r\n Bc1RgbaUnormSrgb = \"bc1-rgba-unorm-srgb\",\r\n Bc2RgbaUnorm = \"bc2-rgba-unorm\",\r\n Bc2RgbaUnormSrgb = \"bc2-rgba-unorm-srgb\",\r\n Bc3RgbaUnorm = \"bc3-rgba-unorm\",\r\n Bc3RgbaUnormSrgb = \"bc3-rgba-unorm-srgb\",\r\n Bc4RUnorm = \"bc4-r-unorm\",\r\n Bc4RSnorm = \"bc4-r-snorm\",\r\n Bc5RgUnorm = \"bc5-rg-unorm\",\r\n Bc5RgSnorm = \"bc5-rg-snorm\",\r\n Bc6hRgbUfloat = \"bc6h-rgb-ufloat\",\r\n Bc6hRgbFloat = \"bc6h-rgb-float\",\r\n Bc7RgbaUnorm = \"bc7-rgba-unorm\",\r\n Bc7RgbaUnormSrgb = \"bc7-rgba-unorm-srgb\",\r\n Etc2Rgb8Unorm = \"etc2-rgb8unorm\",\r\n Etc2Rgb8UnormSrgb = \"etc2-rgb8unorm-srgb\",\r\n Etc2Rgb8A1Unorm = \"etc2-rgb8a1unorm\",\r\n Etc2Rgb8A1UnormSrgb = \"etc2-rgb8a1unorm-srgb\",\r\n Etc2Rgba8Unorm = \"etc2-rgba8unorm\",\r\n Etc2Rgba8UnormSrgb = \"etc2-rgba8unorm-srgb\",\r\n EacR11Unorm = \"eac-r11unorm\",\r\n EacR11Snorm = \"eac-r11snorm\",\r\n EacRg11Unorm = \"eac-rg11unorm\",\r\n EacRg11Snorm = \"eac-rg11snorm\",\r\n Astc4x4Unorm = \"astc-4x4-unorm\",\r\n Astc4x4UnormSrgb = \"astc-4x4-unorm-srgb\",\r\n Astc5x4Unorm = \"astc-5x4-unorm\",\r\n Astc5x4UnormSrgb = \"astc-5x4-unorm-srgb\",\r\n Astc5x5Unorm = \"astc-5x5-unorm\",\r\n Astc5x5UnormSrgb = \"astc-5x5-unorm-srgb\",\r\n Astc6x5Unorm = \"astc-6x5-unorm\",\r\n Astc6x5UnormSrgb = \"astc-6x5-unorm-srgb\",\r\n Astc6x6Unorm = \"astc-6x6-unorm\",\r\n Astc6x6UnormSrgb = \"astc-6x6-unorm-srgb\",\r\n Astc8x5Unorm = \"astc-8x5-unorm\",\r\n Astc8x5UnormSrgb = \"astc-8x5-unorm-srgb\",\r\n Astc8x6Unorm = \"astc-8x6-unorm\",\r\n Astc8x6UnormSrgb = \"astc-8x6-unorm-srgb\",\r\n Astc8x8Unorm = \"astc-8x8-unorm\",\r\n Astc8x8UnormSrgb = \"astc-8x8-unorm-srgb\",\r\n Astc10x5Unorm = \"astc-10x5-unorm\",\r\n Astc10x5UnormSrgb = \"astc-10x5-unorm-srgb\",\r\n Astc10x6Unorm = \"astc-10x6-unorm\",\r\n Astc10x6UnormSrgb = \"astc-10x6-unorm-srgb\",\r\n Astc10x8Unorm = \"astc-10x8-unorm\",\r\n Astc10x8UnormSrgb = \"astc-10x8-unorm-srgb\",\r\n Astc10x10Unorm = \"astc-10x10-unorm\",\r\n Astc10x10UnormSrgb = \"astc-10x10-unorm-srgb\",\r\n Astc12x10Unorm = \"astc-12x10-unorm\",\r\n Astc12x10UnormSrgb = \"astc-12x10-unorm-srgb\",\r\n Astc12x12Unorm = \"astc-12x12-unorm\",\r\n Astc12x12UnormSrgb = \"astc-12x12-unorm-srgb\"\r\n}\r\n\r\nexport enum BlendFactor {\r\n Zero = \"zero\",\r\n One = \"one\",\r\n SrcColor = \"src\",\r\n OneMinusSrcColor = \"one-minus-src\",\r\n SrcAlpha = \"src-alpha\",\r\n OneMinusSrcAlpha = \"one-minus-src-alpha\",\r\n DstColor = \"dst\",\r\n OneMinusDstColor = \"one-minus-dst\",\r\n DstAlpha = \"dst-alpha\",\r\n OneMinusDstAlpha = \"one-minus-dst-alpha\",\r\n SrcAlphaSaturated = \"src-alpha-saturated\",\r\n Constant = \"constant\",\r\n OneMinusConstant = \"one-minus-constant\",\r\n Src1Color = \"src1\",\r\n OneMinusSrc1Color = \"one-minus-src1\",\r\n Src1Alpha = \"src1-alpha\",\r\n OneMinusSrc1Alpha = \"one-minus-src1-alpha\"\r\n}\r\n\r\nexport enum CompareFunction {\r\n Never = \"never\",\r\n Less = \"less\",\r\n Equal = \"equal\",\r\n LessEqual = \"less-equal\",\r\n Greater = \"greater\",\r\n NotEqual = \"not-equal\",\r\n GreaterEqual = \"greater-equal\",\r\n Always = \"always\"\r\n}\r\n\r\nexport enum StorageAccess {\r\n ReadWrite = \"read-write\",\r\n Read = \"read-only\",\r\n Write = \"write-only\"\r\n}","import {WebGPUContext} from \"../WebGPUContext\";\r\nimport {mapUndefined} from \"../utils/mapUndefined\";\r\nimport {padArrayBuffer} from \"../utils/padArrayBuffer\";\r\nimport {IBuffer} from \"./IBuffer\";\r\n\r\n/**\r\n * Buffer usage flags re-exported from the WebGPU API for convenience.\r\n * Use these when constructing buffers with `BufferBuilder.withUsage()`.\r\n */\r\nexport enum BufferUsage {\r\n MapRead = GPUBufferUsage.MAP_READ,\r\n MapWrite = GPUBufferUsage.MAP_WRITE,\r\n CopySrc = GPUBufferUsage.COPY_SRC,\r\n CopyDst = GPUBufferUsage.COPY_DST,\r\n Index = GPUBufferUsage.INDEX,\r\n Vertex = GPUBufferUsage.VERTEX,\r\n Uniform = GPUBufferUsage.UNIFORM,\r\n Storage = GPUBufferUsage.STORAGE,\r\n Indirect = GPUBufferUsage.INDIRECT,\r\n QueryResolve = GPUBufferUsage.QUERY_RESOLVE\r\n}\r\n\r\nexport enum TextureUsage {\r\n CopySrc = GPUTextureUsage.COPY_SRC,\r\n CopyDst = GPUTextureUsage.COPY_DST,\r\n TextureBinding = GPUTextureUsage.TEXTURE_BINDING,\r\n StorageBinding = GPUTextureUsage.STORAGE_BINDING,\r\n RenderAttachment = GPUTextureUsage.RENDER_ATTACHMENT\r\n}\r\n\r\n/**\r\n * Builder for creating GPU-backed buffers.\r\n *\r\n * Example:\r\n * const buf = new BufferBuilder(ctx)\r\n * .withUsage(BufferUsage.Vertex | BufferUsage.CopyDst)\r\n * .withData(new Float32Array([...]).buffer)\r\n * .build();\r\n */\r\nexport class BufferBuilder {\r\n private _ctx: WebGPUContext;\r\n private _data?: ArrayBufferLike;\r\n private _size = 0;\r\n private _keepData = false;\r\n private _usage: number = 0;\r\n\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n /**\r\n * Add usage flags for the GPU buffer.\r\n */\r\n withUsage(usage: BufferUsage): this\r\n {\r\n this._usage |= usage;\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide initial data for the buffer. If `keepOnCPU` is true the original\r\n * ArrayBuffer is stored in the resulting `Buffer.data` field for readback or\r\n * reuse.\r\n */\r\n withData(data: ArrayBufferLike, keepOnCPU: boolean = false) {\r\n this._data = data;\r\n // round to the nearest multiple of 4 bytes, as required by GPUBuffer.writeBuffer()\r\n this._size = data.byteLength;\r\n this._keepData = keepOnCPU;\r\n this._usage |= BufferUsage.CopyDst;\r\n return this;\r\n }\r\n\r\n /**\r\n * Specify a size for the buffer, used when not providing data.\r\n */\r\n withSize(size: number): this\r\n {\r\n this._size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Create the GPU buffer and upload any provided data.\r\n */\r\n build(): Buffer {\r\n const data = mapUndefined(this._data, data => padArrayBuffer(data, 4));\r\n const buffer = this._ctx.device.createBuffer({\r\n size: data? data.byteLength : this._size, // in case we don't have data, we need to specify the size explicitly'\r\n usage: this._usage\r\n });\r\n\r\n if (data) {\r\n this._ctx.device.queue.writeBuffer(buffer, 0, data);\r\n }\r\n\r\n return new Buffer(buffer, this._keepData? this._data : undefined);\r\n }\r\n}\r\n\r\n/**\r\n * Lightweight wrapper around a GPUBuffer. Exposes the original CPU-side data\r\n * (when kept) and the underlying GPU buffer for low-level interop.\r\n */\r\nexport class Buffer implements IBuffer {\r\n readonly _inner: GPUBuffer;\r\n readonly data?: ArrayBufferLike;\r\n\r\n /**\r\n * Create a Buffer from an existing GPUBuffer.\r\n * @param inner The underlying GPUBuffer.\r\n * @param data Optional CPU-side copy of the buffer contents.\r\n */\r\n constructor(inner: GPUBuffer, data?: ArrayBufferLike) {\r\n this._inner = inner;\r\n this.data = data;\r\n }\r\n\r\n /** Size of the GPU buffer in bytes. */\r\n get size(): number { return this._inner.size; }\r\n\r\n _uploadData(ctx: WebGPUContext)\r\n {\r\n if (!this.data) {\r\n console.warn(\"Buffer has no data to upload.\");\r\n return;\r\n }\r\n\r\n ctx.device.queue.writeBuffer(this._inner, 0, this.data);\r\n }\r\n\r\n _getBufferResource(): GPUBindingResource {\r\n return { buffer: this._inner };\r\n }\r\n}","import {WebGPUContext} from \"../WebGPUContext\";\r\nimport {Buffer, BufferBuilder} from \"./Buffer\";\r\nimport {float32ToFloat16} from \"../utils/float32ToFloat16\";\r\nimport {IBuffer} from \"./IBuffer\";\r\nimport {IndexedCollection} from \"../utils/IndexedCollection\";\r\n\r\n/**\r\n * Primitive base types supported by the uniform buffer helpers.\r\n * These correspond to WGSL scalar types used inside UBOs.\r\n */\r\nexport enum BaseType {\r\n Float16,\r\n Float32,\r\n Uint,\r\n Sint,\r\n Boolean\r\n}\r\n\r\nfunction sizeForBaseType(type: BaseType): number {\r\n switch (type) {\r\n case BaseType.Float16:\r\n return 2;\r\n case BaseType.Float32:\r\n return 4;\r\n case BaseType.Boolean:\r\n return 1;\r\n default:\r\n throw new Error(\"Unknown BaseType.\");\r\n }\r\n}\r\n\r\nenum ContainerType {\r\n Scalar,\r\n Vec,\r\n Matrix, // a matrix of 2 vec[numElements]<baseType>\r\n Array,\r\n}\r\n\r\nclass MemberType {\r\n baseType: BaseType;\r\n containerType: ContainerType;\r\n numRows = 1;\r\n numCols = 1;\r\n\r\n constructor(baseType: BaseType, containerType: ContainerType, numRows: number, numCols: number) {\r\n if (containerType === ContainerType.Scalar && numRows !== 1 && numCols !== 1) {\r\n throw new Error(\"Scalar member must have numRows = 1.\");\r\n }\r\n\r\n this.baseType = baseType;\r\n this.containerType = containerType;\r\n this.numRows = numRows;\r\n this.numCols = numCols;\r\n }\r\n\r\n get size(): number {\r\n // when we're dealing with matrices, storing vec3f internally stores as vec4f\r\n const numRows = this.numCols > 1 && this.numRows === 3 ? 4 : this.numRows;\r\n return sizeForBaseType(this.baseType) * numRows * this.numCols;\r\n }\r\n\r\n get alignment(): number {\r\n const numElements = this.numRows === 3 ? 4 : this.numRows;\r\n // matrices are also just aligned to their underlying vec alignment\r\n return sizeForBaseType(this.baseType) * numElements;\r\n }\r\n}\r\n\r\ninterface Member {\r\n type: MemberType;\r\n offset: number;\r\n}\r\n\r\nexport class UniformBufferLayoutBuilder {\r\n private _size: number = 0;\r\n private _members: Map<string, Member> = new Map();\r\n\r\n /**\r\n * Reserve an explicit size for the resulting UBO layout. If not set the\r\n * builder will compute a size that fits all declared members.\r\n */\r\n withSize(size: number): this {\r\n if (this._size !== 0) throw new Error(\"Size already set.\");\r\n this._size = size;\r\n return this;\r\n }\r\n\r\n pushScalar(baseType: BaseType, name: string): this {\r\n return this._pushField(baseType, name, ContainerType.Scalar);\r\n }\r\n\r\n pushVec2(baseType: BaseType, name: string): this {\r\n return this._pushField(baseType, name, ContainerType.Vec, 2);\r\n }\r\n\r\n pushVec3(baseType: BaseType, name: string): this {\r\n return this._pushField(baseType, name, ContainerType.Vec, 3);\r\n }\r\n\r\n pushVec4(baseType: BaseType, name: string): this {\r\n return this._pushField(baseType, name, ContainerType.Vec, 4);\r\n }\r\n\r\n pushMatrix(baseType: BaseType, numRows: number, numCols: number, name: string): this {\r\n if (!Number.isInteger(numRows) || !Number.isInteger(numCols)) {\r\n throw new Error('Matrix dimensions must be integers');\r\n }\r\n\r\n if (numRows < 2 || numRows > 4 || numCols < 2 || numCols > 4) {\r\n throw new Error('Matrix dimensions must be between 2 and 4 (inclusive)');\r\n }\r\n\r\n return this._pushField(baseType, name, ContainerType.Matrix, numRows, numCols);\r\n }\r\n\r\n /**\r\n * Finalize and return a `UniformBufferLayout` describing member offsets and total size.\r\n */\r\n build(): UniformBufferLayout {\r\n // round up to 16 byte alignment with a 16 byte minimum\r\n this._size = Math.ceil(this._size / 16) * 16;\r\n return new UniformBufferLayout(this._size, this._members);\r\n }\r\n\r\n private _pushField(baseType: BaseType, name: string, containerType: ContainerType, numRows: number = 1, numCols: number = 1): this {\r\n const type = new MemberType(baseType, containerType, numRows, numCols);\r\n const alignment = type.alignment;\r\n const offset = Math.ceil(this._size / alignment) * alignment;\r\n this._members.set(name, {offset, type});\r\n this._size = offset + type.size;\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Describes the layout of a uniform buffer including member offsets and total size.\r\n * Use `UniformBufferLayoutBuilder` to construct instances.\r\n */\r\nexport class UniformBufferLayout {\r\n readonly size: number;\r\n private _members: Map<string, Member>;\r\n\r\n constructor(size: number, members: Map<string, Member>) {\r\n this.size = size;\r\n this._members = members;\r\n }\r\n\r\n /**\r\n * Create typed DataViews for each member of the layout.\r\n * @internal\r\n */\r\n _createDataViews(target: ArrayBuffer): Map<string, [Member, IndexedCollection]> {\r\n const map = new Map();\r\n for (const [name, member] of this._members) {\r\n let ArrayConst: { new(buffer: ArrayBuffer, byteOffset: number, size: number): IndexedCollection; };\r\n const size = member.type.size;\r\n let byteSize = 4;\r\n\r\n switch (member.type.baseType) {\r\n case BaseType.Float16:\r\n byteSize = 2;\r\n ArrayConst = Uint16Array;\r\n break;\r\n case BaseType.Float32:\r\n ArrayConst = Float32Array;\r\n break;\r\n case BaseType.Uint:\r\n case BaseType.Boolean:\r\n ArrayConst = Uint32Array;\r\n break;\r\n case BaseType.Sint:\r\n ArrayConst = Int32Array;\r\n break;\r\n }\r\n\r\n map.set(name, [ member, new ArrayConst(target, member.offset, size / byteSize) ]);\r\n }\r\n return map;\r\n }\r\n\r\n private _getMemberOrThrow(name: string): Member {\r\n const member = this._members.get(name);\r\n if (!member) {\r\n throw new Error(`Member ${name} not found in layout.`);\r\n }\r\n return member;\r\n }\r\n}\r\n\r\n/**\r\n * GPU-backed uniform buffer wrapper providing typed setters and an upload method.\r\n * Use {@link TinyHelix.createUniformBuffer} to create instances.\r\n */\r\nexport class UniformBuffer implements IBuffer {\r\n private _buffer: Buffer;\r\n private _data: ArrayBuffer;\r\n private _ctx: WebGPUContext;\r\n private _dataViews: Map<string, [Member, IndexedCollection]> = new Map();\r\n\r\n /**\r\n * Create a new UniformBuffer with the given layout and WebGPU context.\r\n * @internal\r\n */\r\n constructor(layout: UniformBufferLayout, ctx: WebGPUContext) {\r\n const data = new ArrayBuffer(layout.size);\r\n this._buffer = new BufferBuilder(ctx)\r\n .withUsage(GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST)\r\n .withData(data, true)\r\n .build();\r\n this._data = this._buffer.data!;\r\n this._dataViews = layout._createDataViews(this._data);\r\n\r\n // hmmm let's think a bit here.\r\n // We could go through all the members of the layout and create typed views for them, so we don't need all the\r\n // _write functions upstairs\r\n this._ctx = ctx;\r\n }\r\n\r\n /**\r\n * Sets the value of a scalar field.\r\n * @param name Name of the scalar field.\r\n * @param value Value to set.\r\n */\r\n setScalar(name: string, value: number): this {\r\n const [ member, target ] = this._dataViews.get(name)!;\r\n\r\n if (member.type.baseType === BaseType.Float16) {\r\n target[0] = float32ToFloat16(value);\r\n }\r\n else {\r\n target[0] = value;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the values for a vector field.\r\n * @param name Name of the vector field.\r\n * @param values Array of values to set.\r\n */\r\n setVec(name: string, values: number[] | IndexedCollection): this {\r\n const [ member, target ] = this._dataViews.get(name)!;\r\n\r\n if (member.type.baseType == BaseType.Float16) {\r\n for (let i = 0; i < values.length; ++i) {\r\n target[i] = float32ToFloat16(values[i]);\r\n }\r\n } else {\r\n for (let i = 0; i < values.length; ++i) {\r\n target[i] = values[i];\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the values for a matrix field.\r\n * @param name Name of the matrix field.\r\n * @param values Array of values to set. The values are expected to be in column-major order.\r\n */\r\n setMatrix(name: string, values: number[] | IndexedCollection): this {\r\n const [ member, target ] = this._dataViews.get(name)!;\r\n\r\n const numCols = member.type.numCols;\r\n const numRows = member.type.numRows;\r\n const skipW = numRows === 3;\r\n\r\n // I know looping inside the cases looks ugly and the loops are tiny, but I just can't bring myself to put\r\n // a switch in a loop\r\n let i = 0;\r\n if (member.type.baseType === BaseType.Float16) {\r\n for (let col = 0; col < numCols; ++col) {\r\n for (let row = 0; row < numRows; ++row) {\r\n target[i] = float32ToFloat16(values[i]);\r\n ++i;\r\n }\r\n if (skipW) ++i;\r\n }\r\n } else {\r\n for (let col = 0; col < numCols; ++col) {\r\n for (let row = 0; row < numRows; ++row) {\r\n target[i] = values[i];\r\n ++i;\r\n }\r\n if (skipW) ++i;\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Upload the current buffer contents to the GPU.\r\n */\r\n upload(): this {\r\n this._buffer._uploadData(this._ctx);\r\n return this;\r\n }\r\n\r\n /**\r\n * Internal accessor returning the underlying Buffer wrapper.\r\n * @internal\r\n */\r\n _getBufferResource(): GPUBindingResource {\r\n return { buffer: this._buffer._inner };\r\n }\r\n}","import {ColorSpace, TextureFormat} from \"./enums\";\r\n\r\n/**\r\n * Options for initializing WebGPU context\r\n */\r\nexport interface WebGPUContextOptions {\r\n /** The canvas element to render to */\r\n canvas?: HTMLCanvasElement;\r\n /** Power preference for adapter selection */\r\n powerPreference?: GPUPowerPreference;\r\n /** Required features for the device */\r\n requiredFeatures?: GPUFeatureName[];\r\n /** Required limits for the device */\r\n requiredLimits?: Record<string, number>;\r\n colorSpace?: ColorSpace;\r\n}\r\n\r\n/**\r\n * Manages WebGPU adapter, device, and context initialization\r\n */\r\nexport class WebGPUContext {\r\n private _adapter: GPUAdapter | null = null;\r\n private _device: GPUDevice | null = null;\r\n private _context: GPUCanvasContext | null = null;\r\n private _format: TextureFormat = TextureFormat.Rgba8UnormSrgb;\r\n private _canvas: HTMLCanvasElement | null = null;\r\n private _colorSpace: ColorSpace = ColorSpace.sRGB;\r\n\r\n /**\r\n * Gets the WebGPU adapter. Throws if not initialized.\r\n */\r\n get adapter(): GPUAdapter {\r\n return this._adapter!;\r\n }\r\n\r\n /**\r\n * Gets the WebGPU device. Throws if not initialized.\r\n */\r\n get device(): GPUDevice {\r\n return this._device!;\r\n }\r\n\r\n /**\r\n * Gets the GPU canvas context. Throws if no canvas was configured.\r\n */\r\n get context(): GPUCanvasContext {\r\n return this._context!;\r\n }\r\n\r\n /**\r\n * Gets the preferred texture format used by the configured canvas/context.\r\n */\r\n get format(): TextureFormat {\r\n return this._format;\r\n }\r\n\r\n /**\r\n * Gets the color space used by the configured canvas/context.\r\n */\r\n get colorSpace(): ColorSpace\r\n {\r\n return this._colorSpace;\r\n }\r\n\r\n /**\r\n * Gets the configured canvas element. Throws if none was provided during initialization.\r\n */\r\n get canvas(): HTMLCanvasElement {\r\n return this._canvas!;\r\n }\r\n\r\n /**\r\n * Checks if WebGPU is supported in the current environment.\r\n */\r\n static isSupported(): boolean {\r\n return typeof navigator !== 'undefined' && 'gpu' in navigator;\r\n }\r\n\r\n /**\r\n * Initializes the WebGPU context and device.\r\n * @param options - Configuration options such as canvas and adapter preferences\r\n * @throws Error if WebGPU is not supported or initialization fails\r\n */\r\n async initialize(options: WebGPUContextOptions = {}) {\r\n if (!WebGPUContext.isSupported()) {\r\n throw new Error('WebGPU is not supported in this browser');\r\n }\r\n\r\n // Request adapter\r\n this._adapter = await navigator.gpu.requestAdapter({\r\n powerPreference: options.powerPreference ?? 'high-performance',\r\n });\r\n\r\n if (!this._adapter) {\r\n throw new Error('Failed to get WebGPU adapter');\r\n }\r\n\r\n // Request device\r\n this._device = await this._adapter.requestDevice({\r\n requiredFeatures: options.requiredFeatures,\r\n requiredLimits: options.requiredLimits,\r\n });\r\n\r\n if (!this._device) {\r\n throw new Error('Failed to get WebGPU device');\r\n }\r\n\r\n // Setup error handling\r\n this._device.lost.then((info: GPUDeviceLostInfo) => {\r\n console.error('WebGPU device lost:', info.message);\r\n if (info.reason !== 'destroyed') {\r\n // Attempt to reinitialize\r\n this.initialize(options).catch((error) => {\r\n console.error('Failed to reinitialize WebGPU context:', error);\r\n });\r\n }\r\n });\r\n\r\n // Configure canvas context if provided\r\n if (options.canvas) {\r\n this._canvas = options.canvas;\r\n this._context = this._canvas.getContext(\"webgpu\") as GPUCanvasContext;\r\n\r\n if (!this._context) {\r\n throw new Error(\"Failed to get WebGPU context from canvas\");\r\n }\r\n\r\n const canUseP3 = window.matchMedia(\"(color-gamut: p3)\").matches;\r\n this._colorSpace = options.colorSpace ?? ColorSpace.sRGB;\r\n if (this._colorSpace === ColorSpace.DisplayP3 && !canUseP3) {\r\n this._colorSpace = ColorSpace.sRGB;\r\n console.warn(\"DisplayP3 not supported, falling back to sRGB\");\r\n }\r\n\r\n this._format = navigator.gpu.getPreferredCanvasFormat() as TextureFormat;\r\n this._context.configure({\r\n device: this._device,\r\n format: this._format,\r\n colorSpace: this._colorSpace,\r\n alphaMode: \"premultiplied\",\r\n });\r\n }\r\n else {\r\n console.warn(\"No canvas provided!\");\r\n }\r\n }\r\n\r\n /**\r\n * Internal helper to fetch the current swapchain texture.\r\n * @internal\r\n */\r\n getCurrentTexture(): GPUTexture {\r\n return this._context!.getCurrentTexture();\r\n }\r\n\r\n /**\r\n * Destroys the WebGPU context and releases resources\r\n */\r\n destroy(): void {\r\n if (this._device) {\r\n this._device.destroy();\r\n this._device = null;\r\n }\r\n this._adapter = null;\r\n this._context = null;\r\n this._canvas = null;\r\n }\r\n}\r\n","/**\r\n * Maps undefined values to undefined and non-undefined values to the result of fn. Similar to Rust's `Option<T>::map`.\r\n * @param value The value to map.\r\n * @param fn The mapping function.\r\n */\r\nexport function mapUndefined<T, U>(value: T | undefined, fn: (val: T) => U): U | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n return fn(value);\r\n}","import {RenderTarget} from \"./RenderTarget\";\r\nimport {RenderPipeline} from \"./RenderPipeline\";\r\nimport {Mesh} from \"./Mesh\";\r\nimport {BindGroup} from \"./BindGroup\";\r\nimport {IndexedCollection} from \"./utils/IndexedCollection\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\nimport {TextureFormat} from \"./enums\";\r\n\r\n/**\r\n * Lightweight wrapper around GPURenderPassEncoder. Provides a minimal API\r\n * for ending the pass; higher-level helpers may be added later.\r\n */\r\nexport class RenderPass {\r\n private readonly _inner: GPURenderPassEncoder;\r\n private _renderPipeline?: RenderPipeline;\r\n private _numVertices: number = 0;\r\n private _numIndices: number = 0;\r\n\r\n /**\r\n * Internal accessor for the underlying GPURenderPassEncoder. Not intended for public use.\r\n * @internal\r\n */\r\n constructor(inner: GPURenderPassEncoder) {\r\n this._inner = inner;\r\n }\r\n\r\n /**\r\n * Set the render pipeline to use for the next draw calls.\r\n * @param pipeline\r\n */\r\n setPipeline(pipeline: RenderPipeline): this {\r\n if (this._renderPipeline != pipeline) {\r\n this._inner.setPipeline(pipeline._inner);\r\n this._renderPipeline = pipeline;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh to use for the next draw calls.\r\n * @param mesh\r\n */\r\n setMesh(mesh: Mesh): this {\r\n for (let i = 0; i < mesh.numStreams; ++i) {\r\n const vertex_buffer = mesh.getVertexBuffer(i);\r\n this._inner.setVertexBuffer(i, vertex_buffer._inner);\r\n }\r\n\r\n this._numVertices = mesh.numVertices;\r\n\r\n const indexBuffer = mesh.indexBuffer;\r\n if (indexBuffer) {\r\n this._inner.setIndexBuffer(indexBuffer._inner, mesh.indexFormat);\r\n this._numIndices = mesh.numIndices;\r\n } else {\r\n this._numIndices = 0;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a bind group at the given index.\r\n * @param index - bind group index in the render pipeline layout\r\n * @param bindGroup - a `BindGroup` instance\r\n */\r\n setBindGroup(index: number, bindGroup: BindGroup): this {\r\n this._inner.setBindGroup(index, bindGroup._inner);\r\n return this;\r\n }\r\n\r\n /**\r\n * Issue a draw call using the currently set pipeline and mesh.\r\n */\r\n draw(): this {\r\n if (this._numIndices) {\r\n this._inner.drawIndexed(this._numIndices, 1, 0, 0, 0);\r\n } else {\r\n this._inner.draw(this._numVertices, 1, 0, 0);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * End the render pass. After calling end(), the underlying encoder may\r\n * continue recording other passes or be finished/submitted.\r\n */\r\n end() {\r\n this._inner.end();\r\n }\r\n}\r\n\r\n/**\r\n * Fluent builder for configuring and creating a render pass.\r\n *\r\n * Use the builder to specify color targets, clear values and labels before\r\n * calling `build()` to obtain a `RenderPass` instance.\r\n */\r\nexport class RenderPassBuilder {\r\n private _encoder: GPUCommandEncoder;\r\n private _label?: string;\r\n private _colorTargets: RenderTarget[] = [];\r\n private _clearColors: number[][] = [];\r\n private _defaultTarget: RenderTarget;\r\n private _defaultDepthTarget?: RenderTarget;\r\n private _depthTarget?: RenderTarget;\r\n private _clearDepth?: number;\r\n private _clearStencil?: number;\r\n private _globalBindGroups: BindGroup[];\r\n\r\n /**\r\n * Create a new builder instance. This should only be called from the CommandEncoder\r\n * instance (see {@link CommandEncoder.createRenderPass}).\r\n * @internal\r\n */\r\n constructor(commandEncoder: GPUCommandEncoder, globalBindGroups: BindGroup[], defaultTarget: RenderTarget, defaultDepthTarget?: RenderTarget) {\r\n this._encoder = commandEncoder;\r\n this._defaultTarget = defaultTarget;\r\n this._defaultDepthTarget = defaultDepthTarget;\r\n this._globalBindGroups = globalBindGroups;\r\n }\r\n\r\n /**\r\n * Assign a human-readable label for the render pass (useful for GPU debuggers).\r\n */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a color target to render into. If no targets are added the default\r\n * backbuffer target will be used.\r\n */\r\n withColorTarget(target: RenderTarget): this {\r\n this._colorTargets.push(target);\r\n return this;\r\n }\r\n\r\n withDepthStencilTarget(target: RenderTarget): this {\r\n this._depthTarget = target;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the clear color for the most recently added color target.\r\n * Overloads allow passing an array or individual color components.\r\n */\r\n withClearColor(): this;\r\n withClearColor(r: number[] | IndexedCollection): this;\r\n withClearColor(r: number, g: number, b: number): this;\r\n withClearColor(r: number, g: number, b: number, a: number): this;\r\n withClearColor(r?: number | number[] | IndexedCollection, g?: number, b?: number, a?: number): this {\r\n let color;\r\n if (r === undefined) {\r\n color = [0.0, 0.0, 0.0, 1.0];\r\n } else if (typeof r === 'number') {\r\n color = [r, g ?? 0.0, b ?? 0.0, a ?? 1.0];\r\n } else {\r\n color = [r[0], r[1], r[2], r[3] ?? 1.0];\r\n }\r\n\r\n // rendering to the default target is special cased, so we need to set the clear color for the last target\r\n if (this._colorTargets.length === 0) {\r\n this._clearColors[0] = color;\r\n } else {\r\n this._clearColors[this._colorTargets.length - 1] = color;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the clear stencil value\r\n */\r\n withClearStencil(stencil: number): this {\r\n this._clearStencil = stencil;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the clear depth value\r\n */\r\n withClearDepth(depth: number): this {\r\n this._clearDepth = depth;\r\n return this;\r\n }\r\n\r\n /**\r\n * Build and begin the render pass. Returns a `RenderPass` wrapper around\r\n * the low-level GPURenderPassEncoder.\r\n */\r\n build(): RenderPass {\r\n let targets: RenderTarget[];\r\n let depthTarget: RenderTarget | undefined;\r\n\r\n // if anything was specified specifically, use those, otherwise use the defaults\r\n if (this._colorTargets.length || !!this._depthTarget) {\r\n targets = this._colorTargets;\r\n depthTarget = this._depthTarget;\r\n } else {\r\n targets = [this._defaultTarget];\r\n depthTarget = this._defaultDepthTarget;\r\n }\r\n\r\n let stencilLoadOp: GPULoadOp | undefined;\r\n let stencilStoreOp: GPUStoreOp | undefined;\r\n let stencilClearValue: number | undefined;\r\n\r\n if (depthTarget?.format === TextureFormat.Depth32FloatStencil8 || depthTarget?.format === TextureFormat.Depth24PlusStencil8) {\r\n stencilLoadOp = this._clearStencil != undefined ? 'clear' : 'load';\r\n stencilStoreOp = mapUndefined(this._clearStencil, () => 'store');\r\n stencilClearValue = this._clearStencil;\r\n }\r\n\r\n const colorAttachments: GPURenderPassColorAttachment[] = targets.map((target, i) => ({\r\n view: target._inner,\r\n loadOp: this._clearColors[i] ? 'clear' : 'load',\r\n storeOp: 'store',\r\n clearValue: this._clearColors[i]\r\n }));\r\n\r\n const desc: GPURenderPassDescriptor = {\r\n colorAttachments,\r\n depthStencilAttachment: mapUndefined(depthTarget, target => ({\r\n view: target._inner,\r\n depthClearValue: this._clearDepth,\r\n depthLoadOp: this._clearDepth != undefined ? 'clear' : 'load',\r\n depthStoreOp: mapUndefined(this._clearDepth, () => 'store'),\r\n stencilClearValue,\r\n stencilLoadOp,\r\n stencilStoreOp\r\n\r\n })),\r\n label: this._label\r\n };\r\n\r\n const pass = new RenderPass(this._encoder.beginRenderPass(desc));\r\n this._globalBindGroups.forEach((group, i) => pass.setBindGroup(i, group));\r\n return pass;\r\n }\r\n}\r\n","import {BindGroup} from \"./BindGroup\";\r\nimport {ComputePipeline} from \"./ComputePipeline\";\r\nimport {Buffer} from \"./buffers/Buffer\";\r\n\r\nexport class ComputePass\r\n{\r\n private readonly _inner: GPUComputePassEncoder;\r\n\r\n constructor(inner: GPUComputePassEncoder) {\r\n this._inner = inner;\r\n\r\n }\r\n\r\n /**\r\n * Set the compute pipeline to use for the next dispatch calls.\r\n * @param pipeline\r\n */\r\n setPipeline(pipeline: ComputePipeline): this {\r\n this._inner.setPipeline(pipeline._inner);\r\n return this;\r\n }\r\n\r\n dispatch(x: GPUSize32, y?: GPUSize32, z?: GPUSize32): this\r\n {\r\n this._inner.dispatchWorkgroups(x, y, z)\r\n return this;\r\n }\r\n\r\n dispatchIndirect(buffer: Buffer, offset: number): this\r\n {\r\n this._inner.dispatchWorkgroupsIndirect(buffer._inner, offset);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a bind group at the given index.\r\n * @param index - bind group index in the render pipeline layout\r\n * @param bindGroup - a `BindGroup` instance\r\n */\r\n setBindGroup(index: number, bindGroup: BindGroup): this\r\n {\r\n this._inner.setBindGroup(index, bindGroup._inner);\r\n return this;\r\n }\r\n\r\n /**\r\n * End the compute pass. After calling end(), the underlying encoder may\r\n * continue recording other passes or be finished/submitted.\r\n */\r\n end() {\r\n this._inner.end();\r\n }\r\n}\r\n\r\nexport class ComputePassBuilder\r\n{\r\n private _label?: string;\r\n private _encoder: GPUCommandEncoder;\r\n private _globalBindGroups: BindGroup[];\r\n\r\n constructor(encoder: GPUCommandEncoder, globalBindGroups: BindGroup[]) {\r\n this._encoder = encoder;\r\n this._globalBindGroups = globalBindGroups;\r\n }\r\n\r\n /**\r\n * Assign a human-readable label for the render pass (useful for GPU debuggers).\r\n */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n build(): ComputePass {\r\n const desc: GPUComputePassDescriptor = {\r\n label: this._label\r\n };\r\n\r\n const pass = new ComputePass(this._encoder.beginComputePass(desc));\r\n for (let i = 0; i < this._globalBindGroups.length; ++i) {\r\n pass.setBindGroup(i, this._globalBindGroups[i]);\r\n }\r\n return pass;\r\n }\r\n}","import {WebGPUContext} from \"./WebGPUContext\";\r\nimport {RenderPassBuilder} from \"./RenderPass\";\r\nimport {RenderTarget} from \"./RenderTarget\";\r\nimport {ComputePassBuilder} from \"./ComputePass\";\r\nimport {BindGroup} from \"./BindGroup\";\r\nimport {Buffer} from \"./buffers/Buffer\";\r\n\r\n/**\r\n * Encapsulates a GPUCommandEncoder and provides helper methods to build and\r\n * submit GPU commands for a single frame. CommandEncoder should only be created\r\n * through the TinyHelix instance (See {@link TinyHelix.createCommandEncoder})\r\n */\r\nexport class CommandEncoder {\r\n private _encoder: GPUCommandEncoder;\r\n private _queue: GPUQueue;\r\n private _backbufferTarget: RenderTarget;\r\n private _commandBuffer: GPUCommandBuffer | null = null;\r\n private _depthStencilTarget: RenderTarget | undefined;\r\n private _globalBindGroups: BindGroup[];\r\n\r\n /**\r\n * Create a new CommandEncoder bound to a backbuffer/render target and\r\n * the WebGPU context.\r\n *\r\n * @internal\r\n */\r\n constructor(backbufferTarget: RenderTarget, globalBindGroups: BindGroup[], ctx: WebGPUContext, depthStencilTarget?: RenderTarget, label?: string) {\r\n const device = ctx.device;\r\n this._queue = device.queue;\r\n this._backbufferTarget = backbufferTarget;\r\n this._depthStencilTarget = depthStencilTarget;\r\n this._globalBindGroups = globalBindGroups;\r\n this._encoder = device.createCommandEncoder({label});\r\n }\r\n\r\n /**\r\n * Clears a buffer's contents\r\n */\r\n clearBuffer(buffer: Buffer, offset?: number, size?: number): this\r\n {\r\n this._encoder.clearBuffer(buffer._inner, offset, size);\r\n return this;\r\n }\r\n\r\n /**\r\n * Begin building a render pass attached to this encoder.\r\n * Returns a fluent RenderPassBuilder used to configure attachments and clear ops.\r\n */\r\n createRenderPass(): RenderPassBuilder {\r\n return new RenderPassBuilder(this._encoder, this._globalBindGroups, this._backbufferTarget, this._depthStencilTarget);\r\n }\r\n\r\n /**\r\n * Begin building a compute pass attached to this encoder.\r\n * Returns a fluent ComputePassBuilder used to configure bindings and dispatch ops.\r\n */\r\n createComputePass(): ComputePassBuilder {\r\n return new ComputePassBuilder(this._encoder, this._globalBindGroups);\r\n }\r\n\r\n /**\r\n * Mark the encoder as finished and finalize any pending commands.\r\n * Calling finish() multiple times is safe but a no-op after the first call.\r\n */\r\n finish() {\r\n if (!this._commandBuffer) {\r\n this._commandBuffer = this._encoder.finish();\r\n }\r\n }\r\n\r\n /**\r\n * Submit the recorded commands to the GPU queue. If the encoder has not\r\n * been finished yet, finish() will be called automatically.\r\n */\r\n submit() {\r\n this.finish();\r\n this._queue.submit([this._commandBuffer!]);\r\n }\r\n}","import {WebGPUContext} from \"./WebGPUContext\";\r\nimport {TextureFormat} from \"./enums\";\r\nimport {IBuffer} from \"./buffers/IBuffer\";\r\nimport {TextureUsage} from \"./buffers/Buffer\";\r\n\r\n/**\r\n * Small wrapper around GPUTexture providing convenience constructors and\r\n * an internal accessor for low-level interop.\r\n */\r\nexport class Texture implements IBuffer {\r\n /** @internal */\r\n readonly _inner: GPUTexture;\r\n private _format: TextureFormat;\r\n\r\n /**\r\n * Create a Texture wrapper from an existing GPUTexture.\r\n * @param texture - The underlying GPUTexture\r\n */\r\n static from_webgpu(texture: GPUTexture, format: TextureFormat): Texture {\r\n return new Texture(texture, format);\r\n }\r\n\r\n constructor(inner: GPUTexture, format: TextureFormat) {\r\n this._inner = inner;\r\n this._format = format;\r\n }\r\n\r\n createView(): TextureViewBuilder {\r\n return new TextureViewBuilder(this);\r\n }\r\n\r\n get format(): TextureFormat {\r\n return this._format;\r\n }\r\n\r\n _getBufferResource(): GPUBindingResource {\r\n return this._inner.createView();\r\n }\r\n}\r\n\r\nexport class TextureBuilder {\r\n private _ctx: WebGPUContext;\r\n private _size: [number, number, number] = [1, 1, 1];\r\n private _data: ImageBitmap | GPUAllowSharedBufferSource | undefined = undefined;\r\n private _format: TextureFormat = TextureFormat.Rgba8UnormSrgb;\r\n private _usage: GPUTextureUsageFlags = GPUTextureUsage.TEXTURE_BINDING;\r\n\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n withSize(width: number, height: number, depthOrArrayLayers: number = 1): this {\r\n this._size = [width, height, depthOrArrayLayers];\r\n return this;\r\n }\r\n\r\n withData(data: GPUAllowSharedBufferSource): this {\r\n this._data = data;\r\n return this;\r\n }\r\n\r\n withFormat(format: TextureFormat): this {\r\n this._format = format;\r\n return this;\r\n }\r\n\r\n withImage(data: ImageBitmap): this {\r\n this._data = data;\r\n this._size = [data.width, data.height, 1];\r\n return this;\r\n }\r\n\r\n withUsage(usage: TextureUsage): this {\r\n this._usage |= usage;\r\n return this;\r\n }\r\n\r\n build(): Texture {\r\n if (this._data) {\r\n this._usage |= GPUTextureUsage.COPY_DST;\r\n }\r\n const inner = this._ctx.device.createTexture({\r\n format: this._format, size: this._size, usage: this._usage\r\n })\r\n if (this._data instanceof ImageBitmap) {\r\n this._ctx.device.queue.copyExternalImageToTexture({source: this._data!}, {texture: inner}, [this._size[0], this._size[1], 1]);\r\n } else if (this._data) {\r\n const [width, height, depthOrArrayLayers] = this._size;\r\n const blockWidth = getBlockWidth(this._format);\r\n const blocksPerRow = Math.ceil(width / blockWidth);\r\n const bytesPerRow = blocksPerRow * bytesPerBlock(this._format);\r\n this._ctx.device.queue.writeTexture(\r\n {texture: inner},\r\n this._data,\r\n {bytesPerRow},\r\n {width, height, depthOrArrayLayers}\r\n );\r\n }\r\n return new Texture(inner, this._format);\r\n }\r\n}\r\n\r\nexport class TextureView\r\n{\r\n /** @internal */\r\n _inner: GPUTextureView;\r\n\r\n constructor(inner: GPUTextureView) {\r\n this._inner = inner;\r\n }\r\n}\r\n\r\nexport class TextureViewBuilder {\r\n private _texture: Texture;\r\n private _desc: GPUTextureViewDescriptor = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(texture: Texture) {\r\n this._texture = texture;\r\n }\r\n\r\n withSingleMip(level: number): this\r\n {\r\n this._desc.baseMipLevel = level;\r\n this._desc.mipLevelCount = 1;\r\n return this;\r\n }\r\n\r\n withMipRange(start: number, end: number): this\r\n {\r\n this._desc.baseMipLevel = start;\r\n this._desc.mipLevelCount = end - start;\r\n return this;\r\n }\r\n\r\n withSingleLayer(layer: number): this\r\n {\r\n this._desc.baseArrayLayer = layer;\r\n this._desc.arrayLayerCount = 1;\r\n return this;\r\n }\r\n\r\n withLayerRange(start: number, end: number): this\r\n {\r\n this._desc.baseArrayLayer = start;\r\n this._desc.arrayLayerCount = end;\r\n return this;\r\n }\r\n\r\n build(): TextureView\r\n {\r\n return new TextureView(this._texture._inner.createView(this._desc));\r\n }\r\n}\r\n\r\nfunction isBc(format: GPUTextureFormat): boolean {\r\n switch (format) {\r\n case TextureFormat.Bc1RgbaUnorm:\r\n case TextureFormat.Bc1RgbaUnormSrgb:\r\n case TextureFormat.Bc2RgbaUnorm:\r\n case TextureFormat.Bc2RgbaUnormSrgb:\r\n case TextureFormat.Bc3RgbaUnorm:\r\n case TextureFormat.Bc3RgbaUnormSrgb:\r\n case TextureFormat.Bc4RUnorm:\r\n case TextureFormat.Bc4RSnorm:\r\n case TextureFormat.Bc5RgUnorm:\r\n case TextureFormat.Bc5RgSnorm:\r\n case TextureFormat.Bc6hRgbUfloat:\r\n case TextureFormat.Bc6hRgbFloat:\r\n case TextureFormat.Bc7RgbaUnorm:\r\n case TextureFormat.Bc7RgbaUnormSrgb:\r\n return true;\r\n default: return false;\r\n }\r\n}\r\n\r\nfunction isEtc(format: GPUTextureFormat): boolean {\r\n switch (format) {\r\n case TextureFormat.Etc2Rgb8Unorm:\r\n case TextureFormat.Etc2Rgb8UnormSrgb:\r\n case TextureFormat.Etc2Rgb8A1Unorm:\r\n case TextureFormat.Etc2Rgb8A1UnormSrgb:\r\n case TextureFormat.Etc2Rgba8Unorm:\r\n case TextureFormat.Etc2Rgba8UnormSrgb:\r\n case TextureFormat.EacR11Unorm:\r\n case TextureFormat.EacR11Snorm:\r\n case TextureFormat.EacRg11Unorm:\r\n case TextureFormat.EacRg11Snorm:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nfunction getBlockWidth(format: GPUTextureFormat): number {\r\n if (isBc(format) || isEtc(format)) return 4;\r\n\r\n switch (format) {\r\n case TextureFormat.Astc4x4Unorm:\r\n case TextureFormat.Astc4x4UnormSrgb:\r\n return 4;\r\n case TextureFormat.Astc5x4Unorm:\r\n case TextureFormat.Astc5x4UnormSrgb:\r\n case TextureFormat.Astc5x5Unorm:\r\n case TextureFormat.Astc5x5UnormSrgb:\r\n return 5;\r\n case TextureFormat.Astc6x5Unorm:\r\n case TextureFormat.Astc6x5UnormSrgb:\r\n case TextureFormat.Astc6x6Unorm:\r\n case TextureFormat.Astc6x6UnormSrgb:\r\n return 6;\r\n case TextureFormat.Astc8x5Unorm:\r\n case TextureFormat.Astc8x5UnormSrgb:\r\n case TextureFormat.Astc8x6Unorm:\r\n case TextureFormat.Astc8x6UnormSrgb:\r\n case TextureFormat.Astc8x8Unorm:\r\n case TextureFormat.Astc8x8UnormSrgb:\r\n return 8;\r\n case TextureFormat.Astc10x5Unorm:\r\n case TextureFormat.Astc10x5UnormSrgb:\r\n case TextureFormat.Astc10x6Unorm:\r\n case TextureFormat.Astc10x6UnormSrgb:\r\n case TextureFormat.Astc10x8Unorm:\r\n case TextureFormat.Astc10x8UnormSrgb:\r\n case TextureFormat.Astc10x10Unorm:\r\n case TextureFormat.Astc10x10UnormSrgb:\r\n return 10;\r\n case TextureFormat.Astc12x10Unorm:\r\n case TextureFormat.Astc12x10UnormSrgb:\r\n case TextureFormat.Astc12x12Unorm:\r\n case TextureFormat.Astc12x12UnormSrgb:\r\n return 12;\r\n default:\r\n return 1;\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of bytes in a compressed or uncompressed block for the\r\n * given texture format. Matches the mapping from the Rust implementation and\r\n * throws for unsupported formats.\r\n */\r\nfunction bytesPerBlock(format: GPUTextureFormat): number {\r\n switch (format) {\r\n // 1-byte formats\r\n case TextureFormat.R8Unorm:\r\n case TextureFormat.R8Snorm:\r\n case TextureFormat.R8Uint:\r\n case TextureFormat.R8Sint:\r\n case TextureFormat.Stencil8:\r\n return 1;\r\n\r\n // 2-byte formats\r\n case TextureFormat.R16Uint:\r\n case TextureFormat.R16Sint:\r\n case TextureFormat.R16Unorm:\r\n case TextureFormat.R16Snorm:\r\n case TextureFormat.R16Float:\r\n case TextureFormat.RG8Unorm:\r\n case TextureFormat.RG8Snorm:\r\n case TextureFormat.RG8Uint:\r\n case TextureFormat.RG8Sint:\r\n case TextureFormat.Depth16Unorm:\r\n return 2;\r\n\r\n // 4-byte formats\r\n case TextureFormat.R32Uint:\r\n case TextureFormat.R32Sint:\r\n case TextureFormat.R32Float:\r\n case TextureFormat.RG16Uint:\r\n case TextureFormat.RG16Sint:\r\n case TextureFormat.RG16Unorm:\r\n case TextureFormat.RG16Snorm:\r\n case TextureFormat.RG16Float:\r\n case TextureFormat.Rgba8Unorm:\r\n case TextureFormat.Rgba8UnormSrgb:\r\n case TextureFormat.Rgba8Snorm:\r\n case TextureFormat.Rgba8Uint:\r\n case TextureFormat.Rgba8Sint:\r\n case TextureFormat.Bgra8Unorm:\r\n case TextureFormat.Bgra8UnormSrgb:\r\n case TextureFormat.Rgb9e5Ufloat:\r\n case TextureFormat.Rgb10a2Uint:\r\n case TextureFormat.Rgb10a2Unorm:\r\n case TextureFormat.Depth24Plus:\r\n case TextureFormat.Depth24PlusStencil8:\r\n case TextureFormat.Depth32Float:\r\n return 4;\r\n\r\n // 8-byte formats\r\n case TextureFormat.Rg11b10Ufloat:\r\n case TextureFormat.RG32Uint:\r\n case TextureFormat.RG32Sint:\r\n case TextureFormat.RG32Float:\r\n case TextureFormat.Rgba16Uint:\r\n case TextureFormat.Rgba16Sint:\r\n case TextureFormat.Rgba16Unorm:\r\n case TextureFormat.Rgba16Snorm:\r\n case TextureFormat.Rgba16Float:\r\n case TextureFormat.Depth32FloatStencil8:\r\n case TextureFormat.Bc1RgbaUnorm:\r\n case TextureFormat.Bc1RgbaUnormSrgb:\r\n case TextureFormat.Bc4RUnorm:\r\n case TextureFormat.Bc4RSnorm:\r\n case TextureFormat.Etc2Rgb8Unorm:\r\n case TextureFormat.Etc2Rgb8UnormSrgb:\r\n case TextureFormat.Etc2Rgb8A1Unorm:\r\n case TextureFormat.Etc2Rgb8A1UnormSrgb:\r\n case TextureFormat.EacR11Unorm:\r\n case TextureFormat.EacR11Snorm:\r\n return 8;\r\n\r\n // 16-byte formats\r\n case TextureFormat.Rgba32Uint:\r\n case TextureFormat.Rgba32Sint:\r\n case TextureFormat.Rgba32Float:\r\n case TextureFormat.Bc2RgbaUnorm:\r\n case TextureFormat.Bc2RgbaUnormSrgb:\r\n case TextureFormat.Bc3RgbaUnorm:\r\n case TextureFormat.Bc3RgbaUnormSrgb:\r\n case TextureFormat.Bc5RgUnorm:\r\n case TextureFormat.Bc5RgSnorm:\r\n case TextureFormat.Bc6hRgbUfloat:\r\n case TextureFormat.Bc6hRgbFloat:\r\n case TextureFormat.Bc7RgbaUnorm:\r\n case TextureFormat.Bc7RgbaUnormSrgb:\r\n case TextureFormat.Etc2Rgba8Unorm:\r\n case TextureFormat.Etc2Rgba8UnormSrgb:\r\n case TextureFormat.EacRg11Unorm:\r\n case TextureFormat.EacRg11Snorm:\r\n case TextureFormat.Astc4x4Unorm:\r\n case TextureFormat.Astc4x4UnormSrgb:\r\n case TextureFormat.Astc5x4Unorm:\r\n case TextureFormat.Astc5x4UnormSrgb:\r\n case TextureFormat.Astc5x5Unorm:\r\n case TextureFormat.Astc5x5UnormSrgb:\r\n case TextureFormat.Astc6x5Unorm:\r\n case TextureFormat.Astc6x5UnormSrgb:\r\n case TextureFormat.Astc6x6Unorm:\r\n case TextureFormat.Astc6x6UnormSrgb:\r\n case TextureFormat.Astc8x5Unorm:\r\n case TextureFormat.Astc8x5UnormSrgb:\r\n case TextureFormat.Astc8x6Unorm:\r\n case TextureFormat.Astc8x6UnormSrgb:\r\n case TextureFormat.Astc8x8Unorm:\r\n case TextureFormat.Astc8x8UnormSrgb:\r\n case TextureFormat.Astc10x5Unorm:\r\n case TextureFormat.Astc10x5UnormSrgb:\r\n case TextureFormat.Astc10x6Unorm:\r\n case TextureFormat.Astc10x6UnormSrgb:\r\n case TextureFormat.Astc10x8Unorm:\r\n case TextureFormat.Astc10x8UnormSrgb:\r\n case TextureFormat.Astc10x10Unorm:\r\n case TextureFormat.Astc10x10UnormSrgb:\r\n case TextureFormat.Astc12x10Unorm:\r\n case TextureFormat.Astc12x10UnormSrgb:\r\n case TextureFormat.Astc12x12Unorm:\r\n case TextureFormat.Astc12x12UnormSrgb:\r\n case TextureFormat.Bc2RgbaUnorm:\r\n // NOTE: Bc2RgbaUnorm is already listed above; duplicate entries are\r\n // harmless but kept out of caution when mapping from Rust.\r\n return 16;\r\n\r\n default:\r\n throw new Error(`Unsupported texture format: ${format}`);\r\n }\r\n}\r\n","import {Texture} from \"./Texture\";\r\nimport {TextureFormat} from \"./enums\";\r\n\r\n/**\r\n * Lightweight wrapper around a GPUTextureView representing a render target.\r\n * Use `view()` to get the underlying GPUTextureView when building render passes.\r\n */\r\nexport class RenderTarget {\r\n readonly _inner: GPUTextureView;\r\n private _format: TextureFormat;\r\n\r\n constructor(view: GPUTextureView, format: TextureFormat) {\r\n this._inner = view;\r\n this._format = format;\r\n }\r\n\r\n get format(): TextureFormat\r\n {\r\n return this._format;\r\n }\r\n}\r\n\r\n/**\r\n * Builder for creating a `RenderTarget` from a `Texture`.\r\n *\r\n * The builder produces a GPUTextureView configured with a sensible default\r\n * descriptor and wraps it in a `RenderTarget` helper.\r\n */\r\nexport class RenderTargetBuilder {\r\n private _texture: Texture;\r\n private _baseMipLevel = 0;\r\n private _baseArrayLayer = 0;\r\n\r\n /**\r\n * Create a new RenderTargetBuilder for the given texture. This should only be called\r\n * from the TinyHelix instance (see {@link TinyHelix.createRenderTarget}).\r\n * @param texture\r\n *\r\n * @internal\r\n */\r\n constructor(texture: Texture) {\r\n this._texture = texture;\r\n }\r\n\r\n /**\r\n * Set the base mip level to use for the render target. Defaults to 0.\r\n */\r\n withMipLevel(level: number): this {\r\n this._baseMipLevel = level;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the base array layer to use for the render target. Defaults to 0.\r\n */\r\n withArrayLayer(layer: number): this {\r\n this._baseArrayLayer = layer;\r\n return this;\r\n }\r\n\r\n /**\r\n * Create and return a new `RenderTarget` instance.\r\n */\r\n build(): RenderTarget {\r\n const tex = this._texture._inner;\r\n const desc: GPUTextureViewDescriptor = {\r\n format: tex.format,\r\n dimension: tex.dimension,\r\n aspect: 'all',\r\n baseMipLevel: this._baseMipLevel,\r\n mipLevelCount: 1,\r\n baseArrayLayer: this._baseArrayLayer,\r\n arrayLayerCount: 1\r\n }\r\n return new RenderTarget(this._texture._inner.createView(desc), this._texture.format);\r\n }\r\n}\r\n","/**\r\n * Pad an ArrayBuffer (or SharedArrayBuffer) to the given alignment in bytes.\r\n * If the input is already aligned, the original buffer is returned. Otherwise a\r\n * new buffer is allocated, the contents copied, and the new buffer returned.\r\n *\r\n * @param input - The input ArrayBuffer or SharedArrayBuffer to pad\r\n * @param alignment - Desired byte alignment (e.g. 4 for 32-bit alignment)\r\n * @returns A buffer with byteLength rounded up to the nearest multiple of alignment\r\n */\r\nexport function padArrayBuffer(input: ArrayBuffer | SharedArrayBuffer, alignment: number): ArrayBuffer | SharedArrayBuffer {\r\n const targetSize = Math.ceil(input.byteLength / alignment) * alignment;\r\n if (targetSize === input.byteLength) return input;\r\n const data = input instanceof ArrayBuffer ? new ArrayBuffer(targetSize) : new SharedArrayBuffer(targetSize);\r\n const src = new Uint8Array(input);\r\n const dst = new Uint8Array(data);\r\n dst.set(src);\r\n return data;\r\n}","/**\r\n * Convert a JavaScript number (float32) to IEEE 754 binary16 (float16) representation.\r\n * Returns the 16-bit unsigned integer bit pattern for the half-float.\r\n */\r\nexport function float32ToFloat16(value: number): number {\r\n // This is a compact implementation adapted for correctness.\r\n const f32 = new Float32Array(1);\r\n f32[0] = value;\r\n const f32u = new Uint32Array(f32.buffer)[0];\r\n\r\n const sign = (f32u >> 16) & 0x8000;\r\n const exponent = ((f32u >> 23) & 0xff) - 127;\r\n const mantissa = f32u & 0x007fffff;\r\n\r\n if (exponent <= -15) {\r\n // Too small to be represented as a normalized half-float -> zero or subnormal\r\n // Round-to-zero behavior\r\n return sign;\r\n }\r\n\r\n if (exponent > 16) {\r\n // Overflow -> return Infinity\r\n return sign | 0x7c00;\r\n }\r\n\r\n const halfExp = exponent + 15;\r\n const halfMant = mantissa >> 13;\r\n return sign | (halfExp << 10) | halfMant;\r\n}","import {WebGPUContext} from \"./WebGPUContext\";\r\nimport {UniformBuffer, UniformBufferLayout} from \"./buffers/UniformBuffer\";\r\nimport {IBuffer} from \"./buffers/IBuffer\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\nimport {Texture, TextureView} from \"./Texture\";\r\nimport {Sampler} from \"./Sampler\";\r\nimport {TextureFormat} from \"../dist\";\r\nimport {StorageAccess} from \"./enums\";\r\n\r\n/**\r\n * Lightweight wrapper around a GPUBindGroup.\r\n * Use {@link TinyHelix.createBindGroup} to create instances.\r\n */\r\nexport class BindGroup {\r\n /** @internal */\r\n readonly _inner: GPUBindGroup;\r\n\r\n /**\r\n * Construct a wrapper around an existing GPUBindGroup.\r\n * @internal\r\n */\r\n constructor(inner: GPUBindGroup) {\r\n this._inner = inner;\r\n }\r\n}\r\n\r\n/**\r\n * Builder for creating GPUBindGroup instances. Supports adding uniform buffer\r\n * entries and a human-readable label.\r\n */\r\nexport class BindGroupBuilder {\r\n private _entries: GPUBindGroupEntry[] = [];\r\n private _label?: string;\r\n private _layout: BindGroupLayout;\r\n private _ctx: WebGPUContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(ctx: WebGPUContext, layout: BindGroupLayout) {\r\n this._ctx = ctx;\r\n this._layout = layout;\r\n }\r\n\r\n /**\r\n * Assign a human-readable label for the bind group (useful in GPU debuggers).\r\n */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /**\r\n * Attach a buffer to the bind group\r\n * @param fieldName\r\n * @param buffer\r\n */\r\n withBuffer(fieldName: string, buffer: IBuffer): this {\r\n const index = this._layout._getBindingIndex(fieldName);\r\n this._entries[index] = {\r\n binding: index, resource: buffer._getBufferResource()\r\n };\r\n return this;\r\n }\r\n\r\n /** Attach a texture to the bind group. */\r\n withTexture(fieldName: string, texture: Texture | TextureView): this {\r\n const index = this._layout._getBindingIndex(fieldName);\r\n this._entries[index] = {\r\n binding: index, resource: texture._inner\r\n };\r\n return this;\r\n }\r\n\r\n /** Attach a sampler to the bind group at the given binding index. */\r\n withSampler(fieldName: string, sampler: Sampler): this {\r\n const index = this._layout._getBindingIndex(fieldName);\r\n this._entries[index] = {\r\n binding: index, resource: sampler._inner\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Create the GPUBindGroup and return a wrapped `BindGroup` instance.\r\n */\r\n build(): BindGroup\r\n {\r\n const inner = this._ctx.device.createBindGroup({\r\n label: this._label,\r\n entries: this._entries,\r\n layout: this._layout._inner\r\n });\r\n return new BindGroup(inner);\r\n }\r\n}\r\n\r\n/**\r\n * Wrapper around a GPUBindGroupLayout that also keeps track of any\r\n * UniformBufferLayout objects associated with the layout. Useful for\r\n * constructing `BindGroupBuilder` instances for specific layouts.\r\n */\r\nexport class BindGroupLayout {\r\n /** @internal */\r\n readonly _inner: GPUBindGroupLayout;\r\n private _uboLayouts: Map<string, UniformBufferLayout>;\r\n private _ctx: WebGPUContext;\r\n private _indices: Map<string, number>;\r\n\r\n constructor(inner: GPUBindGroupLayout, ctx: WebGPUContext, indices: Map<string, number>, uboLayouts: Map<string, UniformBufferLayout>) {\r\n this._inner = inner;\r\n this._indices = indices;\r\n this._uboLayouts = uboLayouts;\r\n this._ctx = ctx;\r\n }\r\n\r\n /**\r\n * Get the UniformBufferLayout associated with a named field (if any).\r\n */\r\n getUniformBufferLayout(name: string): UniformBufferLayout | undefined {\r\n return this._uboLayouts.get(name);\r\n }\r\n\r\n createUniformBuffer(name: string): UniformBuffer | undefined\r\n {\r\n const layout = this._uboLayouts.get(name);\r\n return mapUndefined(layout, layout => new UniformBuffer(layout, this._ctx));\r\n }\r\n\r\n _getBindingIndex(fieldName: string): number\r\n {\r\n const index = this._indices.get(fieldName);\r\n if (index === undefined) {\r\n throw(`No field name found for ${fieldName} in bind group layout.`);\r\n }\r\n return index;\r\n }\r\n}\r\n\r\n/**\r\n * Builder for GPUBindGroupLayout. Currently supports adding uniform buffers\r\n * and their associated layout information.\r\n */\r\nclass BindGroupLayoutBuilder {\r\n private _entries: GPUBindGroupLayoutEntry[] = [];\r\n private _indices: Map<string, number> = new Map();\r\n // TODO: add other buffer/texture types\r\n private _uboLayouts: Map<string, UniformBufferLayout> = new Map();\r\n private _label?: string;\r\n private _ctx: WebGPUContext;\r\n\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n /**\r\n * Assign a label for the bind group layout.\r\n */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a uniform buffer binding at the given index and record its layout.\r\n * @param index - binding index\r\n * @param field_name - a name used to reference the layout later\r\n * @param layout - the UniformBufferLayout describing the UBO\r\n * @param visibility - shader stage visibility flags (defaults to VERTEX|FRAGMENT|COMPUTE)\r\n */\r\n withUniformBuffer(index: number, field_name: string, layout: UniformBufferLayout, visibility?: GPUShaderStageFlags): this {\r\n this._entries[index] = {\r\n binding: index,\r\n visibility: visibility ?? GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE,\r\n buffer: {type: 'uniform'}\r\n };\r\n this._indices.set(field_name, index);\r\n this._uboLayouts.set(field_name, layout);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a storage buffer binding at the given index and record its layout.\r\n * @param index - binding index\r\n * @param field_name - a name used to reference the layout later\r\n * @param access_mode - Defines whether the storage buffer is read-only or not.\r\n * @param visibility - shader stage visibility flags (defaults to FRAGMENT|COMPUTE)\r\n */\r\n withStorageBuffer(index: number, field_name: string, access_mode: StorageAccess, visibility?: GPUShaderStageFlags): this {\r\n let type: GPUBufferBindingType = \"storage\";\r\n\r\n if (access_mode === StorageAccess.Read) {\r\n type = \"read-only-storage\";\r\n }\r\n\r\n this._entries[index] = {\r\n binding: index,\r\n visibility: visibility ?? GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE,\r\n buffer: {type, hasDynamicOffset: false, minBindingSize: 4}\r\n };\r\n this._indices.set(field_name, index);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a storage texture binding at the given index. The texture will be\r\n * write-only and use RGBA8Unorm format.\r\n * @param index\r\n * @param field_name\r\n * @param format\r\n * @param access_mode\r\n * @param visibility\r\n */\r\n withStorageTexture(index: number, field_name: string, format: TextureFormat, access_mode: StorageAccess, visibility?: GPUShaderStageFlags): this {\r\n this._entries[index] = {\r\n binding: index,\r\n visibility: visibility ?? GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE,\r\n storageTexture: {access: access_mode, format}\r\n };\r\n this._indices.set(field_name, index);\r\n return this;\r\n }\r\n\r\n withTexture(index: number, field_name: string, visibility?: GPUShaderStageFlags): this {\r\n this._entries[index] = {\r\n binding: index,\r\n visibility: visibility ?? GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE,\r\n texture: {sampleType: 'float'}\r\n };\r\n this._indices.set(field_name, index);\r\n return this;\r\n }\r\n\r\n withSampler(index: number, field_name: string, visibility?: GPUShaderStageFlags): this {\r\n this._entries[index] = {\r\n binding: index,\r\n visibility: visibility ?? GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE,\r\n sampler: {type: 'filtering'}\r\n };\r\n this._indices.set(field_name, index);\r\n return this;\r\n }\r\n\r\n /**\r\n * Create the underlying GPUBindGroupLayout and return a wrapped `BindGroupLayout`.\r\n */\r\n build(): BindGroupLayout\r\n {\r\n const inner = this._ctx.device.createBindGroupLayout({\r\n label: this._label,\r\n entries: this._entries\r\n });\r\n return new BindGroupLayout(inner, this._ctx, this._indices, this._uboLayouts)\r\n }\r\n}\r\n\r\nexport default BindGroupLayoutBuilder\r\n","import {WebGPUContext} from \"./WebGPUContext\";\r\nimport BindGroupLayoutBuilder, {BindGroupBuilder, BindGroupLayout} from \"./BindGroup\";\r\n\r\ntype AttributeMap = Map<string, number>;\r\ntype BindGroupLayoutFunc = (builder: BindGroupLayoutBuilder) => void;\r\n\r\n/**\r\n * Wrapper around GPUShaderModule. Keeps a map of vertex attribute names to\r\n * shader locations to aid pipeline construction.\r\n */\r\nexport class Shader {\r\n /** @internal */\r\n readonly _inner: GPUShaderModule;\r\n /** @internal */\r\n readonly _bindGroupLayouts: BindGroupLayout[] | undefined;\r\n\r\n private _vertexAttributes: AttributeMap;\r\n private _ctx: WebGPUContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(inner: GPUShaderModule, ctx: WebGPUContext, vertexAttributes: AttributeMap, bindGroupLayouts?: BindGroupLayout[]) {\r\n this._inner = inner;\r\n this._ctx = ctx;\r\n this._vertexAttributes = vertexAttributes;\r\n this._bindGroupLayouts = bindGroupLayouts;\r\n }\r\n\r\n /**\r\n * Get the shader location for a named vertex attribute. Returns undefined if the attribute\r\n * is not declared by the shader.\r\n */\r\n getVertexAttributeLocation(name: string): number | undefined {\r\n return this._vertexAttributes.get(name) ?? undefined;\r\n }\r\n\r\n /**\r\n * Returns true if the shader declares a vertex attribute with the given name.\r\n * @param name\r\n */\r\n hasVertexAttribute(name: string): boolean {\r\n return this._vertexAttributes.has(name);\r\n }\r\n\r\n /**\r\n * Create a BindGroupBuilder for the shader's bind group at the given index.\r\n * @param group - index of the bind group declared by the shader\r\n */\r\n createBindGroup(group: number): BindGroupBuilder {\r\n return new BindGroupBuilder(this._ctx, this._bindGroupLayouts![group]);\r\n }\r\n}\r\n\r\n/**\r\n * Builder for creating shader modules and declaring attribute locations used by the helper\r\n * pipeline builder.\r\n */\r\nexport class ShaderBuilder {\r\n private _code?: string;\r\n private _label?: string;\r\n private _ctx: WebGPUContext;\r\n private _vertexAttributes: AttributeMap = new Map(); // name -> location\r\n private _bindGroupLayouts: BindGroupLayout[] | undefined;\r\n private _includes: Map<string, string> = new Map();\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n /** Optional label for the underlying GPUShaderModule. */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /** Set WGSL or other shader code to compile into a GPUShaderModule. */\r\n withCode(code: string): this {\r\n this._code = code;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a named include to the shader code. The include will be expanded\r\n * in the shader code before compilation. The include name must be unique\r\n * within the shader code. This allows using `#include<name>` in the shader\r\n * code to include other files. While this is not standard WGSL, it's too\r\n * useful not to support.\r\n *\r\n * @param name - The name as used in the `#include<name>` directive.\r\n * @param code - The code the include should expand to.\r\n */\r\n withInclude(name: string, code: string): this {\r\n this._includes.set(name, code);\r\n return this;\r\n }\r\n\r\n /** Declare a named vertex attribute and the location it maps to in the shader. */\r\n withVertexAttribute(name: string, location: number): this {\r\n this._vertexAttributes.set(name, location);\r\n return this;\r\n }\r\n\r\n /**\r\n * Declare a bind group layout used by this shader. The provided builder\r\n * callback is used to construct the layout description.\r\n */\r\n withBindGroup(index: number, layout: BindGroupLayout): this;\r\n withBindGroup(index: number, buildFunc: (builder: BindGroupLayoutBuilder) => void): this;\r\n withBindGroup(index: number, layout: BindGroupLayout | BindGroupLayoutFunc): this {\r\n this._bindGroupLayouts = this._bindGroupLayouts ?? [];\r\n if (layout instanceof BindGroupLayout) {\r\n this._bindGroupLayouts[index] = layout;\r\n }\r\n else {\r\n const builder = new BindGroupLayoutBuilder(this._ctx);\r\n layout(builder);\r\n this._bindGroupLayouts[index] = builder.build();\r\n }\r\n return this;\r\n }\r\n\r\n // TODO: Provide layout methods\r\n\r\n /** Compile the shader module and return a `Shader` instance. */\r\n build(): Shader {\r\n if (!this._code) {\r\n throw new Error(\"Shader code not specified. Use withCode() to set the shader source.\");\r\n }\r\n\r\n let code = this._code;\r\n for (const [name, inc] of this._includes) {\r\n // Create a regex to match the include directive while allowing\r\n // optional whitespace between tokens, e.g.:\r\n // #include<name>\r\n // # include < name >\r\n // and so on. Escape the include name so it is safe in a RegExp.\r\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const includeRegex = new RegExp(`#\\\\s*include\\\\s*<\\\\s*${escapedName}\\\\s*>`, 'g');\r\n code = code.replace(includeRegex, inc);\r\n }\r\n\r\n const inner = this._ctx.device.createShaderModule({\r\n label: this._label,\r\n code,\r\n });\r\n\r\n return new Shader(inner, this._ctx, this._vertexAttributes, this._bindGroupLayouts);\r\n }\r\n}\r\n","import {Shader} from \"./Shader\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\nimport {WebGPUContext} from \"./WebGPUContext\";\r\nimport {Mesh} from \"./Mesh\";\r\nimport {CompareFunction, CullMode, TextureFormat} from \"./enums\";\r\nimport {BlendMode} from \"./BlendMode\";\r\n\r\n/**\r\n * Thin wrapper around GPURenderPipeline exposing a small helper for attribute\r\n * location lookup. The underlying pipeline and shader are available for advanced use.\r\n */\r\nexport class RenderPipeline {\r\n /** @internal */\r\n readonly _inner: GPURenderPipeline;\r\n private _shader: Shader;\r\n\r\n constructor(inner: GPURenderPipeline, shader: Shader) {\r\n this._inner = inner;\r\n this._shader = shader;\r\n }\r\n\r\n /**\r\n * Helper to get the shader-declared attribute location for a named attribute.\r\n */\r\n public getVertexAttributeLocation(name: string): number | undefined {\r\n return this._shader.getVertexAttributeLocation(name);\r\n }\r\n}\r\n\r\n/**\r\n * Fluent builder for creating a GPURenderPipeline. Attach a `Shader` and\r\n * optionally a `Mesh` (to derive vertex buffer layouts) before calling `build()`.\r\n */\r\nexport class RenderPipelineBuilder {\r\n private _ctx: WebGPUContext;\r\n private _shader?: Shader;\r\n private _colorTargets: GPUColorTargetState[] = [];\r\n private _defaultColorState: GPUColorTargetState[];\r\n private _depthState?: GPUDepthStencilState;\r\n private _defaultDepthState?: GPUDepthStencilState;\r\n private _vertexEntry: string | undefined = undefined;\r\n private _fragmentEntry: string | undefined = undefined;\r\n private _label: string | undefined = undefined;\r\n private _overrideConstants: Record<string, number> = {};\r\n private _cullMode: CullMode = CullMode.Back;\r\n private _mesh: Mesh | undefined = undefined;\r\n\r\n constructor(ctx: WebGPUContext, defaultDepthFormat?: TextureFormat) {\r\n this._ctx = ctx;\r\n this._defaultColorState = [{\r\n format: ctx.format,\r\n blend: undefined,\r\n writeMask: GPUColorWrite.ALL\r\n }];\r\n this._defaultDepthState = mapUndefined(defaultDepthFormat, format => ({\r\n format,\r\n depthWriteEnabled: true,\r\n depthCompare: 'less',\r\n }))\r\n }\r\n\r\n /** Assign a human-readable label for the pipeline (useful in graphics debuggers). */\r\n withLabel(label: string): this {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /** Set face-culling mode. Default is `Back`. */\r\n withCullMode(value: CullMode): this {\r\n this._cullMode = value;\r\n return this;\r\n }\r\n\r\n /** Provide a Mesh to automatically derive vertex buffer layouts. */\r\n withMesh(mesh: Mesh): this {\r\n this._mesh = mesh;\r\n return this;\r\n }\r\n\r\n /** Attach a compiled Shader to the pipeline. */\r\n withShader(shader: Shader): this {\r\n this._shader = shader;\r\n return this;\r\n }\r\n\r\n /** Select the shader entry point for the vertex stage. */\r\n withVertexShader(entry: string): this {\r\n this._vertexEntry = entry;\r\n return this;\r\n }\r\n\r\n /** Select the shader entry point for the fragment stage. */\r\n withFragmentShader(entry: string): this {\r\n this._fragmentEntry = entry;\r\n return this;\r\n }\r\n\r\n /** Add a color target with the given texture format. */\r\n withColorTarget(format: TextureFormat): this {\r\n this._colorTargets.push({\r\n format,\r\n blend: undefined,\r\n writeMask: GPUColorWrite.ALL\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a depth target with the given texture format.\r\n */\r\n withDepthTarget(format: TextureFormat): this {\r\n this._depthState = {\r\n format,\r\n ...this._defaultDepthState\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the depth compare function. Default is `less`.\r\n * @param compare\r\n */\r\n withDepthCompare(compare: CompareFunction): this {\r\n const target = this._depthState ?? this._defaultDepthState;\r\n if (!target) {\r\n console.warn(\"No depth target set. Setting depth compare function has no effect.\");\r\n }\r\n else {\r\n target.depthCompare = compare;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Enable or disable depth writes. Default is `true`.\r\n * @param enabled\r\n */\r\n withDepthWrite(enabled: boolean): this {\r\n const target = this._depthState ?? this._defaultDepthState;\r\n if (!target) {\r\n console.warn(\"No depth target set. Setting depth write enabled has no effect.\");\r\n }\r\n else {\r\n target.depthWriteEnabled = enabled;\r\n }\r\n return this;\r\n }\r\n\r\n /** Override a shader constant for specialization. */\r\n withOverrideConstant(id: string, value: number): this {\r\n this._overrideConstants[id] = value;\r\n return this;\r\n }\r\n\r\n /** Set the blend mode for the last assigned (or default) color target. */\r\n withBlendMode(blendMode: BlendMode): this {\r\n this.lastColorTarget.blend = blendMode._inner;\r\n return this;\r\n }\r\n\r\n /**\r\n * Build and create the `RenderPipeline`. Throws if required pieces (shader/vertices)\r\n * are missing.\r\n */\r\n build(): RenderPipeline {\r\n if (!this._shader) {\r\n throw new Error(\"Shader not specified. Use withShader() to set the shader to use.\");\r\n }\r\n\r\n const shader = this._shader!;\r\n\r\n if (this._vertexEntry === undefined) {\r\n throw new Error(\"Shader does not contain a vertex entry point. Use ShaderBuilder.withVertexShader() to set one.\");\r\n }\r\n\r\n let colorTargets: GPUColorTargetState[];\r\n let depthState: GPUDepthStencilState | undefined;\r\n\r\n if (this._colorTargets.length || !!this._depthState) {\r\n colorTargets = this._colorTargets;\r\n depthState = this._depthState;\r\n }\r\n else {\r\n // only use defaults if no targets were set explicitly\r\n colorTargets = this._defaultColorState;\r\n depthState = this._defaultDepthState;\r\n }\r\n\r\n const primitive: GPUPrimitiveState | undefined = mapUndefined(this._mesh, mesh => ({\r\n topology: mesh.topology,\r\n frontFace: mesh.frontFace,\r\n cullMode: this._cullMode,\r\n }));\r\n\r\n const buffers = mapUndefined(this._mesh, mesh => {\r\n const buffers: GPUVertexBufferLayout[] = [];\r\n for (let i = 0; i < mesh.numStreams; ++i) {\r\n const attributes = mesh.getStreamAttributes(i)\r\n .filter(attr => shader.hasVertexAttribute(attr.name))\r\n .map(attr => ({\r\n shaderLocation: shader.getVertexAttributeLocation(attr.name)!,\r\n offset: attr.offset,\r\n format: attr.format,\r\n }));\r\n\r\n buffers.push({\r\n arrayStride: mesh.getStreamStride(i),\r\n stepMode: 'vertex',\r\n attributes\r\n });\r\n }\r\n return buffers;\r\n });\r\n\r\n const layout = mapUndefined(\r\n shader._bindGroupLayouts,\r\n bindGroupLayouts => this._ctx.device.createPipelineLayout({\r\n bindGroupLayouts: bindGroupLayouts.map(value => value._inner),\r\n label: this._label\r\n })\r\n ) ?? \"auto\";\r\n\r\n const desc: GPURenderPipelineDescriptor = {\r\n label: this._label,\r\n layout,\r\n primitive,\r\n depthStencil: depthState,\r\n vertex: {\r\n buffers,\r\n module: shader._inner,\r\n entryPoint: this._vertexEntry!,\r\n constants: this._overrideConstants\r\n },\r\n fragment: mapUndefined(this._fragmentEntry, entry => ({\r\n module: shader._inner,\r\n entryPoint: entry,\r\n targets: colorTargets,\r\n constants: this._overrideConstants\r\n }))\r\n }\r\n\r\n const inner = this._ctx.device.createRenderPipeline(desc);\r\n return new RenderPipeline(inner, shader);\r\n }\r\n\r\n private get lastColorTarget(): GPUColorTargetState {\r\n return this._colorTargets.length ? this._colorTargets[this._colorTargets.length - 1] : this._defaultColorState[0];\r\n }\r\n}\r\n","import {Buffer, BufferBuilder, BufferUsage} from \"./buffers/Buffer\";\r\nimport {WebGPUContext} from \"./WebGPUContext\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\n\r\n/**\r\n * Index buffer formats supported by the library.\r\n */\r\nexport enum IndexFormat {\r\n Uint16 = 'uint16',\r\n Uint32 = 'uint32'\r\n}\r\n\r\nclass IndexBuffer {\r\n buffer: Buffer;\r\n format: IndexFormat;\r\n count: number;\r\n\r\n constructor(data: Uint16Array | Uint32Array, ctx: WebGPUContext, keepData: boolean = false) {\r\n // Use BYTES_PER_ELEMENT on the union-typed array in a typed manner to avoid 'any' casts\r\n const bytesPerElement = (data as Uint16Array | Uint32Array).BYTES_PER_ELEMENT;\r\n this.format = bytesPerElement === 2 ? IndexFormat.Uint16 : IndexFormat.Uint32;\r\n this.count = data.length;\r\n this.buffer = new BufferBuilder(ctx)\r\n .withData(data.buffer, keepData)\r\n .withUsage(BufferUsage.CopyDst | BufferUsage.Index)\r\n .build();\r\n }\r\n}\r\n\r\n/**\r\n * Mesh topology enum (maps to GPU primitive topologies).\r\n */\r\nexport enum MeshTopology {\r\n TriangleList = 'triangle-list',\r\n TriangleStrip = 'triangle-strip',\r\n LineList = 'line-list',\r\n LineStrip = 'line-strip',\r\n PointList = 'point-list'\r\n}\r\n\r\n/**\r\n * Winding mode for front-facing triangles.\r\n */\r\nexport enum FrontFace {\r\n Clockwise = 'cw',\r\n CounterClockwise = 'ccw'\r\n}\r\n\r\n/**\r\n * Vertex attribute formats supported by the helper. These are translated into\r\n * GPU vertex attribute formats when building pipelines.\r\n */\r\nexport enum VertexFormat {\r\n Uint8 = 'uint8',\r\n Uint8x2 = 'uint8x2',\r\n Uint8x4 = 'uint8x4',\r\n Sint8 = 'sint8',\r\n Sint8x2 = 'sint8x2',\r\n Sint8x4 = 'sint8x4',\r\n Unorm8 = 'unorm8',\r\n Unorm8x2 = 'unorm8x2',\r\n Unorm8x4 = 'unorm8x4',\r\n Snorm8 = 'snorm8',\r\n Snorm8x2 = 'snorm8x2',\r\n Snorm8x4 = 'snorm8x4',\r\n Uint16 = 'uint16',\r\n Uint16x2 = 'uint16x2',\r\n Uint16x4 = 'uint16x4',\r\n Sint16 = 'sint16',\r\n Sint16x2 = 'sint16x2',\r\n Sint16x4 = 'sint16x4',\r\n Unorm16 = 'unorm16',\r\n Unorm16x2 = 'unorm16x2',\r\n Unorm16x4 = 'unorm16x4',\r\n Snorm16 = 'snorm16',\r\n Snorm16x2 = 'snorm16x2',\r\n Snorm16x4 = 'snorm16x4',\r\n Float16 = 'float16',\r\n Float16x2 = 'float16x2',\r\n Float16x4 = 'float16x4',\r\n Float32 = 'float32',\r\n Float32x2 = 'float32x2',\r\n Float32x3 = 'float32x3',\r\n Float32x4 = 'float32x4',\r\n Uint32 = 'uint32',\r\n Uint32x2 = 'uint32x2',\r\n Uint32x3 = 'uint32x3',\r\n Uint32x4 = 'uint32x4',\r\n Sint32 = 'sint32',\r\n Sint32x2 = 'sint32x2',\r\n Sint32x3 = 'sint32x3',\r\n Sint32x4 = 'sint32x4',\r\n Unorm10_10_10_2 = 'unorm10-10-10-2',\r\n Unorm8x4_bgra = 'unorm8x4-bgra'\r\n}\r\n\r\n/**\r\n * Lightweight Mesh representation containing vertex streams and an optional index buffer.\r\n * Use `MeshBuilder` to construct instances.\r\n */\r\nexport class Mesh {\r\n private _topology: MeshTopology;\r\n private _frontFace: FrontFace;\r\n private _streams: VertexStream[] = [];\r\n private _indexBuffer?: IndexBuffer;\r\n private _numVertices: number;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(topology: MeshTopology, frontFace: FrontFace, streams: VertexStream[], indexBuffer?: IndexBuffer) {\r\n this._topology = topology;\r\n this._frontFace = frontFace;\r\n this._streams = streams;\r\n this._indexBuffer = indexBuffer;\r\n this._numVertices = this._streams[0].numVertices;\r\n\r\n this._streams.forEach(\r\n stream => console.assert(stream.numVertices === this._numVertices,\r\n \"All vertex streams must have the same number of vertices.\"\r\n ));\r\n }\r\n\r\n /** The primitive topology for this mesh. */\r\n get topology(): MeshTopology {\r\n return this._topology;\r\n }\r\n\r\n /** The winding used to determine front-facing triangles. */\r\n get frontFace(): FrontFace {\r\n return this._frontFace;\r\n }\r\n\r\n /** The number of vertex streams in this mesh. */\r\n get numStreams() {\r\n return this._streams.length;\r\n }\r\n\r\n /** Get the number of vertices in the first vertex stream. */\r\n get numVertices() {\r\n return this._numVertices;\r\n }\r\n\r\n /** Get the GPU-backed vertex buffer for a given stream index. */\r\n getVertexBuffer(streamIndex: number): Buffer {\r\n return this._streams[streamIndex].buffer!;\r\n }\r\n\r\n /** Get the stride (byte size) of a vertex in the requested stream. */\r\n getStreamStride(streamIndex: number): number {\r\n return this._streams[streamIndex].stride;\r\n }\r\n\r\n /** Get the declared attributes for a vertex stream. */\r\n getStreamAttributes(streamIndex: number): VertexAttribute[] {\r\n return this._streams[streamIndex].attributes;\r\n }\r\n\r\n /** Get the optional index buffer backing this mesh. */\r\n get indexBuffer(): Buffer | undefined {\r\n return this._indexBuffer?.buffer;\r\n }\r\n\r\n /** Get the index format of the index buffer backing this mesh. */\r\n get indexFormat(): IndexFormat {\r\n return this._indexBuffer?.format ?? IndexFormat.Uint16;\r\n }\r\n\r\n /** Get the number of indices in the index buffer backing this mesh. */\r\n get numIndices(): number {\r\n return this._indexBuffer?.count ?? 0;\r\n }\r\n}\r\n\r\nfunction vertexFormatByteSize(format: VertexFormat): number {\r\n switch (format) {\r\n case VertexFormat.Uint8:\r\n case VertexFormat.Sint8:\r\n case VertexFormat.Unorm8:\r\n case VertexFormat.Snorm8:\r\n return 1;\r\n case VertexFormat.Uint8x2:\r\n case VertexFormat.Sint8x2:\r\n case VertexFormat.Unorm8x2:\r\n case VertexFormat.Snorm8x2:\r\n case VertexFormat.Uint16:\r\n case VertexFormat.Sint16:\r\n case VertexFormat.Unorm16:\r\n case VertexFormat.Snorm16:\r\n case VertexFormat.Float16:\r\n return 2;\r\n case VertexFormat.Uint8x4:\r\n case VertexFormat.Sint8x4:\r\n case VertexFormat.Unorm8x4:\r\n case VertexFormat.Snorm8x4:\r\n case VertexFormat.Uint16x2:\r\n case VertexFormat.Sint16x2:\r\n case VertexFormat.Unorm16x2:\r\n case VertexFormat.Snorm16x2:\r\n case VertexFormat.Float16x2:\r\n case VertexFormat.Float32:\r\n case VertexFormat.Uint32:\r\n case VertexFormat.Sint32:\r\n case VertexFormat.Unorm10_10_10_2:\r\n case VertexFormat.Unorm8x4_bgra:\r\n return 4;\r\n case VertexFormat.Uint16x4:\r\n case VertexFormat.Sint16x4:\r\n case VertexFormat.Unorm16x4:\r\n case VertexFormat.Snorm16x4:\r\n case VertexFormat.Float16x4:\r\n case VertexFormat.Float32x2:\r\n case VertexFormat.Uint32x2:\r\n case VertexFormat.Sint32x2:\r\n return 8;\r\n case VertexFormat.Float32x3:\r\n case VertexFormat.Uint32x3:\r\n case VertexFormat.Sint32x3:\r\n return 12;\r\n\r\n case VertexFormat.Float32x4:\r\n case VertexFormat.Uint32x4:\r\n case VertexFormat.Sint32x4:\r\n return 16;\r\n }\r\n}\r\n\r\nexport type VertexAttribute = {\r\n name: string;\r\n format: VertexFormat;\r\n offset: number;\r\n}\r\n\r\nclass VertexStream {\r\n stride: number = 0;\r\n attributes: VertexAttribute[] = [];\r\n buffer?: Buffer;\r\n\r\n pushAttribute(name: string, format: VertexFormat) {\r\n this.attributes.push({name, format, offset: this.stride});\r\n this.stride += vertexFormatByteSize(format);\r\n }\r\n\r\n get numVertices(): number {\r\n return this.buffer!.size / this.stride;\r\n }\r\n}\r\n\r\n/**\r\n * Builder helper used when creating a vertex stream for a Mesh.\r\n */\r\nexport class StreamBuilder {\r\n private _stream: VertexStream;\r\n private _ctx: WebGPUContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(stream: VertexStream, ctx: WebGPUContext) {\r\n this._stream = stream;\r\n this._ctx = ctx;\r\n }\r\n\r\n /**\r\n * Add a vertex attribute to the stream.\r\n * @param name - attribute name used by the shader bindings\r\n * @param format - attribute format (see VertexFormat)\r\n */\r\n pushAttribute(name: string, format: VertexFormat): this {\r\n this._stream.pushAttribute(name, format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Upload vertex data for this stream. `keepOnCPU` controls whether the\r\n * source ArrayBuffer is retained in memory for readback.\r\n */\r\n withData(data: ArrayBufferLike, keepOnCPU: boolean = false) {\r\n this._stream.buffer = new BufferBuilder(this._ctx)\r\n .withData(data, keepOnCPU)\r\n .withUsage(BufferUsage.Vertex | BufferUsage.CopyDst)\r\n .build();\r\n }\r\n}\r\n\r\n/**\r\n * Fluent builder for creating a Mesh. Use `pushStream()` to describe vertex\r\n * streams and `withIndexData()` to add optional indices.\r\n */\r\nexport class MeshBuilder {\r\n private _topology: MeshTopology = MeshTopology.TriangleList;\r\n private _frontFace: FrontFace = FrontFace.CounterClockwise;\r\n private _streams: VertexStream[] = [];\r\n private _ctx: WebGPUContext;\r\n private _indexBuffer?: IndexBuffer;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n /** Add a vertex stream using a builder callback. */\r\n pushStream(buildFunc: (builder: StreamBuilder) => void): this {\r\n const stream = new VertexStream();\r\n buildFunc(new StreamBuilder(stream, this._ctx));\r\n console.assert(stream.buffer !== undefined, \"Vertex stream must have a buffer. Did you forget to call withData()?\");\r\n this._streams.push(stream);\r\n return this;\r\n }\r\n\r\n /** Set the winding used to determine front-facing triangles. Defaults to counter-clockwise. */\r\n withFrontFace(value: FrontFace): this {\r\n this._frontFace = value;\r\n return this;\r\n }\r\n\r\n /** Set the primitive topology for the mesh. Defaults to triangle list. */\r\n withTopology(value: MeshTopology): this {\r\n this._topology = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide index data (Uint16Array or Uint32Array). If `keepOnCPU` is true the\r\n * original array buffer will be preserved on the resulting mesh's index buffer.\r\n */\r\n withIndexData(data: Uint16Array | Uint32Array, keepOnCPU: boolean = false): this {\r\n this._indexBuffer = mapUndefined(data, data => new IndexBuffer(data, this._ctx, keepOnCPU));\r\n return this;\r\n }\r\n\r\n /** Build the mesh. */\r\n build(): Mesh {\r\n console.assert(this._streams.length > 0, \"Mesh must have at least one vertex stream.\");\r\n return new Mesh(\r\n this._topology,\r\n this._frontFace,\r\n this._streams,\r\n this._indexBuffer,\r\n );\r\n }\r\n}\r\n","import {WebGPUContext} from \"./WebGPUContext\";\r\nimport {AddressMode, FilterMode} from \"./enums\";\r\n\r\nexport class Sampler {\r\n readonly _inner: GPUSampler;\r\n\r\n private static DEFAULT_TRILINEAR: Sampler;\r\n\r\n constructor(inner: GPUSampler) {\r\n this._inner = inner;\r\n }\r\n}\r\n\r\nexport class SamplerBuilder {\r\n private _ctx: WebGPUContext;\r\n private _addressModeU?: GPUAddressMode;\r\n private _addressModeV?: GPUAddressMode;\r\n private _addressModeW?: GPUAddressMode;\r\n private _minFilter?: GPUFilterMode;\r\n private _magFilter?: GPUFilterMode;\r\n private _mipmapFilter?: GPUFilterMode;\r\n private _minMipLevel?: number;\r\n private _maxMipLevel?: number;\r\n private _maxAnisotropy?: number;\r\n private _compare?: GPUCompareFunction;\r\n\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n withAddressMode(u: AddressMode, v?: AddressMode, w?: AddressMode): this\r\n {\r\n this._addressModeU = u;\r\n this._addressModeV = v ?? u;\r\n this._addressModeW = w ?? u;\r\n return this;\r\n }\r\n\r\n withFiltering(minFilter: FilterMode, magFilter?: FilterMode, mipmapFilter?: FilterMode): this\r\n {\r\n this._minFilter = minFilter;\r\n this._magFilter = magFilter ?? minFilter;\r\n this._mipmapFilter = mipmapFilter ?? minFilter;\r\n return this;\r\n }\r\n\r\n withTrilinearFiltering(): this\r\n {\r\n this.withFiltering(FilterMode.Linear);\r\n return this;\r\n }\r\n\r\n withNearestFiltering(): this\r\n {\r\n this.withFiltering(FilterMode.Nearest);\r\n return this;\r\n }\r\n\r\n withAnisotropicFiltering(maxAnisotropy: number): this\r\n {\r\n this.withFiltering(FilterMode.Linear);\r\n this._maxAnisotropy = maxAnisotropy;\r\n return this;\r\n }\r\n\r\n withMinMipLevel(level: number): this\r\n {\r\n this._minMipLevel = level;\r\n return this;\r\n }\r\n\r\n withMaxMipLevel(level: number): this\r\n {\r\n this._maxMipLevel = level;\r\n return this;\r\n }\r\n\r\n withCompareFunction(compare: GPUCompareFunction): this\r\n {\r\n this._compare = compare;\r\n return this;\r\n }\r\n\r\n build(): Sampler\r\n {\r\n return new Sampler(this._ctx.device.createSampler({\r\n addressModeU: this._addressModeU,\r\n addressModeV: this._addressModeV,\r\n addressModeW: this._addressModeW,\r\n magFilter: this._magFilter,\r\n minFilter: this._minFilter,\r\n mipmapFilter: this._mipmapFilter,\r\n lodMinClamp: this._minMipLevel,\r\n lodMaxClamp: this._maxMipLevel,\r\n compare: this._compare,\r\n maxAnisotropy: this._maxAnisotropy\r\n }));\r\n }\r\n}","import {TinyHelix} from \"./TinyHelix\";\r\nimport {WebGPUContext} from \"./WebGPUContext\";\r\nimport {Shader} from \"./Shader\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\n\r\nexport class ComputePipeline {\r\n readonly _inner: GPUComputePipeline;\r\n\r\n constructor(inner: GPUComputePipeline) {\r\n this._inner = inner;\r\n }\r\n}\r\n\r\nexport class ComputePipelineBuilder {\r\n private _ctx: WebGPUContext;\r\n private _label?: string;\r\n private _shader!: Shader;\r\n private _entry!: string;\r\n\r\n constructor(ctx: WebGPUContext) {\r\n this._ctx = ctx;\r\n }\r\n\r\n withLabel(label: string): this\r\n {\r\n this._label = label;\r\n return this;\r\n }\r\n\r\n /** Select the shader entry point for the fragment stage. */\r\n withShader(shader: Shader, entry: string): this {\r\n this._shader = shader;\r\n this._entry = entry;\r\n return this;\r\n }\r\n\r\n build(): ComputePipeline {\r\n const shader = this._shader;\r\n const layout = mapUndefined(\r\n shader._bindGroupLayouts,\r\n bindGroupLayouts => this._ctx.device.createPipelineLayout({\r\n bindGroupLayouts: bindGroupLayouts.map(value => value._inner),\r\n label: this._label\r\n })\r\n ) ?? \"auto\";\r\n\r\n const desc: GPUComputePipelineDescriptor = {\r\n label: this._label,\r\n compute: {\r\n module: shader._inner,\r\n entryPoint: this._entry\r\n },\r\n layout\r\n };\r\n return new ComputePipeline(this._ctx.device.createComputePipeline(desc));\r\n }\r\n}","import {WebGPUContext, WebGPUContextOptions} from './WebGPUContext';\r\nimport {CommandEncoder} from \"./CommandEncoder\";\r\nimport {Texture, TextureBuilder} from \"./Texture\";\r\nimport {RenderTarget, RenderTargetBuilder} from \"./RenderTarget\";\r\nimport {ShaderBuilder} from \"./Shader\";\r\nimport {RenderPipelineBuilder} from \"./RenderPipeline\";\r\nimport {MeshBuilder} from \"./Mesh\";\r\nimport {UniformBuffer, UniformBufferLayout, UniformBufferLayoutBuilder} from \"./buffers/UniformBuffer\";\r\nimport BindGroupLayoutBuilder, {BindGroup, BindGroupBuilder, BindGroupLayout} from \"./BindGroup\";\r\nimport {SamplerBuilder} from \"./Sampler\";\r\nimport {ComputePipelineBuilder} from \"./ComputePipeline\";\r\nimport {ColorSpace, TextureFormat} from \"./enums\";\r\nimport {mapUndefined} from \"./utils/mapUndefined\";\r\nimport {BufferBuilder} from \"./buffers/Buffer\";\r\n\r\n/**\r\n * Options for initializing TinyHelix\r\n */\r\nexport interface TinyHelixOptions extends WebGPUContextOptions {\r\n // Possible to add more options later\r\n /** Optional format to use for the depth/stencil buffer */\r\n depthStencilFormat?: TextureFormat;\r\n}\r\n\r\n/**\r\n * Main entry point for the tiny-helix API. Manages the WebGPU context,\r\n * backbuffer and provides helpers to create render targets and command encoders.\r\n */\r\nexport class TinyHelix {\r\n private _context: WebGPUContext;\r\n private _options: TinyHelixOptions = {};\r\n private _backbuffer?: Texture;\r\n private _backbufferTarget?: RenderTarget;\r\n private _depthStencil?: Texture;\r\n private _depthStencilTarget?: RenderTarget;\r\n private _shaderIncludes: Map<string, string> = new Map();\r\n private _canvas: HTMLCanvasElement;\r\n private _globalBindBufferLayouts: BindGroupLayout[] = [];\r\n private _globalBindBuffers: BindGroup[] = [];\r\n\r\n /**\r\n * Create a new TinyHelix instance. Call `initialize()` before rendering.\r\n */\r\n constructor(canvas: HTMLCanvasElement) {\r\n this._context = new WebGPUContext();\r\n this._canvas = canvas;\r\n }\r\n\r\n /**\r\n * Initializes the underlying WebGPU context and prepares resources.\r\n * @param options - Configuration options forwarded to the WebGPU context\r\n * @example await tiny.initialize({ canvas: myCanvas });\r\n */\r\n async initialize(options: TinyHelixOptions = {}) {\r\n options.canvas = this._canvas;\r\n this._options = options;\r\n\r\n await this._context.initialize(options);\r\n\r\n this._createDepthStencil();\r\n }\r\n\r\n resize(width: number, height: number) {\r\n this._canvas.width = width;\r\n this._canvas.height = height;\r\n this._createDepthStencil();\r\n }\r\n\r\n /**\r\n * Add a named include for all shader code. The include will be expanded\r\n * in any shader code created through {@link TinyHelix.createShader}.\r\n * The include name must be unique within the shader code. This allows\r\n * using `#include<name>` in the shader code to include other files.\r\n * While this is not standard WGSL, it's too useful not to support.\r\n '\r\n * @param name - The name as used in the `#include<name>` directive.\r\n * @param source - The code the include should expand to.\r\n */\r\n addShaderInclude(name: string, source: string): this {\r\n this._shaderIncludes.set(name, source);\r\n return this;\r\n }\r\n\r\n /**\r\n * Return the chosen depth/stencil format if configured.\r\n */\r\n get depthStencilFormat(): TextureFormat | undefined {\r\n return this._options.depthStencilFormat;\r\n }\r\n\r\n /**\r\n * The current frame's backbuffer texture. Valid after `startFrame()` has been\r\n * called.\r\n * @throws Error if accessed before startFrame()\r\n */\r\n get backbuffer(): Texture {\r\n if (!this._backbuffer) {\r\n throw new Error('Backbuffer not initialized. Did you forget to call startFrame()?');\r\n }\r\n return this._backbuffer!;\r\n }\r\n\r\n /**\r\n * The RenderTarget wrapper for the current backbuffer. Valid after `startFrame()`.\r\n * @throws Error if accessed before startFrame()\r\n */\r\n get backbufferTarget(): RenderTarget {\r\n if (!this._backbufferTarget) {\r\n throw new Error('Backbuffer not initialized. Did you forget to call startFrame()?');\r\n }\r\n return this._backbufferTarget!;\r\n }\r\n\r\n get colorSpace(): ColorSpace\r\n {\r\n return this._context.colorSpace;\r\n }\r\n\r\n get backbufferFormat(): TextureFormat {\r\n return this._context.format;\r\n }\r\n\r\n /**\r\n * The width of the current backbuffer. Valid after `startFrame()`.\r\n */\r\n get backbufferWidth(): number {\r\n return this._canvas.width;\r\n }\r\n\r\n /**\r\n * The height of the current backbuffer. Valid after `startFrame()`.\r\n */\r\n get backbufferHeight(): number {\r\n return this._canvas.height;\r\n }\r\n\r\n /**\r\n * Needs to be called before rendering each frame. Updates internal backbuffer\r\n * references to the current swapchain texture.\r\n * @example tiny.startFrame();\r\n */\r\n startFrame() {\r\n this._backbuffer = Texture.from_webgpu(this._context.getCurrentTexture(), this._context.format);\r\n this._backbufferTarget = this.createRenderTarget(this._backbuffer)\r\n .build();\r\n }\r\n\r\n /**\r\n * Create a RenderTargetBuilder for a given texture.\r\n */\r\n createRenderTarget(target: Texture): RenderTargetBuilder\r\n {\r\n return new RenderTargetBuilder(target);\r\n }\r\n\r\n /**\r\n * Create a ShaderBuilder for creating a Shader.\r\n */\r\n createShader(): ShaderBuilder\r\n {\r\n let builder = new ShaderBuilder(this._context);\r\n\r\n this._shaderIncludes.forEach((v, k) => builder = builder.withInclude(k, v));\r\n this._globalBindBufferLayouts.forEach((layout, i) => builder.withBindGroup(i, layout))\r\n\r\n return builder;\r\n }\r\n\r\n /**\r\n * Create a BindGroupLayoutBuilder for creating a BindGroupLayout.\r\n */\r\n createBindGroupLayout(): BindGroupLayoutBuilder\r\n {\r\n return new BindGroupLayoutBuilder(this._context);\r\n }\r\n\r\n /**\r\n * Create a BindGroupBuilder for creating a BindGroup.\r\n */\r\n createBindGroup(layout: BindGroupLayout): BindGroupBuilder\r\n {\r\n return new BindGroupBuilder(this._context, layout);\r\n }\r\n\r\n /**\r\n * Create a MeshBuilder for creating a Mesh.\r\n */\r\n createMesh(): MeshBuilder\r\n {\r\n return new MeshBuilder(this._context);\r\n }\r\n\r\n /**\r\n * Create a RenderPipelineBuilder for creating a RenderPipeline.\r\n */\r\n createRenderPipeline(): RenderPipelineBuilder\r\n {\r\n return new RenderPipelineBuilder(this._context, this._options.depthStencilFormat);\r\n }\r\n\r\n /**\r\n * Create a ComputePipelineBuilder for creating a ComputePipeline.\r\n */\r\n createComputePipeline(): ComputePipelineBuilder\r\n {\r\n return new ComputePipelineBuilder(this._context);\r\n }\r\n\r\n /**\r\n * Create a SamplerBuilder for creating a Sampler.\r\n */\r\n createSampler(): SamplerBuilder\r\n {\r\n return new SamplerBuilder(this._context);\r\n }\r\n\r\n /**\r\n * Create a TextureBuilder for creating a Texture.\r\n */\r\n createTexture(): TextureBuilder\r\n {\r\n return new TextureBuilder(this._context)\r\n }\r\n\r\n /**\r\n * Creates a command encoder for recording GPU commands for the current frame.\r\n * @param label - Optional debug label to assign to the encoder\r\n */\r\n createCommandEncoder(label?: string): CommandEncoder {\r\n return new CommandEncoder(this.backbufferTarget, this._globalBindBuffers, this._context, this._depthStencilTarget, label);\r\n }\r\n\r\n /**\r\n * Create a UniformBufferLayoutBuilder for creating a UniformBufferLayout.\r\n */\r\n createUniformBufferLayout(): UniformBufferLayoutBuilder\r\n {\r\n return new UniformBufferLayoutBuilder();\r\n }\r\n\r\n /**\r\n * Create a UniformBuffer for the given layout.\r\n */\r\n createUniformBuffer(layout: UniformBufferLayout): UniformBuffer\r\n {\r\n return new UniformBuffer(layout, this._context)\r\n }\r\n\r\n /**\r\n * Create a BufferBuilder to construct raw buffers.\r\n */\r\n createBuffer(): BufferBuilder\r\n {\r\n return new BufferBuilder(this._context);\r\n }\r\n\r\n /**\r\n * Allows setting a global bind group for all render passes. This is useful\r\n * for setting bind groups that are used by all passes. These buffers will\r\n * automatically be set for all render and compute passes.\r\n * @param index - The index of the bind group in the render pipeline layout.\r\n * @param buffer - The bind group to set.\r\n */\r\n setGlobalBindGroup(index: number, layout: BindGroupLayout, buffer: BindGroup): this {\r\n this._globalBindBufferLayouts[index] = layout;\r\n this._globalBindBuffers[index] = buffer;\r\n return this;\r\n }\r\n\r\n /**\r\n * Destroy the TinyHelix instance and release all GPU resources.\r\n */\r\n destroy(): void {\r\n this._context.destroy();\r\n }\r\n\r\n /**\r\n * Returns the current depth/stencil texture if configured.\r\n */\r\n depthStencilTexture(): Texture | undefined {\r\n return this._depthStencil;\r\n }\r\n\r\n /**\r\n * Returns the current depth/stencil RenderTarget if configured.\r\n */\r\n depthStencilTarget(): RenderTarget | undefined {\r\n return this._depthStencilTarget;\r\n }\r\n\r\n private _createDepthStencil() {\r\n this._depthStencil = mapUndefined(this._options.depthStencilFormat, (f) =>\r\n this.createTexture()\r\n .withFormat(f)\r\n .withSize(this._canvas.width, this._canvas.height)\r\n .withUsage(GPUTextureUsage.RENDER_ATTACHMENT)\r\n .build()\r\n );\r\n\r\n this._depthStencilTarget = mapUndefined(this._depthStencil, (t) =>\r\n this.createRenderTarget(t)\r\n .build()\r\n );\r\n }\r\n}\r\n","import {BlendFactor} from \"./enums\";\r\n\r\nexport class BlendMode {\r\n readonly _inner: GPUBlendState = {\r\n color: {srcFactor: BlendFactor.SrcAlpha, dstFactor: BlendFactor.OneMinusSrcAlpha},\r\n alpha: {srcFactor: BlendFactor.One, dstFactor: BlendFactor.OneMinusSrcAlpha}\r\n };\r\n\r\n static ALPHA: BlendMode = new BlendMode(BlendFactor.SrcAlpha, BlendFactor.OneMinusSrcAlpha, BlendFactor.One, BlendFactor.OneMinusSrcAlpha);\r\n static ADDITIVE: BlendMode = new BlendMode(BlendFactor.SrcAlpha, BlendFactor.One, BlendFactor.One, BlendFactor.One)\r\n static MULTIPLY: BlendMode = new BlendMode(BlendFactor.DstColor, BlendFactor.Zero, BlendFactor.Zero, BlendFactor.One)\r\n static SCREEN: BlendMode = new BlendMode(BlendFactor.One, BlendFactor.OneMinusSrcColor, BlendFactor.One, BlendFactor.OneMinusSrcAlpha)\r\n static OVERLAY: BlendMode = new BlendMode(BlendFactor.SrcAlpha, BlendFactor.OneMinusSrcAlpha, BlendFactor.One, BlendFactor.OneMinusSrcAlpha)\r\n static DARKEN: BlendMode = new BlendMode(BlendFactor.One, BlendFactor.OneMinusSrcColor, BlendFactor.One, BlendFactor.OneMinusSrcAlpha)\r\n static LIGHTEN: BlendMode = new BlendMode(BlendFactor.OneMinusSrcColor, BlendFactor.One, BlendFactor.One, BlendFactor.OneMinusSrcAlpha)\r\n\r\n get srcFactor(): BlendFactor { return this._inner.color.srcFactor as BlendFactor; }\r\n set srcFactor(value: BlendFactor) { this._inner.color.srcFactor = value; }\r\n get dstFactor(): BlendFactor { return this._inner.color.dstFactor as BlendFactor; }\r\n set dstFactor(value: BlendFactor) { this._inner.color.dstFactor = value; }\r\n get alphaSrcFactor(): BlendFactor { return this._inner.alpha.srcFactor as BlendFactor; }\r\n set alphaSrcFactor(value: BlendFactor) { this._inner.alpha.srcFactor = value; }\r\n get alphaDstFactor(): BlendFactor { return this._inner.alpha.dstFactor as BlendFactor; }\r\n set alphaDstFactor(value: BlendFactor) { this._inner.alpha.dstFactor = value; }\r\n\r\n constructor(srcFactor: BlendFactor, dstFactor: BlendFactor, alphaSrcFactor: BlendFactor, alphaDstFactor: BlendFactor) {\r\n this.srcFactor = srcFactor;\r\n this.dstFactor = dstFactor;\r\n this.alphaSrcFactor = alphaSrcFactor;\r\n this.alphaDstFactor = alphaDstFactor;\r\n }\r\n}","import {float32ToFloat16} from \"../utils/float32ToFloat16\";\r\nimport {IndexedCollection} from \"../utils/IndexedCollection\";\r\n\r\n/**\r\n * Utility for incrementally building binary data into an ArrayBuffer.\r\n * Provides typed push helpers for common numeric types used in vertex/index buffers.\r\n */\r\nexport class BufferDataWriter {\r\n private _buffer: ArrayBuffer;\r\n private _view: DataView;\r\n private _offset = 0;\r\n\r\n /** Create a new writer with the given total byte size. */\r\n constructor(byteSize: number) {\r\n this._buffer = new ArrayBuffer(byteSize);\r\n this._view = new DataView(this._buffer);\r\n }\r\n\r\n /** Push an unsigned 8-bit integer. */\r\n pushUint8(value: number): this {\r\n this._view.setUint8(this._offset, value);\r\n this._offset += 1;\r\n return this;\r\n }\r\n\r\n /** Push two unsigned 8-bit integers. */\r\n pushUint8x2(x: number, y: number): this {\r\n this.pushUint8(x);\r\n this.pushUint8(y);\r\n return this;\r\n }\r\n\r\n /** Push four unsigned 8-bit integers. */\r\n pushUint8x4(x: number, y: number, z: number, w: number): this {\r\n this.pushUint8(x);\r\n this.pushUint8(y);\r\n this.pushUint8(z);\r\n this.pushUint8(w);\r\n return this;\r\n }\r\n\r\n /** Push a signed 8-bit integer. */\r\n pushSint8(value: number): this {\r\n this._view.setInt8(this._offset, value);\r\n this._offset += 1;\r\n return this;\r\n }\r\n\r\n /** Push two signed 8-bit integers. */\r\n pushSint8x2(x: number, y: number): this {\r\n this.pushSint8(x);\r\n this.pushSint8(y);\r\n return this;\r\n }\r\n\r\n /** Push four signed 8-bit integers. */\r\n pushSint8x4(x: number, y: number, z: number, w: number): this {\r\n this.pushSint8(x);\r\n this.pushSint8(y);\r\n this.pushSint8(z);\r\n this.pushSint8(w);\r\n return this;\r\n }\r\n\r\n /** Push an unsigned 16-bit integer (little-endian). */\r\n pushUint16(value: number): this {\r\n this._view.setUint16(this._offset, value, true);\r\n this._offset += 2;\r\n return this;\r\n }\r\n\r\n /** Push two unsigned 16-bit integers (little-endian). */\r\n pushUint16x2(x: number, y: number): this {\r\n this.pushUint16(x);\r\n this.pushUint16(y);\r\n return this;\r\n }\r\n\r\n /** Push four unsigned 16-bit integers (little-endian). */\r\n pushUint16x4(x: number, y: number, z: number, w: number): this {\r\n this.pushUint16(x);\r\n this.pushUint16(y);\r\n this.pushUint16(z);\r\n this.pushUint16(w);\r\n return this;\r\n }\r\n\r\n /** Push a signed 16-bit integer (little-endian). */\r\n pushSint16(value: number): this {\r\n this._view.setInt16(this._offset, value, true);\r\n this._offset += 2;\r\n return this;\r\n }\r\n\r\n /** Push two signed 16-bit integers (little-endian). */\r\n pushSint16x2(x: number, y: number): this {\r\n this.pushSint16(x);\r\n this.pushSint16(y);\r\n return this;\r\n }\r\n\r\n /** Push four signed 16-bit integers (little-endian). */\r\n pushSint16x4(x: number, y: number, z: number, w: number): this {\r\n this.pushSint16(x);\r\n this.pushSint16(y);\r\n this.pushSint16(z);\r\n this.pushSint16(w);\r\n return this;\r\n }\r\n\r\n /** Push a 16-bit float (little-endian). */\r\n pushFloat16(value: number) {\r\n const bits = float32ToFloat16(value);\r\n this._view.setUint16(this._offset, bits, true);\r\n this._offset += 2;\r\n return this;\r\n }\r\n\r\n /** Push two 16-bit floats (little-endian). */\r\n pushFloat16x2(x: number, y: number): this {\r\n this.pushFloat16(x);\r\n this.pushFloat16(y);\r\n return this;\r\n }\r\n\r\n /** Push four 16-bit floats (little-endian). */\r\n pushFloat16x4(x: number, y: number, z: number, w: number): this {\r\n this.pushFloat16(x);\r\n this.pushFloat16(y);\r\n this.pushFloat16(z);\r\n this.pushFloat16(w);\r\n return this;\r\n }\r\n\r\n /** Push a 32-bit float (little-endian). */\r\n pushFloat32(value: number): this {\r\n this._view.setFloat32(this._offset, value, true);\r\n this._offset += 4;\r\n return this;\r\n }\r\n\r\n /** Push two 32-bit floats (little-endian). */\r\n pushFloat32x2(arr: [number, number] | IndexedCollection): this {\r\n this.pushFloat32(arr[0]);\r\n this.pushFloat32(arr[1]);\r\n return this;\r\n }\r\n\r\n /** Push four 32-bit floats (little-endian). */\r\n pushFloat32x3(arr: [number, number, number] | IndexedCollection): this {\r\n this.pushFloat32(arr[0]);\r\n this.pushFloat32(arr[1]);\r\n this.pushFloat32(arr[2]);\r\n return this;\r\n }\r\n\r\n /** Push an 8-bit float (little-endian). */\r\n pushFloat32x4(arr: [number, number, number, number] | IndexedCollection): this {\r\n this.pushFloat32(arr[0]);\r\n this.pushFloat32(arr[1]);\r\n this.pushFloat32(arr[2]);\r\n this.pushFloat32(arr[3]);\r\n return this;\r\n }\r\n\r\n /** Push an unsigned 32-bit integer (little-endian). */\r\n pushUint32(value: number): this {\r\n this._view.setUint32(this._offset, value, true);\r\n this._offset += 4;\r\n return this;\r\n }\r\n\r\n /** Push two unsigned 32-bit integers (little-endian). */\r\n pushUint32x2(arr: [number, number] | Uint32Array): this {\r\n this.pushUint32(arr[0]);\r\n this.pushUint32(arr[1]);\r\n return this;\r\n }\r\n\r\n /** Push three unsigned 32-bit integers (little-endian). */\r\n pushUint32x3(arr: [number, number, number] | Uint32Array): this {\r\n this.pushUint32(arr[0]);\r\n this.pushUint32(arr[1]);\r\n this.pushUint32(arr[2]);\r\n return this;\r\n }\r\n\r\n /** Push four unsigned 32-bit integers (little-endian). */\r\n pushUint32x4(arr: [number, number, number, number] | Uint32Array): this {\r\n this.pushUint32(arr[0]);\r\n this.pushUint32(arr[1]);\r\n this.pushUint32(arr[2]);\r\n this.pushUint32(arr[3]);\r\n return this;\r\n }\r\n\r\n /** Push a signed 32-bit integer (little-endian). */\r\n pushSint32(value: number): this {\r\n this._view.setInt32(this._offset, value, true);\r\n this._offset += 4;\r\n return this;\r\n }\r\n\r\n /** Push two signed 32-bit integers (little-endian). */\r\n pushSint32x2(arr: [number, number] | Int32Array): this {\r\n this.pushSint32(arr[0]);\r\n this.pushSint32(arr[1]);\r\n return this;\r\n }\r\n\r\n /** Push three signed 32-bit integers (little-endian). */\r\n pushSint32x3(arr: [number, number, number] | Int32Array): this {\r\n this.pushSint32(arr[0]);\r\n this.pushSint32(arr[1]);\r\n this.pushSint32(arr[2]);\r\n return this;\r\n }\r\n\r\n /** Push four signed 32-bit integers (little-endian). */\r\n pushSint32x4(arr: [number, number, number, number] | Int32Array): this {\r\n this.pushSint32(arr[0]);\r\n this.pushSint32(arr[1]);\r\n this.pushSint32(arr[2]);\r\n this.pushSint32(arr[3]);\r\n return this;\r\n }\r\n\r\n /** Returns the underlying ArrayBuffer containing all written data. */\r\n get arrayBuffer(): ArrayBuffer\r\n {\r\n return this._buffer;\r\n }\r\n}","/**\r\n * tiny-helix: A TypeScript library for WebGPU\r\n * @packageDocumentation\r\n */\r\n\r\nexport {TinyHelix, type TinyHelixOptions} from \"./TinyHelix\";\r\nexport {WebGPUContext, type WebGPUContextOptions} from \"./WebGPUContext\";\r\n\r\n// Default export for convenience\r\nimport {TinyHelix} from \"./TinyHelix\";\r\n\r\nexport default TinyHelix;\r\n\r\nexport * from \"./BindGroup\";\r\nexport * from \"./BlendMode\";\r\nexport * from \"./CommandEncoder\";\r\nexport * from \"./ComputePass\";\r\nexport * from \"./ComputePipeline\";\r\nexport * from \"./enums\";\r\nexport * from \"./Mesh\";\r\nexport * from \"./RenderPass\";\r\nexport * from \"./RenderPipeline\";\r\nexport * from \"./RenderTarget\";\r\nexport * from \"./Sampler\";\r\nexport * from \"./Shader\";\r\nexport * from \"./Texture\";\r\nexport * from \"./buffers/Buffer\";\r\nexport * from \"./buffers/UniformBuffer\";\r\nexport * from \"./buffers/BufferDataWriter\"\r\n"],"names":["ColorSpace","FilterMode","AddressMode","CullMode","TextureFormat","BlendFactor","CompareFunction","StorageAccess","BufferUsage","TextureUsage","BaseType","ContainerType","WebGPUContext","_adapter","_device","_context","_format","Rgba8UnormSrgb","_canvas","_colorSpace","sRGB","adapter","this","device","context","format","colorSpace","canvas","isSupported","navigator","initialize","options","Error","gpu","requestAdapter","powerPreference","requestDevice","requiredFeatures","requiredLimits","lost","then","info","console","error","message","reason","catch","getContext","canUseP3","window","matchMedia","matches","DisplayP3","warn","getPreferredCanvasFormat","configure","alphaMode","getCurrentTexture","destroy","mapUndefined","value","fn","undefined","RenderPass","constructor","inner","_numVertices","_numIndices","_inner","setPipeline","pipeline","_renderPipeline","setMesh","mesh","i","numStreams","vertex_buffer","getVertexBuffer","setVertexBuffer","numVertices","indexBuffer","setIndexBuffer","indexFormat","numIndices","setBindGroup","index","bindGroup","draw","drawIndexed","end","RenderPassBuilder","commandEncoder","globalBindGroups","defaultTarget","defaultDepthTarget","_colorTargets","_clearColors","_encoder","_defaultTarget","_defaultDepthTarget","_globalBindGroups","withLabel","label","_label","withColorTarget","target","push","withDepthStencilTarget","_depthTarget","withClearColor","r","g","b","a","color","length","withClearStencil","stencil","_clearStencil","withClearDepth","depth","_clearDepth","build","targets","depthTarget","stencilLoadOp","stencilStoreOp","stencilClearValue","Depth32FloatStencil8","Depth24PlusStencil8","desc","colorAttachments","map","view","loadOp","storeOp","clearValue","depthStencilAttachment","depthClearValue","depthLoadOp","depthStoreOp","pass","beginRenderPass","forEach","group","ComputePass","dispatch","x","y","z","dispatchWorkgroups","dispatchIndirect","buffer","offset","dispatchWorkgroupsIndirect","ComputePassBuilder","encoder","beginComputePass","CommandEncoder","backbufferTarget","ctx","depthStencilTarget","_commandBuffer","_queue","queue","_backbufferTarget","_depthStencilTarget","createCommandEncoder","clearBuffer","size","createRenderPass","createComputePass","finish","submit","Texture","from_webgpu","texture","createView","TextureViewBuilder","_getBufferResource","TextureBuilder","_size","_data","_usage","GPUTextureUsage","TEXTURE_BINDING","_ctx","withSize","width","height","depthOrArrayLayers","withData","data","withFormat","withImage","withUsage","usage","COPY_DST","createTexture","ImageBitmap","copyExternalImageToTexture","source","blockWidth","Bc1RgbaUnorm","Bc1RgbaUnormSrgb","Bc2RgbaUnorm","Bc2RgbaUnormSrgb","Bc3RgbaUnorm","Bc3RgbaUnormSrgb","Bc4RUnorm","Bc4RSnorm","Bc5RgUnorm","Bc5RgSnorm","Bc6hRgbUfloat","Bc6hRgbFloat","Bc7RgbaUnorm","Bc7RgbaUnormSrgb","isBc","Etc2Rgb8Unorm","Etc2Rgb8UnormSrgb","Etc2Rgb8A1Unorm","Etc2Rgb8A1UnormSrgb","Etc2Rgba8Unorm","Etc2Rgba8UnormSrgb","EacR11Unorm","EacR11Snorm","EacRg11Unorm","EacRg11Snorm","isEtc","Astc4x4Unorm","Astc4x4UnormSrgb","Astc5x4Unorm","Astc5x4UnormSrgb","Astc5x5Unorm","Astc5x5UnormSrgb","Astc6x5Unorm","Astc6x5UnormSrgb","Astc6x6Unorm","Astc6x6UnormSrgb","Astc8x5Unorm","Astc8x5UnormSrgb","Astc8x6Unorm","Astc8x6UnormSrgb","Astc8x8Unorm","Astc8x8UnormSrgb","Astc10x5Unorm","Astc10x5UnormSrgb","Astc10x6Unorm","Astc10x6UnormSrgb","Astc10x8Unorm","Astc10x8UnormSrgb","Astc10x10Unorm","Astc10x10UnormSrgb","Astc12x10Unorm","Astc12x10UnormSrgb","Astc12x12Unorm","Astc12x12UnormSrgb","getBlockWidth","bytesPerRow","Math","ceil","R8Unorm","R8Snorm","R8Uint","R8Sint","Stencil8","R16Uint","R16Sint","R16Unorm","R16Snorm","R16Float","RG8Unorm","RG8Snorm","RG8Uint","RG8Sint","Depth16Unorm","R32Uint","R32Sint","R32Float","RG16Uint","RG16Sint","RG16Unorm","RG16Snorm","RG16Float","Rgba8Unorm","Rgba8Snorm","Rgba8Uint","Rgba8Sint","Bgra8Unorm","Bgra8UnormSrgb","Rgb9e5Ufloat","Rgb10a2Uint","Rgb10a2Unorm","Depth24Plus","Depth32Float","Rg11b10Ufloat","RG32Uint","RG32Sint","RG32Float","Rgba16Uint","Rgba16Sint","Rgba16Unorm","Rgba16Snorm","Rgba16Float","Rgba32Uint","Rgba32Sint","Rgba32Float","bytesPerBlock","writeTexture","TextureView","_desc","_texture","withSingleMip","level","baseMipLevel","mipLevelCount","withMipRange","start","withSingleLayer","layer","baseArrayLayer","arrayLayerCount","withLayerRange","RenderTarget","RenderTargetBuilder","_baseMipLevel","_baseArrayLayer","withMipLevel","withArrayLayer","tex","dimension","aspect","GPUBufferUsage","MAP_READ","MAP_WRITE","COPY_SRC","INDEX","VERTEX","UNIFORM","STORAGE","INDIRECT","QUERY_RESOLVE","STORAGE_BINDING","RENDER_ATTACHMENT","BufferBuilder","_keepData","keepOnCPU","byteLength","CopyDst","input","targetSize","ArrayBuffer","SharedArrayBuffer","src","Uint8Array","set","padArrayBuffer","createBuffer","writeBuffer","Buffer","_uploadData","float32ToFloat16","f32","Float32Array","f32u","Uint32Array","sign","exponent","sizeForBaseType","type","Float16","Float32","Boolean","MemberType","baseType","containerType","numRows","numCols","Scalar","alignment","numElements","UniformBufferLayoutBuilder","_members","Map","pushScalar","name","_pushField","pushVec2","Vec","pushVec3","pushVec4","pushMatrix","Number","isInteger","Matrix","UniformBufferLayout","members","_createDataViews","member","ArrayConst","byteSize","Uint16Array","Uint","Sint","Int32Array","_getMemberOrThrow","get","UniformBuffer","layout","_dataViews","_buffer","setScalar","setVec","values","setMatrix","skipW","col","row","upload","BindGroup","BindGroupBuilder","_entries","_layout","withBuffer","fieldName","_getBindingIndex","binding","resource","withTexture","withSampler","sampler","createBindGroup","entries","BindGroupLayout","indices","uboLayouts","_indices","_uboLayouts","getUniformBufferLayout","createUniformBuffer","withUniformBuffer","field_name","visibility","GPUShaderStage","FRAGMENT","COMPUTE","withStorageBuffer","access_mode","Read","hasDynamicOffset","minBindingSize","withStorageTexture","storageTexture","access","sampleType","createBindGroupLayout","Shader","vertexAttributes","bindGroupLayouts","_vertexAttributes","_bindGroupLayouts","getVertexAttributeLocation","hasVertexAttribute","has","ShaderBuilder","_includes","withCode","code","_code","withInclude","withVertexAttribute","location","withBindGroup","builder","inc","escapedName","replace","includeRegex","RegExp","createShaderModule","RenderPipeline","shader","_shader","RenderPipelineBuilder","defaultDepthFormat","_vertexEntry","_fragmentEntry","_overrideConstants","_cullMode","Back","_mesh","_defaultColorState","blend","writeMask","GPUColorWrite","ALL","_defaultDepthState","depthWriteEnabled","depthCompare","withCullMode","withMesh","withShader","withVertexShader","entry","withFragmentShader","withDepthTarget","_depthState","withDepthCompare","compare","withDepthWrite","enabled","withOverrideConstant","id","withBlendMode","blendMode","lastColorTarget","colorTargets","depthState","primitive","topology","frontFace","cullMode","buffers","attributes","getStreamAttributes","filter","attr","shaderLocation","arrayStride","getStreamStride","stepMode","createPipelineLayout","depthStencil","vertex","module","entryPoint","constants","fragment","createRenderPipeline","IndexFormat","MeshTopology","FrontFace","VertexFormat","IndexBuffer","keepData","bytesPerElement","BYTES_PER_ELEMENT","Uint16","Uint32","count","Index","Mesh","streams","_streams","_topology","_frontFace","_indexBuffer","stream","assert","streamIndex","stride","VertexStream","pushAttribute","Uint8","Sint8","Unorm8","Snorm8","Uint8x2","Sint8x2","Unorm8x2","Snorm8x2","Sint16","Unorm16","Snorm16","Uint8x4","Sint8x4","Unorm8x4","Snorm8x4","Uint16x2","Sint16x2","Unorm16x2","Snorm16x2","Float16x2","Sint32","Unorm10_10_10_2","Unorm8x4_bgra","Uint16x4","Sint16x4","Unorm16x4","Snorm16x4","Float16x4","Float32x2","Uint32x2","Sint32x2","Float32x3","Uint32x3","Sint32x3","Float32x4","Uint32x4","Sint32x4","vertexFormatByteSize","StreamBuilder","_stream","Vertex","MeshBuilder","TriangleList","CounterClockwise","pushStream","buildFunc","withFrontFace","withTopology","withIndexData","Sampler","SamplerBuilder","withAddressMode","u","v","w","_addressModeU","_addressModeV","_addressModeW","withFiltering","minFilter","magFilter","mipmapFilter","_minFilter","_magFilter","_mipmapFilter","withTrilinearFiltering","Linear","withNearestFiltering","Nearest","withAnisotropicFiltering","maxAnisotropy","_maxAnisotropy","withMinMipLevel","_minMipLevel","withMaxMipLevel","_maxMipLevel","withCompareFunction","_compare","createSampler","addressModeU","addressModeV","addressModeW","lodMinClamp","lodMaxClamp","ComputePipeline","ComputePipelineBuilder","_entry","compute","createComputePipeline","TinyHelix","_options","_shaderIncludes","_globalBindBufferLayouts","_globalBindBuffers","_createDepthStencil","resize","addShaderInclude","depthStencilFormat","backbuffer","_backbuffer","backbufferFormat","backbufferWidth","backbufferHeight","startFrame","createRenderTarget","createShader","k","createMesh","createUniformBufferLayout","setGlobalBindGroup","depthStencilTexture","_depthStencil","f","t","BlendMode","srcFactor","dstFactor","alphaSrcFactor","alpha","alphaDstFactor","SrcAlpha","OneMinusSrcAlpha","One","ALPHA","ADDITIVE","MULTIPLY","DstColor","Zero","SCREEN","OneMinusSrcColor","OVERLAY","DARKEN","LIGHTEN","BufferDataWriter","_offset","_view","DataView","pushUint8","setUint8","pushUint8x2","pushUint8x4","pushSint8","setInt8","pushSint8x2","pushSint8x4","pushUint16","setUint16","pushUint16x2","pushUint16x4","pushSint16","setInt16","pushSint16x2","pushSint16x4","pushFloat16","bits","pushFloat16x2","pushFloat16x4","pushFloat32","setFloat32","pushFloat32x2","arr","pushFloat32x3","pushFloat32x4","pushUint32","setUint32","pushUint32x2","pushUint32x3","pushUint32x4","pushSint32","setInt32","pushSint32x2","pushSint32x3","pushSint32x4","arrayBuffer"],"ignoreList":[],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.TinyHelix=e():t.TinyHelix=e()}(this,()=>(()=>{"use strict";var t,e,r,s,i,n,a,o,c,h,u,l,m={d:(t,e)=>{for(var r in e)m.o(e,r)&&!m.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},_={};m.d(_,{default:()=>st}),function(t){t.sRGB="srgb",t.DisplayP3="display-p3"}(t||(t={})),function(t){t.Nearest="nearest",t.Linear="linear"}(e||(e={})),function(t){t.ClampToEdge="clamp-to-edge",t.Repeat="repeat",t.MirrorRepeat="mirror-repeat"}(r||(r={})),function(t){t.None="none",t.Front="front",t.Back="back"}(s||(s={})),function(t){t.R8Unorm="r8unorm",t.R8Snorm="r8snorm",t.R8Uint="r8uint",t.R8Sint="r8sint",t.R16Unorm="r16unorm",t.R16Snorm="r16snorm",t.R16Uint="r16uint",t.R16Sint="r16sint",t.R16Float="r16float",t.RG8Unorm="rg8unorm",t.RG8Snorm="rg8snorm",t.RG8Uint="rg8uint",t.RG8Sint="rg8sint",t.R32Uint="r32uint",t.R32Sint="r32sint",t.R32Float="r32float",t.RG16Unorm="rg16unorm",t.RG16Snorm="rg16snorm",t.RG16Uint="rg16uint",t.RG16Sint="rg16sint",t.RG16Float="rg16float",t.Rgba8Unorm="rgba8unorm",t.Rgba8UnormSrgb="rgba8unorm-srgb",t.Rgba8Snorm="rgba8snorm",t.Rgba8Uint="rgba8uint",t.Rgba8Sint="rgba8sint",t.Bgra8Unorm="bgra8unorm",t.Bgra8UnormSrgb="bgra8unorm-srgb",t.Rgb9e5Ufloat="rgb9e5ufloat",t.Rgb10a2Uint="rgb10a2uint",t.Rgb10a2Unorm="rgb10a2unorm",t.Rg11b10Ufloat="rg11b10ufloat",t.RG32Uint="rg32uint",t.RG32Sint="rg32sint",t.RG32Float="rg32float",t.Rgba16Unorm="rgba16unorm",t.Rgba16Snorm="rgba16snorm",t.Rgba16Uint="rgba16uint",t.Rgba16Sint="rgba16sint",t.Rgba16Float="rgba16float",t.Rgba32Uint="rgba32uint",t.Rgba32Sint="rgba32sint",t.Rgba32Float="rgba32float",t.Stencil8="stencil8",t.Depth16Unorm="depth16unorm",t.Depth24Plus="depth24plus",t.Depth24PlusStencil8="depth24plus-stencil8",t.Depth32Float="depth32float",t.Depth32FloatStencil8="depth32float-stencil8",t.Bc1RgbaUnorm="bc1-rgba-unorm",t.Bc1RgbaUnormSrgb="bc1-rgba-unorm-srgb",t.Bc2RgbaUnorm="bc2-rgba-unorm",t.Bc2RgbaUnormSrgb="bc2-rgba-unorm-srgb",t.Bc3RgbaUnorm="bc3-rgba-unorm",t.Bc3RgbaUnormSrgb="bc3-rgba-unorm-srgb",t.Bc4RUnorm="bc4-r-unorm",t.Bc4RSnorm="bc4-r-snorm",t.Bc5RgUnorm="bc5-rg-unorm",t.Bc5RgSnorm="bc5-rg-snorm",t.Bc6hRgbUfloat="bc6h-rgb-ufloat",t.Bc6hRgbFloat="bc6h-rgb-float",t.Bc7RgbaUnorm="bc7-rgba-unorm",t.Bc7RgbaUnormSrgb="bc7-rgba-unorm-srgb",t.Etc2Rgb8Unorm="etc2-rgb8unorm",t.Etc2Rgb8UnormSrgb="etc2-rgb8unorm-srgb",t.Etc2Rgb8A1Unorm="etc2-rgb8a1unorm",t.Etc2Rgb8A1UnormSrgb="etc2-rgb8a1unorm-srgb",t.Etc2Rgba8Unorm="etc2-rgba8unorm",t.Etc2Rgba8UnormSrgb="etc2-rgba8unorm-srgb",t.EacR11Unorm="eac-r11unorm",t.EacR11Snorm="eac-r11snorm",t.EacRg11Unorm="eac-rg11unorm",t.EacRg11Snorm="eac-rg11snorm",t.Astc4x4Unorm="astc-4x4-unorm",t.Astc4x4UnormSrgb="astc-4x4-unorm-srgb",t.Astc5x4Unorm="astc-5x4-unorm",t.Astc5x4UnormSrgb="astc-5x4-unorm-srgb",t.Astc5x5Unorm="astc-5x5-unorm",t.Astc5x5UnormSrgb="astc-5x5-unorm-srgb",t.Astc6x5Unorm="astc-6x5-unorm",t.Astc6x5UnormSrgb="astc-6x5-unorm-srgb",t.Astc6x6Unorm="astc-6x6-unorm",t.Astc6x6UnormSrgb="astc-6x6-unorm-srgb",t.Astc8x5Unorm="astc-8x5-unorm",t.Astc8x5UnormSrgb="astc-8x5-unorm-srgb",t.Astc8x6Unorm="astc-8x6-unorm",t.Astc8x6UnormSrgb="astc-8x6-unorm-srgb",t.Astc8x8Unorm="astc-8x8-unorm",t.Astc8x8UnormSrgb="astc-8x8-unorm-srgb",t.Astc10x5Unorm="astc-10x5-unorm",t.Astc10x5UnormSrgb="astc-10x5-unorm-srgb",t.Astc10x6Unorm="astc-10x6-unorm",t.Astc10x6UnormSrgb="astc-10x6-unorm-srgb",t.Astc10x8Unorm="astc-10x8-unorm",t.Astc10x8UnormSrgb="astc-10x8-unorm-srgb",t.Astc10x10Unorm="astc-10x10-unorm",t.Astc10x10UnormSrgb="astc-10x10-unorm-srgb",t.Astc12x10Unorm="astc-12x10-unorm",t.Astc12x10UnormSrgb="astc-12x10-unorm-srgb",t.Astc12x12Unorm="astc-12x12-unorm",t.Astc12x12UnormSrgb="astc-12x12-unorm-srgb"}(i||(i={})),function(t){t.Zero="zero",t.One="one",t.SrcColor="src",t.OneMinusSrcColor="one-minus-src",t.SrcAlpha="src-alpha",t.OneMinusSrcAlpha="one-minus-src-alpha",t.DstColor="dst",t.OneMinusDstColor="one-minus-dst",t.DstAlpha="dst-alpha",t.OneMinusDstAlpha="one-minus-dst-alpha",t.SrcAlphaSaturated="src-alpha-saturated",t.Constant="constant",t.OneMinusConstant="one-minus-constant",t.Src1Color="src1",t.OneMinusSrc1Color="one-minus-src1",t.Src1Alpha="src1-alpha",t.OneMinusSrc1Alpha="one-minus-src1-alpha"}(n||(n={})),function(t){t.Never="never",t.Less="less",t.Equal="equal",t.LessEqual="less-equal",t.Greater="greater",t.NotEqual="not-equal",t.GreaterEqual="greater-equal",t.Always="always"}(a||(a={})),function(t){t.ReadWrite="read-write",t.Read="read-only",t.Write="write-only"}(o||(o={}));class g{constructor(){this._adapter=null,this._device=null,this._context=null,this._format=i.Rgba8UnormSrgb,this._canvas=null,this._colorSpace=t.sRGB}get adapter(){return this._adapter}get device(){return this._device}get context(){return this._context}get format(){return this._format}get colorSpace(){return this._colorSpace}get canvas(){return this._canvas}static isSupported(){return"undefined"!=typeof navigator&&"gpu"in navigator}async initialize(e={}){if(!g.isSupported())throw new Error("WebGPU is not supported in this browser");if(this._adapter=await navigator.gpu.requestAdapter({powerPreference:e.powerPreference??"high-performance"}),!this._adapter)throw new Error("Failed to get WebGPU adapter");if(this._device=await this._adapter.requestDevice({requiredFeatures:e.requiredFeatures,requiredLimits:e.requiredLimits}),!this._device)throw new Error("Failed to get WebGPU device");if(this._device.lost.then(t=>{console.error("WebGPU device lost:",t.message),"destroyed"!==t.reason&&this.initialize(e).catch(t=>{console.error("Failed to reinitialize WebGPU context:",t)})}),e.canvas){if(this._canvas=e.canvas,this._context=this._canvas.getContext("webgpu"),!this._context)throw new Error("Failed to get WebGPU context from canvas");const r=window.matchMedia("(color-gamut: p3)").matches;this._colorSpace=e.colorSpace??t.sRGB,this._colorSpace!==t.DisplayP3||r||(this._colorSpace=t.sRGB,console.warn("DisplayP3 not supported, falling back to sRGB")),this._format=navigator.gpu.getPreferredCanvasFormat(),this._context.configure({device:this._device,format:this._format,colorSpace:this._colorSpace,alphaMode:"premultiplied"})}else console.warn("No canvas provided!")}getCurrentTexture(){return this._context.getCurrentTexture()}destroy(){this._device&&(this._device.destroy(),this._device=null),this._adapter=null,this._context=null,this._canvas=null}}function d(t,e){if(void 0!==t)return e(t)}class b{constructor(t){this._numVertices=0,this._numIndices=0,this._inner=t}setPipeline(t){return this._renderPipeline!=t&&(this._inner.setPipeline(t._inner),this._renderPipeline=t),this}setMesh(t){for(let e=0;e<t.numStreams;++e){const r=t.getVertexBuffer(e);this._inner.setVertexBuffer(e,r._inner)}this._numVertices=t.numVertices;const e=t.indexBuffer;return e?(this._inner.setIndexBuffer(e._inner,t.indexFormat),this._numIndices=t.numIndices):this._numIndices=0,this}setBindGroup(t,e){return this._inner.setBindGroup(t,e._inner),this}draw(){return this._numIndices?this._inner.drawIndexed(this._numIndices,1,0,0,0):this._inner.draw(this._numVertices,1,0,0),this}end(){this._inner.end()}}class f{constructor(t,e,r,s){this._colorTargets=[],this._clearColors=[],this._encoder=t,this._defaultTarget=r,this._defaultDepthTarget=s,this._globalBindGroups=e}withLabel(t){return this._label=t,this}withColorTarget(t){return this._colorTargets.push(t),this}withDepthStencilTarget(t){return this._depthTarget=t,this}withClearColor(t,e,r,s){let i;return i=void 0===t?[0,0,0,1]:"number"==typeof t?[t,e??0,r??0,s??1]:[t[0],t[1],t[2],t[3]??1],0===this._colorTargets.length?this._clearColors[0]=i:this._clearColors[this._colorTargets.length-1]=i,this}withClearStencil(t){return this._clearStencil=t,this}withClearDepth(t){return this._clearDepth=t,this}build(){let t,e,r,s,n;this._colorTargets.length||this._depthTarget?(t=this._colorTargets,e=this._depthTarget):(t=[this._defaultTarget],e=this._defaultDepthTarget),e?.format!==i.Depth32FloatStencil8&&e?.format!==i.Depth24PlusStencil8||(r=null!=this._clearStencil?"clear":"load",s=d(this._clearStencil,()=>"store"),n=this._clearStencil);const a={colorAttachments:t.map((t,e)=>({view:t._inner,loadOp:this._clearColors[e]?"clear":"load",storeOp:"store",clearValue:this._clearColors[e]})),depthStencilAttachment:d(e,t=>({view:t._inner,depthClearValue:this._clearDepth,depthLoadOp:null!=this._clearDepth?"clear":"load",depthStoreOp:d(this._clearDepth,()=>"store"),stencilClearValue:n,stencilLoadOp:r,stencilStoreOp:s})),label:this._label},o=new b(this._encoder.beginRenderPass(a));return this._globalBindGroups.forEach((t,e)=>o.setBindGroup(e,t)),o}}class p{constructor(t){this._inner=t}setPipeline(t){return this._inner.setPipeline(t._inner),this}dispatch(t,e,r){return this._inner.dispatchWorkgroups(t,e,r),this}dispatchIndirect(t,e){return this._inner.dispatchWorkgroupsIndirect(t._inner,e),this}setBindGroup(t,e){return this._inner.setBindGroup(t,e._inner),this}end(){this._inner.end()}}class x{constructor(t,e){this._encoder=t,this._globalBindGroups=e}withLabel(t){return this._label=t,this}build(){const t={label:this._label},e=new p(this._encoder.beginComputePass(t));for(let t=0;t<this._globalBindGroups.length;++t)e.setBindGroup(t,this._globalBindGroups[t]);return e}}class U{constructor(t,e,r,s,i){this._commandBuffer=null;const n=r.device;this._queue=n.queue,this._backbufferTarget=t,this._depthStencilTarget=s,this._globalBindGroups=e,this._encoder=n.createCommandEncoder({label:i})}clearBuffer(t,e,r){return this._encoder.clearBuffer(t._inner,e,r),this}createRenderPass(){return new f(this._encoder,this._globalBindGroups,this._backbufferTarget,this._depthStencilTarget)}createComputePass(){return new x(this._encoder,this._globalBindGroups)}finish(){this._commandBuffer||(this._commandBuffer=this._encoder.finish())}submit(){this.finish(),this._queue.submit([this._commandBuffer])}}class S{static from_webgpu(t,e){return new S(t,e)}constructor(t,e){this._inner=t,this._format=e}createView(){return new A(this)}get format(){return this._format}_getBufferResource(){return this._inner.createView()}}class w{constructor(t){this._size=[1,1,1],this._data=void 0,this._format=i.Rgba8UnormSrgb,this._usage=GPUTextureUsage.TEXTURE_BINDING,this._ctx=t}withSize(t,e,r=1){return this._size=[t,e,r],this}withData(t){return this._data=t,this}withFormat(t){return this._format=t,this}withImage(t){return this._data=t,this._size=[t.width,t.height,1],this}withUsage(t){return this._usage|=t,this}build(){this._data&&(this._usage|=GPUTextureUsage.COPY_DST);const t=this._ctx.device.createTexture({format:this._format,size:this._size,usage:this._usage});if(this._data instanceof ImageBitmap)this._ctx.device.queue.copyExternalImageToTexture({source:this._data},{texture:t},[this._size[0],this._size[1],1]);else if(this._data){const[e,r,s]=this._size,n=function(t){if(function(t){switch(t){case i.Bc1RgbaUnorm:case i.Bc1RgbaUnormSrgb:case i.Bc2RgbaUnorm:case i.Bc2RgbaUnormSrgb:case i.Bc3RgbaUnorm:case i.Bc3RgbaUnormSrgb:case i.Bc4RUnorm:case i.Bc4RSnorm:case i.Bc5RgUnorm:case i.Bc5RgSnorm:case i.Bc6hRgbUfloat:case i.Bc6hRgbFloat:case i.Bc7RgbaUnorm:case i.Bc7RgbaUnormSrgb:return!0;default:return!1}}(t)||function(t){switch(t){case i.Etc2Rgb8Unorm:case i.Etc2Rgb8UnormSrgb:case i.Etc2Rgb8A1Unorm:case i.Etc2Rgb8A1UnormSrgb:case i.Etc2Rgba8Unorm:case i.Etc2Rgba8UnormSrgb:case i.EacR11Unorm:case i.EacR11Snorm:case i.EacRg11Unorm:case i.EacRg11Snorm:return!0;default:return!1}}(t))return 4;switch(t){case i.Astc4x4Unorm:case i.Astc4x4UnormSrgb:return 4;case i.Astc5x4Unorm:case i.Astc5x4UnormSrgb:case i.Astc5x5Unorm:case i.Astc5x5UnormSrgb:return 5;case i.Astc6x5Unorm:case i.Astc6x5UnormSrgb:case i.Astc6x6Unorm:case i.Astc6x6UnormSrgb:return 6;case i.Astc8x5Unorm:case i.Astc8x5UnormSrgb:case i.Astc8x6Unorm:case i.Astc8x6UnormSrgb:case i.Astc8x8Unorm:case i.Astc8x8UnormSrgb:return 8;case i.Astc10x5Unorm:case i.Astc10x5UnormSrgb:case i.Astc10x6Unorm:case i.Astc10x6UnormSrgb:case i.Astc10x8Unorm:case i.Astc10x8UnormSrgb:case i.Astc10x10Unorm:case i.Astc10x10UnormSrgb:return 10;case i.Astc12x10Unorm:case i.Astc12x10UnormSrgb:case i.Astc12x12Unorm:case i.Astc12x12UnormSrgb:return 12;default:return 1}}(this._format),a=Math.ceil(e/n)*function(t){switch(t){case i.R8Unorm:case i.R8Snorm:case i.R8Uint:case i.R8Sint:case i.Stencil8:return 1;case i.R16Uint:case i.R16Sint:case i.R16Unorm:case i.R16Snorm:case i.R16Float:case i.RG8Unorm:case i.RG8Snorm:case i.RG8Uint:case i.RG8Sint:case i.Depth16Unorm:return 2;case i.R32Uint:case i.R32Sint:case i.R32Float:case i.RG16Uint:case i.RG16Sint:case i.RG16Unorm:case i.RG16Snorm:case i.RG16Float:case i.Rgba8Unorm:case i.Rgba8UnormSrgb:case i.Rgba8Snorm:case i.Rgba8Uint:case i.Rgba8Sint:case i.Bgra8Unorm:case i.Bgra8UnormSrgb:case i.Rgb9e5Ufloat:case i.Rgb10a2Uint:case i.Rgb10a2Unorm:case i.Depth24Plus:case i.Depth24PlusStencil8:case i.Depth32Float:return 4;case i.Rg11b10Ufloat:case i.RG32Uint:case i.RG32Sint:case i.RG32Float:case i.Rgba16Uint:case i.Rgba16Sint:case i.Rgba16Unorm:case i.Rgba16Snorm:case i.Rgba16Float:case i.Depth32FloatStencil8:case i.Bc1RgbaUnorm:case i.Bc1RgbaUnormSrgb:case i.Bc4RUnorm:case i.Bc4RSnorm:case i.Etc2Rgb8Unorm:case i.Etc2Rgb8UnormSrgb:case i.Etc2Rgb8A1Unorm:case i.Etc2Rgb8A1UnormSrgb:case i.EacR11Unorm:case i.EacR11Snorm:return 8;case i.Rgba32Uint:case i.Rgba32Sint:case i.Rgba32Float:case i.Bc2RgbaUnorm:case i.Bc2RgbaUnormSrgb:case i.Bc3RgbaUnorm:case i.Bc3RgbaUnormSrgb:case i.Bc5RgUnorm:case i.Bc5RgSnorm:case i.Bc6hRgbUfloat:case i.Bc6hRgbFloat:case i.Bc7RgbaUnorm:case i.Bc7RgbaUnormSrgb:case i.Etc2Rgba8Unorm:case i.Etc2Rgba8UnormSrgb:case i.EacRg11Unorm:case i.EacRg11Snorm:case i.Astc4x4Unorm:case i.Astc4x4UnormSrgb:case i.Astc5x4Unorm:case i.Astc5x4UnormSrgb:case i.Astc5x5Unorm:case i.Astc5x5UnormSrgb:case i.Astc6x5Unorm:case i.Astc6x5UnormSrgb:case i.Astc6x6Unorm:case i.Astc6x6UnormSrgb:case i.Astc8x5Unorm:case i.Astc8x5UnormSrgb:case i.Astc8x6Unorm:case i.Astc8x6UnormSrgb:case i.Astc8x8Unorm:case i.Astc8x8UnormSrgb:case i.Astc10x5Unorm:case i.Astc10x5UnormSrgb:case i.Astc10x6Unorm:case i.Astc10x6UnormSrgb:case i.Astc10x8Unorm:case i.Astc10x8UnormSrgb:case i.Astc10x10Unorm:case i.Astc10x10UnormSrgb:case i.Astc12x10Unorm:case i.Astc12x10UnormSrgb:case i.Astc12x12Unorm:case i.Astc12x12UnormSrgb:case i.Bc2RgbaUnorm:return 16;default:throw new Error(`Unsupported texture format: ${t}`)}}(this._format);this._ctx.device.queue.writeTexture({texture:t},this._data,{bytesPerRow:a},{width:e,height:r,depthOrArrayLayers:s})}return new S(t,this._format)}}class R{constructor(t){this._inner=t}}class A{constructor(t){this._desc={},this._texture=t}withSingleMip(t){return this._desc.baseMipLevel=t,this._desc.mipLevelCount=1,this}withMipRange(t,e){return this._desc.baseMipLevel=t,this._desc.mipLevelCount=e-t,this}withSingleLayer(t){return this._desc.baseArrayLayer=t,this._desc.arrayLayerCount=1,this}withLayerRange(t,e){return this._desc.baseArrayLayer=t,this._desc.arrayLayerCount=e,this}build(){return new R(this._texture._inner.createView(this._desc))}}class y{constructor(t,e){this._inner=t,this._format=e}get format(){return this._format}}class B{constructor(t){this._baseMipLevel=0,this._baseArrayLayer=0,this._texture=t}withMipLevel(t){return this._baseMipLevel=t,this}withArrayLayer(t){return this._baseArrayLayer=t,this}build(){const t=this._texture._inner,e={format:t.format,dimension:t.dimension,aspect:"all",baseMipLevel:this._baseMipLevel,mipLevelCount:1,baseArrayLayer:this._baseArrayLayer,arrayLayerCount:1};return new y(this._texture._inner.createView(e),this._texture.format)}}!function(t){t[t.MapRead=GPUBufferUsage.MAP_READ]="MapRead",t[t.MapWrite=GPUBufferUsage.MAP_WRITE]="MapWrite",t[t.CopySrc=GPUBufferUsage.COPY_SRC]="CopySrc",t[t.CopyDst=GPUBufferUsage.COPY_DST]="CopyDst",t[t.Index=GPUBufferUsage.INDEX]="Index",t[t.Vertex=GPUBufferUsage.VERTEX]="Vertex",t[t.Uniform=GPUBufferUsage.UNIFORM]="Uniform",t[t.Storage=GPUBufferUsage.STORAGE]="Storage",t[t.Indirect=GPUBufferUsage.INDIRECT]="Indirect",t[t.QueryResolve=GPUBufferUsage.QUERY_RESOLVE]="QueryResolve"}(c||(c={})),function(t){t[t.CopySrc=GPUTextureUsage.COPY_SRC]="CopySrc",t[t.CopyDst=GPUTextureUsage.COPY_DST]="CopyDst",t[t.TextureBinding=GPUTextureUsage.TEXTURE_BINDING]="TextureBinding",t[t.StorageBinding=GPUTextureUsage.STORAGE_BINDING]="StorageBinding",t[t.RenderAttachment=GPUTextureUsage.RENDER_ATTACHMENT]="RenderAttachment"}(h||(h={}));class F{constructor(t){this._size=0,this._keepData=!1,this._usage=0,this._ctx=t}withUsage(t){return this._usage|=t,this}withData(t,e=!1){return this._data=t,this._size=t.byteLength,this._keepData=e,this._usage|=c.CopyDst,this}withSize(t){return this._size=t,this}build(){const t=d(this._data,t=>function(t){const e=4*Math.ceil(t.byteLength/4);if(e===t.byteLength)return t;const r=t instanceof ArrayBuffer?new ArrayBuffer(e):new SharedArrayBuffer(e),s=new Uint8Array(t);return new Uint8Array(r).set(s),r}(t)),e=this._ctx.device.createBuffer({size:t?t.byteLength:this._size,usage:this._usage});return t&&this._ctx.device.queue.writeBuffer(e,0,t),new v(e,this._keepData?this._data:void 0)}}class v{constructor(t,e){this._inner=t,this.data=e}get size(){return this._inner.size}_uploadData(t){this.data?t.device.queue.writeBuffer(this._inner,0,this.data):console.warn("Buffer has no data to upload.")}_getBufferResource(){return{buffer:this._inner}}}function T(t){const e=new Float32Array(1);e[0]=t;const r=new Uint32Array(e.buffer)[0],s=r>>16&32768,i=(r>>23&255)-127;return i<=-15?s:i>16?31744|s:s|i+15<<10|(8388607&r)>>13}function G(t){switch(t){case u.Float16:return 2;case u.Float32:return 4;case u.Boolean:return 1;default:throw new Error("Unknown BaseType.")}}!function(t){t[t.Float16=0]="Float16",t[t.Float32=1]="Float32",t[t.Uint=2]="Uint",t[t.Sint=3]="Sint",t[t.Boolean=4]="Boolean"}(u||(u={})),function(t){t[t.Scalar=0]="Scalar",t[t.Vec=1]="Vec",t[t.Matrix=2]="Matrix",t[t.Array=3]="Array"}(l||(l={}));class E{constructor(t,e,r,s){if(this.numRows=1,this.numCols=1,e===l.Scalar&&1!==r&&1!==s)throw new Error("Scalar member must have numRows = 1.");this.baseType=t,this.containerType=e,this.numRows=r,this.numCols=s}get size(){const t=this.numCols>1&&3===this.numRows?4:this.numRows;return G(this.baseType)*t*this.numCols}get alignment(){const t=3===this.numRows?4:this.numRows;return G(this.baseType)*t}}class M{constructor(){this._size=0,this._members=new Map}withSize(t){if(0!==this._size)throw new Error("Size already set.");return this._size=t,this}pushScalar(t,e){return this._pushField(t,e,l.Scalar)}pushVec2(t,e){return this._pushField(t,e,l.Vec,2)}pushVec3(t,e){return this._pushField(t,e,l.Vec,3)}pushVec4(t,e){return this._pushField(t,e,l.Vec,4)}pushMatrix(t,e,r,s){if(!Number.isInteger(e)||!Number.isInteger(r))throw new Error("Matrix dimensions must be integers");if(e<2||e>4||r<2||r>4)throw new Error("Matrix dimensions must be between 2 and 4 (inclusive)");return this._pushField(t,s,l.Matrix,e,r)}build(){return this._size=16*Math.ceil(this._size/16),new C(this._size,this._members)}_pushField(t,e,r,s=1,i=1){const n=new E(t,r,s,i),a=n.alignment,o=Math.ceil(this._size/a)*a;return this._members.set(e,{offset:o,type:n}),this._size=o+n.size,this}}class C{constructor(t,e){this.size=t,this._members=e}_createDataViews(t){const e=new Map;for(const[r,s]of this._members){let i;const n=s.type.size;let a=4;switch(s.type.baseType){case u.Float16:a=2,i=Uint16Array;break;case u.Float32:i=Float32Array;break;case u.Uint:case u.Boolean:i=Uint32Array;break;case u.Sint:i=Int32Array}e.set(r,[s,new i(t,s.offset,n/a)])}return e}_getMemberOrThrow(t){const e=this._members.get(t);if(!e)throw new Error(`Member ${t} not found in layout.`);return e}}class L{constructor(t,e){this._dataViews=new Map;const r=new ArrayBuffer(t.size);this._buffer=new F(e).withUsage(GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST).withData(r,!0).build(),this._data=this._buffer.data,this._dataViews=t._createDataViews(this._data),this._ctx=e}setScalar(t,e){const[r,s]=this._dataViews.get(t);return r.type.baseType===u.Float16?s[0]=T(e):s[0]=e,this}setVec(t,e){const[r,s]=this._dataViews.get(t);if(r.type.baseType==u.Float16)for(let t=0;t<e.length;++t)s[t]=T(e[t]);else for(let t=0;t<e.length;++t)s[t]=e[t];return this}setMatrix(t,e){const[r,s]=this._dataViews.get(t),i=r.type.numCols,n=r.type.numRows,a=3===n;let o=0;if(r.type.baseType===u.Float16)for(let t=0;t<i;++t){for(let t=0;t<n;++t)s[o]=T(e[o]),++o;a&&++o}else for(let t=0;t<i;++t){for(let t=0;t<n;++t)s[o]=e[o],++o;a&&++o}return this}upload(){return this._buffer._uploadData(this._ctx),this}_getBufferResource(){return{buffer:this._buffer._inner}}}class P{constructor(t){this._inner=t}}class D{constructor(t,e){this._entries=[],this._ctx=t,this._layout=e}withLabel(t){return this._label=t,this}withBuffer(t,e){const r=this._layout._getBindingIndex(t);return this._entries[r]={binding:r,resource:e._getBufferResource()},this}withTexture(t,e){const r=this._layout._getBindingIndex(t);return this._entries[r]={binding:r,resource:e._inner},this}withSampler(t,e){const r=this._layout._getBindingIndex(t);return this._entries[r]={binding:r,resource:e._inner},this}build(){const t=this._ctx.device.createBindGroup({label:this._label,entries:this._entries,layout:this._layout._inner});return new P(t)}}class O{constructor(t,e,r,s){this._inner=t,this._indices=r,this._uboLayouts=s,this._ctx=e}getUniformBufferLayout(t){return this._uboLayouts.get(t)}createUniformBuffer(t){return d(this._uboLayouts.get(t),t=>new L(t,this._ctx))}_getBindingIndex(t){const e=this._indices.get(t);if(void 0===e)throw`No field name found for ${t} in bind group layout.`;return e}}const V=class{constructor(t){this._entries=[],this._indices=new Map,this._uboLayouts=new Map,this._ctx=t}withLabel(t){return this._label=t,this}withUniformBuffer(t,e,r,s){return this._entries[t]={binding:t,visibility:s??GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},this._indices.set(e,t),this._uboLayouts.set(e,r),this}withStorageBuffer(t,e,r,s){let i="storage";return r===o.Read&&(i="read-only-storage"),this._entries[t]={binding:t,visibility:s??GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE,buffer:{type:i,hasDynamicOffset:!1,minBindingSize:4}},this._indices.set(e,t),this}withStorageTexture(t,e,r,s,i){return this._entries[t]={binding:t,visibility:i??GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE,storageTexture:{access:s,format:r}},this._indices.set(e,t),this}withTexture(t,e,r){return this._entries[t]={binding:t,visibility:r??GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE,texture:{sampleType:"float"}},this._indices.set(e,t),this}withSampler(t,e,r){return this._entries[t]={binding:t,visibility:r??GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE,sampler:{type:"filtering"}},this._indices.set(e,t),this}build(){const t=this._ctx.device.createBindGroupLayout({label:this._label,entries:this._entries});return new O(t,this._ctx,this._indices,this._uboLayouts)}};class I{constructor(t,e,r,s){this._inner=t,this._ctx=e,this._vertexAttributes=r,this._bindGroupLayouts=s}getVertexAttributeLocation(t){return this._vertexAttributes.get(t)??void 0}hasVertexAttribute(t){return this._vertexAttributes.has(t)}createBindGroup(t){return new D(this._ctx,this._bindGroupLayouts[t])}}class z{constructor(t){this._vertexAttributes=new Map,this._includes=new Map,this._ctx=t}withLabel(t){return this._label=t,this}withCode(t){return this._code=t,this}withInclude(t,e){return this._includes.set(t,e),this}withVertexAttribute(t,e){return this._vertexAttributes.set(t,e),this}withBindGroup(t,e){if(this._bindGroupLayouts=this._bindGroupLayouts??[],e instanceof O)this._bindGroupLayouts[t]=e;else{const r=new V(this._ctx);e(r),this._bindGroupLayouts[t]=r.build()}return this}build(){if(!this._code)throw new Error("Shader code not specified. Use withCode() to set the shader source.");let t=this._code;for(const[e,r]of this._includes){const s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`#\\s*include\\s*<\\s*${s}\\s*>`,"g");t=t.replace(i,r)}const e=this._ctx.device.createShaderModule({label:this._label,code:t});return new I(e,this._ctx,this._vertexAttributes,this._bindGroupLayouts)}}class k{constructor(t,e){this._inner=t,this._shader=e}getVertexAttributeLocation(t){return this._shader.getVertexAttributeLocation(t)}}class N{constructor(t,e){this._colorTargets=[],this._vertexEntry=void 0,this._fragmentEntry=void 0,this._label=void 0,this._overrideConstants={},this._cullMode=s.Back,this._mesh=void 0,this._ctx=t,this._defaultColorState=[{format:t.format,blend:void 0,writeMask:GPUColorWrite.ALL}],this._defaultDepthState=d(e,t=>({format:t,depthWriteEnabled:!0,depthCompare:"less"}))}withLabel(t){return this._label=t,this}withCullMode(t){return this._cullMode=t,this}withMesh(t){return this._mesh=t,this}withShader(t){return this._shader=t,this}withVertexShader(t){return this._vertexEntry=t,this}withFragmentShader(t){return this._fragmentEntry=t,this}withColorTarget(t){return this._colorTargets.push({format:t,blend:void 0,writeMask:GPUColorWrite.ALL}),this}withDepthTarget(t){return this._depthState={format:t,...this._defaultDepthState},this}withDepthCompare(t){const e=this._depthState??this._defaultDepthState;return e?e.depthCompare=t:console.warn("No depth target set. Setting depth compare function has no effect."),this}withDepthWrite(t){const e=this._depthState??this._defaultDepthState;return e?e.depthWriteEnabled=t:console.warn("No depth target set. Setting depth write enabled has no effect."),this}withOverrideConstant(t,e){return this._overrideConstants[t]=e,this}withBlendMode(t){return this.lastColorTarget.blend=t._inner,this}build(){if(!this._shader)throw new Error("Shader not specified. Use withShader() to set the shader to use.");const t=this._shader;if(void 0===this._vertexEntry)throw new Error("Shader does not contain a vertex entry point. Use ShaderBuilder.withVertexShader() to set one.");let e,r;this._colorTargets.length||this._depthState?(e=this._colorTargets,r=this._depthState):(e=this._defaultColorState,r=this._defaultDepthState);const s=d(this._mesh,t=>({topology:t.topology,frontFace:t.frontFace,cullMode:this._cullMode})),i=d(this._mesh,e=>{const r=[];for(let s=0;s<e.numStreams;++s){const i=e.getStreamAttributes(s).filter(e=>t.hasVertexAttribute(e.name)).map(e=>({shaderLocation:t.getVertexAttributeLocation(e.name),offset:e.offset,format:e.format}));r.push({arrayStride:e.getStreamStride(s),stepMode:"vertex",attributes:i})}return r}),n=d(t._bindGroupLayouts,t=>this._ctx.device.createPipelineLayout({bindGroupLayouts:t.map(t=>t._inner),label:this._label}))??"auto",a={label:this._label,layout:n,primitive:s,depthStencil:r,vertex:{buffers:i,module:t._inner,entryPoint:this._vertexEntry,constants:this._overrideConstants},fragment:d(this._fragmentEntry,r=>({module:t._inner,entryPoint:r,targets:e,constants:this._overrideConstants}))},o=this._ctx.device.createRenderPipeline(a);return new k(o,t)}get lastColorTarget(){return this._colorTargets.length?this._colorTargets[this._colorTargets.length-1]:this._defaultColorState[0]}}var W,q,Y,H;!function(t){t.Uint16="uint16",t.Uint32="uint32"}(W||(W={}));class ${constructor(t,e,r=!1){const s=t.BYTES_PER_ELEMENT;this.format=2===s?W.Uint16:W.Uint32,this.count=t.length,this.buffer=new F(e).withData(t.buffer,r).withUsage(c.CopyDst|c.Index).build()}}!function(t){t.TriangleList="triangle-list",t.TriangleStrip="triangle-strip",t.LineList="line-list",t.LineStrip="line-strip",t.PointList="point-list"}(q||(q={})),function(t){t.Clockwise="cw",t.CounterClockwise="ccw"}(Y||(Y={})),function(t){t.Uint8="uint8",t.Uint8x2="uint8x2",t.Uint8x4="uint8x4",t.Sint8="sint8",t.Sint8x2="sint8x2",t.Sint8x4="sint8x4",t.Unorm8="unorm8",t.Unorm8x2="unorm8x2",t.Unorm8x4="unorm8x4",t.Snorm8="snorm8",t.Snorm8x2="snorm8x2",t.Snorm8x4="snorm8x4",t.Uint16="uint16",t.Uint16x2="uint16x2",t.Uint16x4="uint16x4",t.Sint16="sint16",t.Sint16x2="sint16x2",t.Sint16x4="sint16x4",t.Unorm16="unorm16",t.Unorm16x2="unorm16x2",t.Unorm16x4="unorm16x4",t.Snorm16="snorm16",t.Snorm16x2="snorm16x2",t.Snorm16x4="snorm16x4",t.Float16="float16",t.Float16x2="float16x2",t.Float16x4="float16x4",t.Float32="float32",t.Float32x2="float32x2",t.Float32x3="float32x3",t.Float32x4="float32x4",t.Uint32="uint32",t.Uint32x2="uint32x2",t.Uint32x3="uint32x3",t.Uint32x4="uint32x4",t.Sint32="sint32",t.Sint32x2="sint32x2",t.Sint32x3="sint32x3",t.Sint32x4="sint32x4",t.Unorm10_10_10_2="unorm10-10-10-2",t.Unorm8x4_bgra="unorm8x4-bgra"}(H||(H={}));class j{constructor(t,e,r,s){this._streams=[],this._topology=t,this._frontFace=e,this._streams=r,this._indexBuffer=s,this._numVertices=this._streams[0].numVertices,this._streams.forEach(t=>console.assert(t.numVertices===this._numVertices,"All vertex streams must have the same number of vertices."))}get topology(){return this._topology}get frontFace(){return this._frontFace}get numStreams(){return this._streams.length}get numVertices(){return this._numVertices}getVertexBuffer(t){return this._streams[t].buffer}getStreamStride(t){return this._streams[t].stride}getStreamAttributes(t){return this._streams[t].attributes}get indexBuffer(){return this._indexBuffer?.buffer}get indexFormat(){return this._indexBuffer?.format??W.Uint16}get numIndices(){return this._indexBuffer?.count??0}}class X{constructor(){this.stride=0,this.attributes=[]}pushAttribute(t,e){this.attributes.push({name:t,format:e,offset:this.stride}),this.stride+=function(t){switch(t){case H.Uint8:case H.Sint8:case H.Unorm8:case H.Snorm8:return 1;case H.Uint8x2:case H.Sint8x2:case H.Unorm8x2:case H.Snorm8x2:case H.Uint16:case H.Sint16:case H.Unorm16:case H.Snorm16:case H.Float16:return 2;case H.Uint8x4:case H.Sint8x4:case H.Unorm8x4:case H.Snorm8x4:case H.Uint16x2:case H.Sint16x2:case H.Unorm16x2:case H.Snorm16x2:case H.Float16x2:case H.Float32:case H.Uint32:case H.Sint32:case H.Unorm10_10_10_2:case H.Unorm8x4_bgra:return 4;case H.Uint16x4:case H.Sint16x4:case H.Unorm16x4:case H.Snorm16x4:case H.Float16x4:case H.Float32x2:case H.Uint32x2:case H.Sint32x2:return 8;case H.Float32x3:case H.Uint32x3:case H.Sint32x3:return 12;case H.Float32x4:case H.Uint32x4:case H.Sint32x4:return 16}}(e)}get numVertices(){return this.buffer.size/this.stride}}class Q{constructor(t,e){this._stream=t,this._ctx=e}pushAttribute(t,e){return this._stream.pushAttribute(t,e),this}withData(t,e=!1){this._stream.buffer=new F(this._ctx).withData(t,e).withUsage(c.Vertex|c.CopyDst).build()}}class Z{constructor(t){this._topology=q.TriangleList,this._frontFace=Y.CounterClockwise,this._streams=[],this._ctx=t}pushStream(t){const e=new X;return t(new Q(e,this._ctx)),console.assert(void 0!==e.buffer,"Vertex stream must have a buffer. Did you forget to call withData()?"),this._streams.push(e),this}withFrontFace(t){return this._frontFace=t,this}withTopology(t){return this._topology=t,this}withIndexData(t,e=!1){return this._indexBuffer=d(t,t=>new $(t,this._ctx,e)),this}build(){return console.assert(this._streams.length>0,"Mesh must have at least one vertex stream."),new j(this._topology,this._frontFace,this._streams,this._indexBuffer)}}class K{constructor(t){this._inner=t}}class J{constructor(t){this._ctx=t}withAddressMode(t,e,r){return this._addressModeU=t,this._addressModeV=e??t,this._addressModeW=r??t,this}withFiltering(t,e,r){return this._minFilter=t,this._magFilter=e??t,this._mipmapFilter=r??t,this}withTrilinearFiltering(){return this.withFiltering(e.Linear),this}withNearestFiltering(){return this.withFiltering(e.Nearest),this}withAnisotropicFiltering(t){return this.withFiltering(e.Linear),this._maxAnisotropy=t,this}withMinMipLevel(t){return this._minMipLevel=t,this}withMaxMipLevel(t){return this._maxMipLevel=t,this}withCompareFunction(t){return this._compare=t,this}build(){return new K(this._ctx.device.createSampler({addressModeU:this._addressModeU,addressModeV:this._addressModeV,addressModeW:this._addressModeW,magFilter:this._magFilter,minFilter:this._minFilter,mipmapFilter:this._mipmapFilter,lodMinClamp:this._minMipLevel,lodMaxClamp:this._maxMipLevel,compare:this._compare,maxAnisotropy:this._maxAnisotropy}))}}class tt{constructor(t){this._inner=t}}class et{constructor(t){this._ctx=t}withLabel(t){return this._label=t,this}withShader(t,e){return this._shader=t,this._entry=e,this}build(){const t=this._shader,e=d(t._bindGroupLayouts,t=>this._ctx.device.createPipelineLayout({bindGroupLayouts:t.map(t=>t._inner),label:this._label}))??"auto",r={label:this._label,compute:{module:t._inner,entryPoint:this._entry},layout:e};return new tt(this._ctx.device.createComputePipeline(r))}}class rt{get srcFactor(){return this._inner.color.srcFactor}set srcFactor(t){this._inner.color.srcFactor=t}get dstFactor(){return this._inner.color.dstFactor}set dstFactor(t){this._inner.color.dstFactor=t}get alphaSrcFactor(){return this._inner.alpha.srcFactor}set alphaSrcFactor(t){this._inner.alpha.srcFactor=t}get alphaDstFactor(){return this._inner.alpha.dstFactor}set alphaDstFactor(t){this._inner.alpha.dstFactor=t}constructor(t,e,r,s){this._inner={color:{srcFactor:n.SrcAlpha,dstFactor:n.OneMinusSrcAlpha},alpha:{srcFactor:n.One,dstFactor:n.OneMinusSrcAlpha}},this.srcFactor=t,this.dstFactor=e,this.alphaSrcFactor=r,this.alphaDstFactor=s}}rt.ALPHA=new rt(n.SrcAlpha,n.OneMinusSrcAlpha,n.One,n.OneMinusSrcAlpha),rt.ADDITIVE=new rt(n.SrcAlpha,n.One,n.One,n.One),rt.MULTIPLY=new rt(n.DstColor,n.Zero,n.Zero,n.One),rt.SCREEN=new rt(n.One,n.OneMinusSrcColor,n.One,n.OneMinusSrcAlpha),rt.OVERLAY=new rt(n.SrcAlpha,n.OneMinusSrcAlpha,n.One,n.OneMinusSrcAlpha),rt.DARKEN=new rt(n.One,n.OneMinusSrcColor,n.One,n.OneMinusSrcAlpha),rt.LIGHTEN=new rt(n.OneMinusSrcColor,n.One,n.One,n.OneMinusSrcAlpha);const st=class{constructor(t){this._options={},this._shaderIncludes=new Map,this._globalBindBufferLayouts=[],this._globalBindBuffers=[],this._context=new g,this._canvas=t}async initialize(t={}){t.canvas=this._canvas,this._options=t,await this._context.initialize(t),this._createDepthStencil()}resize(t,e){this._canvas.width=t,this._canvas.height=e,this._createDepthStencil()}addShaderInclude(t,e){return this._shaderIncludes.set(t,e),this}get depthStencilFormat(){return this._options.depthStencilFormat}get backbuffer(){if(!this._backbuffer)throw new Error("Backbuffer not initialized. Did you forget to call startFrame()?");return this._backbuffer}get backbufferTarget(){if(!this._backbufferTarget)throw new Error("Backbuffer not initialized. Did you forget to call startFrame()?");return this._backbufferTarget}get colorSpace(){return this._context.colorSpace}get backbufferFormat(){return this._context.format}get backbufferWidth(){return this._canvas.width}get backbufferHeight(){return this._canvas.height}startFrame(){this._backbuffer=S.from_webgpu(this._context.getCurrentTexture(),this._context.format),this._backbufferTarget=this.createRenderTarget(this._backbuffer).build()}createRenderTarget(t){return new B(t)}createShader(){let t=new z(this._context);return this._shaderIncludes.forEach((e,r)=>t=t.withInclude(r,e)),this._globalBindBufferLayouts.forEach((e,r)=>t.withBindGroup(r,e)),t}createBindGroupLayout(){return new V(this._context)}createBindGroup(t){return new D(this._context,t)}createMesh(){return new Z(this._context)}createRenderPipeline(){return new N(this._context,this._options.depthStencilFormat)}createComputePipeline(){return new et(this._context)}createSampler(){return new J(this._context)}createTexture(){return new w(this._context)}createCommandEncoder(t){return new U(this.backbufferTarget,this._globalBindBuffers,this._context,this._depthStencilTarget,t)}createUniformBufferLayout(){return new M}createUniformBuffer(t){return new L(t,this._context)}createBuffer(){return new F(this._context)}setGlobalBindGroup(t,e,r){return this._globalBindBufferLayouts[t]=e,this._globalBindBuffers[t]=r,this}destroy(){this._context.destroy()}depthStencilTexture(){return this._depthStencil}depthStencilTarget(){return this._depthStencilTarget}_createDepthStencil(){this._depthStencil=d(this._options.depthStencilFormat,t=>this.createTexture().withFormat(t).withSize(this._canvas.width,this._canvas.height).withUsage(GPUTextureUsage.RENDER_ATTACHMENT).build()),this._depthStencilTarget=d(this._depthStencil,t=>this.createRenderTarget(t).build())}};return _.default})());
|
|
2
|
+
//# sourceMappingURL=tiny-helix.js.map
|