@vgpu/render 0.0.2 → 0.0.3
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/dist/domain/index.d.ts +1 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +1 -0
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/material-bindings.d.ts +51 -0
- package/dist/domain/material-bindings.d.ts.map +1 -0
- package/dist/domain/material-bindings.js +90 -0
- package/dist/domain/material-bindings.js.map +1 -0
- package/dist/domain/material-factory.d.ts +7 -0
- package/dist/domain/material-factory.d.ts.map +1 -1
- package/dist/domain/material-factory.js +4 -1
- package/dist/domain/material-factory.js.map +1 -1
- package/dist/domain/material-textures.d.ts.map +1 -1
- package/dist/domain/material-textures.js +22 -25
- package/dist/domain/material-textures.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/passes/index.d.ts +2 -1
- package/dist/passes/index.d.ts.map +1 -1
- package/dist/passes/index.js +1 -0
- package/dist/passes/index.js.map +1 -1
- package/dist/passes/pass.d.ts.map +1 -1
- package/dist/passes/pass.js +20 -2
- package/dist/passes/pass.js.map +1 -1
- package/dist/render-target/render-target-multi.d.ts +4 -0
- package/dist/render-target/render-target-multi.d.ts.map +1 -0
- package/dist/render-target/render-target-multi.js +97 -0
- package/dist/render-target/render-target-multi.js.map +1 -0
- package/dist/render-target/render-target.d.ts +2 -1
- package/dist/render-target/render-target.d.ts.map +1 -1
- package/dist/render-target/render-target.js +3 -7
- package/dist/render-target/render-target.js.map +1 -1
- package/dist/render-target/types.d.ts +25 -3
- package/dist/render-target/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/RenderPass.docs.md +42 -0
- package/src/domain/material-factory.docs.md +28 -0
package/dist/domain/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { sphere } from "./mesh-sphere.ts";
|
|
|
16
16
|
export { tetrahedron } from "./mesh-tetrahedron.ts";
|
|
17
17
|
export { torus } from "./mesh-torus.ts";
|
|
18
18
|
export { octahedron } from "./mesh-octahedron.ts";
|
|
19
|
+
export { getMaterialDeclarations, wgslDeclarations } from "./material-bindings.ts";
|
|
19
20
|
export { material } from "./material-factory.ts";
|
|
20
21
|
export { sampler } from "./material-sampler.ts";
|
|
21
22
|
export { perspectiveCamera } from "./perspective-camera.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChN,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,IAAI,IAAI,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChN,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,IAAI,IAAI,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/domain/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export { sphere } from "./mesh-sphere.js";
|
|
|
16
16
|
export { tetrahedron } from "./mesh-tetrahedron.js";
|
|
17
17
|
export { torus } from "./mesh-torus.js";
|
|
18
18
|
export { octahedron } from "./mesh-octahedron.js";
|
|
19
|
+
export { getMaterialDeclarations, wgslDeclarations } from "./material-bindings.js";
|
|
19
20
|
export { material } from "./material-factory.js";
|
|
20
21
|
export { sampler } from "./material-sampler.js";
|
|
21
22
|
export { perspectiveCamera } from "./perspective-camera.js";
|
package/dist/domain/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type MaterialSamplerSpec, type MaterialTextureSpec } from "./material-textures-schema.ts";
|
|
2
|
+
import type { MaterialSpec } from "./material-factory.ts";
|
|
3
|
+
import type { WgslUniformType } from "./wgsl-alignment.ts";
|
|
4
|
+
export interface MaterialBindingAllocation<T extends Record<string, MaterialTextureSpec>> {
|
|
5
|
+
readonly textureBindings: Readonly<Record<keyof T, number>>;
|
|
6
|
+
readonly samplerBindings: Readonly<Record<string, number>>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Allocates material binding numbers without touching GPU state.
|
|
10
|
+
*
|
|
11
|
+
* Binding allocation order is a public stability contract: uniforms first
|
|
12
|
+
* (binding 0 when present), then samplers, then textures, each in insertion
|
|
13
|
+
* order. When an implicit `materialSampler` is needed, it is allocated before
|
|
14
|
+
* explicit sampler keys so existing implicit-texture materials keep binding 0.
|
|
15
|
+
*/
|
|
16
|
+
export declare function allocateMaterialBindings<T extends Record<string, MaterialTextureSpec>, S extends Record<string, MaterialSamplerSpec>>(textures: T | undefined, samplers: S | undefined, firstBinding: number): MaterialBindingAllocation<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the WGSL `@group/@binding var ...` lines that `material()` prepends
|
|
19
|
+
* when `autoDeclarations: true`, without creating GPU resources.
|
|
20
|
+
*
|
|
21
|
+
* The returned string covers textures and samplers only, not the `Uniforms`
|
|
22
|
+
* struct. Binding allocation order is uniforms → samplers → textures, each in
|
|
23
|
+
* insertion order. Textures that omit a sampler key use the implicit
|
|
24
|
+
* `materialSampler`, which is allocated before explicit sampler keys to
|
|
25
|
+
* preserve Chunk 2 numbering. The string is byte-identical to what `material()`
|
|
26
|
+
* prepends for the same spec when `autoDeclarations: true`.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const decls = getMaterialDeclarations(spec);
|
|
31
|
+
* const mat = material({ ...spec, fragment: `${decls}\n${spec.fragment}` });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function getMaterialDeclarations<U extends Record<string, WgslUniformType>, T extends Record<string, MaterialTextureSpec>, S extends Record<string, MaterialSamplerSpec>>(spec: Pick<MaterialSpec<U, T, S>, "uniforms" | "textures" | "samplers">): string;
|
|
35
|
+
/**
|
|
36
|
+
* Emits WGSL texture and sampler declarations from pre-computed binding maps.
|
|
37
|
+
*
|
|
38
|
+
* Use this lower-level helper when you already have binding maps, for example
|
|
39
|
+
* from `mat.textureBindings` and `mat.samplerBindings`. Binding allocation order
|
|
40
|
+
* for maps produced by `material()` / `getMaterialDeclarations()` is uniforms →
|
|
41
|
+
* samplers → textures, each in insertion order.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const decls = wgslDeclarations(spec.textures, mat.textureBindings, mat.samplerBindings);
|
|
46
|
+
* const visibleFragment = `${decls}\n${fragment}`;
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function wgslDeclarations<T extends Record<string, MaterialTextureSpec>>(textures: T | undefined, textureBindings: Readonly<Record<keyof T, number>>, samplerBindings: Readonly<Record<string, number>>, group?: number): string;
|
|
50
|
+
export declare function samplerNames(textures: unknown, samplers: Record<string, MaterialSamplerSpec> | undefined): readonly string[];
|
|
51
|
+
//# sourceMappingURL=material-bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-bindings.d.ts","sourceRoot":"","sources":["../../src/domain/material-bindings.ts"],"names":[],"mappings":"AACA,OAAO,EAA4D,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC7J,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACtF,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5D;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnI,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,YAAY,EAAE,MAAM,GACnB,yBAAyB,CAAC,CAAC,CAAC,CAK9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC7C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC7C,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG,MAAM,CAIjF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC5E,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,EAClD,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,SAAI,GACR,MAAM,CAYR;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAE5H"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { invalidUsage } from "../uniform-pool-internals.js";
|
|
2
|
+
import { DEFAULT_MATERIAL_SAMPLER, isTextureKind, textureWgslType } from "./material-textures-schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Allocates material binding numbers without touching GPU state.
|
|
5
|
+
*
|
|
6
|
+
* Binding allocation order is a public stability contract: uniforms first
|
|
7
|
+
* (binding 0 when present), then samplers, then textures, each in insertion
|
|
8
|
+
* order. When an implicit `materialSampler` is needed, it is allocated before
|
|
9
|
+
* explicit sampler keys so existing implicit-texture materials keep binding 0.
|
|
10
|
+
*/
|
|
11
|
+
export function allocateMaterialBindings(textures, samplers, firstBinding) {
|
|
12
|
+
const samplerBindings = Object.fromEntries(samplerNames(textures, samplers).map((name, index) => [name, firstBinding + index]));
|
|
13
|
+
const textureFirst = firstBinding + Object.keys(samplerBindings).length;
|
|
14
|
+
const textureBindings = Object.fromEntries(Object.keys(textures ?? {}).map((name, index) => [name, textureFirst + index]));
|
|
15
|
+
return { textureBindings, samplerBindings };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns the WGSL `@group/@binding var ...` lines that `material()` prepends
|
|
19
|
+
* when `autoDeclarations: true`, without creating GPU resources.
|
|
20
|
+
*
|
|
21
|
+
* The returned string covers textures and samplers only, not the `Uniforms`
|
|
22
|
+
* struct. Binding allocation order is uniforms → samplers → textures, each in
|
|
23
|
+
* insertion order. Textures that omit a sampler key use the implicit
|
|
24
|
+
* `materialSampler`, which is allocated before explicit sampler keys to
|
|
25
|
+
* preserve Chunk 2 numbering. The string is byte-identical to what `material()`
|
|
26
|
+
* prepends for the same spec when `autoDeclarations: true`.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const decls = getMaterialDeclarations(spec);
|
|
31
|
+
* const mat = material({ ...spec, fragment: `${decls}\n${spec.fragment}` });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function getMaterialDeclarations(spec) {
|
|
35
|
+
const firstBinding = Object.keys(spec.uniforms ?? {}).length === 0 ? 0 : 1;
|
|
36
|
+
const allocation = allocateMaterialBindings(spec.textures, spec.samplers, firstBinding);
|
|
37
|
+
return wgslDeclarations(spec.textures, allocation.textureBindings, allocation.samplerBindings);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Emits WGSL texture and sampler declarations from pre-computed binding maps.
|
|
41
|
+
*
|
|
42
|
+
* Use this lower-level helper when you already have binding maps, for example
|
|
43
|
+
* from `mat.textureBindings` and `mat.samplerBindings`. Binding allocation order
|
|
44
|
+
* for maps produced by `material()` / `getMaterialDeclarations()` is uniforms →
|
|
45
|
+
* samplers → textures, each in insertion order.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const decls = wgslDeclarations(spec.textures, mat.textureBindings, mat.samplerBindings);
|
|
50
|
+
* const visibleFragment = `${decls}\n${fragment}`;
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function wgslDeclarations(textures, textureBindings, samplerBindings, group = 0) {
|
|
54
|
+
const fields = Object.entries(textures ?? {}).map(([name, spec]) => textureField(name, spec, textureBindings[name]));
|
|
55
|
+
if (fields.length === 0)
|
|
56
|
+
return "";
|
|
57
|
+
const emitted = new Set();
|
|
58
|
+
const lines = [];
|
|
59
|
+
for (const field of fields) {
|
|
60
|
+
lines.push(`@group(${group}) @binding(${field.binding}) var ${field.name}: ${textureWgslType(field.kind)};`);
|
|
61
|
+
const sampler = field.sampler ?? (DEFAULT_MATERIAL_SAMPLER in samplerBindings ? DEFAULT_MATERIAL_SAMPLER : undefined);
|
|
62
|
+
if (sampler && !emitted.has(sampler))
|
|
63
|
+
emitSampler(lines, emitted, sampler, samplerBindings, group);
|
|
64
|
+
}
|
|
65
|
+
for (const sampler of Object.keys(samplerBindings))
|
|
66
|
+
emitSampler(lines, emitted, sampler, samplerBindings, group);
|
|
67
|
+
return lines.join("\n");
|
|
68
|
+
}
|
|
69
|
+
export function samplerNames(textures, samplers) {
|
|
70
|
+
return [...(needsDefaultSampler(textures, samplers) ? [DEFAULT_MATERIAL_SAMPLER] : []), ...Object.keys(samplers ?? {})];
|
|
71
|
+
}
|
|
72
|
+
function emitSampler(lines, emitted, name, bindings, group) {
|
|
73
|
+
const binding = bindings[name];
|
|
74
|
+
if (binding === undefined || emitted.has(name))
|
|
75
|
+
return;
|
|
76
|
+
lines.push(`@group(${group}) @binding(${binding}) var ${name}: sampler;`);
|
|
77
|
+
emitted.add(name);
|
|
78
|
+
}
|
|
79
|
+
function textureField(name, spec, binding) {
|
|
80
|
+
const kind = typeof spec === "string" ? spec : spec?.kind;
|
|
81
|
+
if (!isTextureKind(kind))
|
|
82
|
+
throw invalidUsage("material", `Unsupported texture kind for '${name}'.`);
|
|
83
|
+
if (binding === undefined)
|
|
84
|
+
throw invalidUsage("material", `Missing texture binding for '${name}'.`);
|
|
85
|
+
return { name, kind, binding, sampler: typeof spec === "string" ? undefined : spec.sampler };
|
|
86
|
+
}
|
|
87
|
+
function needsDefaultSampler(textures, samplers) {
|
|
88
|
+
return Object.values((textures ?? {})).some((spec) => typeof spec !== "object" || spec === null || !spec.sampler) && !(DEFAULT_MATERIAL_SAMPLER in (samplers ?? {}));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=material-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-bindings.js","sourceRoot":"","sources":["../../src/domain/material-bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,13 @@ export interface MaterialSpec<U extends Record<string, WgslUniformType> = Record
|
|
|
16
16
|
readonly vertexLayout: VertexLayoutKind;
|
|
17
17
|
readonly targetFormat?: GPUTextureFormat;
|
|
18
18
|
readonly depthFormat?: GPUTextureFormat | null;
|
|
19
|
+
/**
|
|
20
|
+
* When `true`, `material()` prepends generated texture/sampler WGSL declarations.
|
|
21
|
+
* Defaults to `false`; write declarations manually or prepend `getMaterialDeclarations(spec)`.
|
|
22
|
+
* The `Uniforms` struct is still injected whenever `uniforms` is non-empty.
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
readonly autoDeclarations?: boolean;
|
|
19
26
|
}
|
|
20
27
|
export interface FactoryMaterial<U extends Record<string, WgslUniformType> = Record<string, WgslUniformType>, T extends Record<string, MaterialTextureSpec> = Record<string, never>, S extends Record<string, MaterialSamplerSpec> = Record<string, never>> extends Material {
|
|
21
28
|
readonly bindGroup: GPUBindGroup;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-factory.d.ts","sourceRoot":"","sources":["../../src/domain/material-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAiE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"material-factory.d.ts","sourceRoot":"","sources":["../../src/domain/material-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { invalidUsage, shaderVisibility } from "../uniform-pool-internals.js";
|
|
2
2
|
import { alignUniforms, isWgslUniformType, wgslType } from "./wgsl-alignment.js";
|
|
3
|
+
import { wgslDeclarations } from "./material-bindings.js";
|
|
3
4
|
import { materialTextureState } from "./material-textures.js";
|
|
4
5
|
import { vertexBufferLayout } from "./vertex-layout.js";
|
|
5
6
|
const DEFAULT_TARGET_FORMAT = "bgra8unorm-srgb";
|
|
@@ -7,7 +8,9 @@ export function material(spec) {
|
|
|
7
8
|
validateSchema(spec.uniforms);
|
|
8
9
|
const layout = alignUniforms(spec.uniforms);
|
|
9
10
|
const textures = materialTextureState(spec.device, spec.textures, spec.samplers, layout.byteSize === 0 ? 0 : 1);
|
|
10
|
-
const
|
|
11
|
+
const combinedWgsl = `${header(layout.fields)}\n${spec.vertex}\n${spec.fragment}`;
|
|
12
|
+
const textureWgsl = spec.autoDeclarations === true ? wgslDeclarations(spec.textures, textures.textureBindings, textures.samplerBindings) : "";
|
|
13
|
+
const code = textureWgsl === "" ? combinedWgsl : `${textureWgsl}\n${combinedWgsl}`;
|
|
11
14
|
const shader = createShader(spec.device, code);
|
|
12
15
|
const bindGroupLayout = spec.device.gpu.createBindGroupLayout({
|
|
13
16
|
label: "material.bgl",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-factory.js","sourceRoot":"","sources":["../../src/domain/material-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAA2C,MAAM,qBAAqB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"material-factory.js","sourceRoot":"","sources":["../../src/domain/material-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-textures.d.ts","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"material-textures.d.ts","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;AAGlD,OAAO,EAA8D,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAoB,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAE1M,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAChI,QAAQ,CAAC,aAAa,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,SAAS,iBAAiB,EAAE,CAAC;IACxF,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAID,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/H,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,YAAY,EAAE,MAAM,GACnB,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAgB5B"}
|
|
@@ -1,53 +1,50 @@
|
|
|
1
1
|
import { invalidUsage, shaderVisibility } from "../uniform-pool-internals.js";
|
|
2
|
+
import { allocateMaterialBindings, samplerNames } from "./material-bindings.js";
|
|
2
3
|
import { DEFAULT_MATERIAL_SAMPLER, isTextureKind, samplerDescriptor } from "./material-textures-schema.js";
|
|
3
4
|
export function materialTextureState(device, textures, samplers, firstBinding) {
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
5
|
+
const bindings = allocateMaterialBindings(textures, samplers, firstBinding);
|
|
6
|
+
const textureFields = textureFieldsOf(textures ?? {}, bindings.textureBindings);
|
|
7
|
+
const samplerEntries = samplersOf(device, textures, samplers, bindings.samplerBindings);
|
|
8
|
+
validateSamplerRefs(textures ?? {}, Object.keys(bindings.samplerBindings));
|
|
7
9
|
const placeholders = textureFields.map((field) => placeholder(device, field.kind));
|
|
8
10
|
const entries = [...samplerEntries.entries, ...textureFields.map((field, i) => ({ binding: field.binding, resource: placeholders[i].view }))];
|
|
9
11
|
return {
|
|
10
12
|
layoutEntries: [...samplerEntries.layoutEntries, ...textureFields.map(textureLayoutEntry)],
|
|
11
13
|
entries,
|
|
12
|
-
textureBindings:
|
|
13
|
-
samplerBindings:
|
|
14
|
+
textureBindings: bindings.textureBindings,
|
|
15
|
+
samplerBindings: bindings.samplerBindings,
|
|
14
16
|
defaultSampler: samplerEntries.defaultSampler,
|
|
15
17
|
writeTextures: (values) => [...samplerEntries.entries, ...textureEntries(textureFields, values)],
|
|
16
18
|
dispose: () => placeholders.forEach((value) => value.texture.destroy()),
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
|
-
function
|
|
20
|
-
const
|
|
21
|
-
return explicit > 0 ? explicit : Object.keys((textures ?? {})).length > 0 ? 1 : 0;
|
|
22
|
-
}
|
|
23
|
-
function samplersOf(device, textures, samplers, first) {
|
|
24
|
-
const raw = Object.entries(samplers ?? {});
|
|
25
|
-
const specs = raw.length > 0 ? raw : Object.keys((textures ?? {})).length > 0 ? [[DEFAULT_MATERIAL_SAMPLER, { mag: "linear", min: "linear", mip: "linear" }]] : [];
|
|
26
|
-
const byName = {};
|
|
27
|
-
const gpuSamplers = specs.map(([name, spec], index) => {
|
|
21
|
+
function samplersOf(device, textures, samplers, bindings) {
|
|
22
|
+
const gpuSamplers = samplerNames(textures, samplers).map((name) => {
|
|
28
23
|
try {
|
|
24
|
+
const spec = name === DEFAULT_MATERIAL_SAMPLER ? { mag: "linear", min: "linear", mip: "linear" } : samplers?.[name];
|
|
29
25
|
const gpu = device.gpu.createSampler(samplerDescriptor(spec));
|
|
30
|
-
|
|
31
|
-
return { name, gpu, binding: first + index };
|
|
26
|
+
return { name, gpu, binding: bindings[name] };
|
|
32
27
|
}
|
|
33
28
|
catch (error) {
|
|
34
29
|
throw invalidUsage("material", `Invalid sampler '${name}': ${messageOf(error)}`);
|
|
35
30
|
}
|
|
36
31
|
});
|
|
37
32
|
return {
|
|
38
|
-
|
|
39
|
-
defaultSampler: raw.length === 0 && gpuSamplers.length > 0 ? gpuSamplers[0].gpu : undefined,
|
|
33
|
+
defaultSampler: gpuSamplers.find((entry) => entry.name === DEFAULT_MATERIAL_SAMPLER)?.gpu,
|
|
40
34
|
entries: gpuSamplers.map(({ binding, gpu }) => ({ binding, resource: gpu })),
|
|
41
35
|
layoutEntries: gpuSamplers.map(({ binding }) => ({ binding, visibility: shaderVisibility(), sampler: { type: "filtering" } })),
|
|
42
36
|
};
|
|
43
37
|
}
|
|
44
|
-
function textureFieldsOf(schema,
|
|
45
|
-
return Object.entries(schema).map(([name, spec]
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
function textureFieldsOf(schema, bindings) {
|
|
39
|
+
return Object.entries(schema).map(([name, spec]) => textureField(name, spec, bindings[name]));
|
|
40
|
+
}
|
|
41
|
+
function textureField(name, spec, binding) {
|
|
42
|
+
const kind = typeof spec === "string" ? spec : spec?.kind;
|
|
43
|
+
if (!isTextureKind(kind))
|
|
44
|
+
throw invalidUsage("material", `Unsupported texture kind for '${name}'.`);
|
|
45
|
+
if (binding === undefined)
|
|
46
|
+
throw invalidUsage("material", `Missing texture binding for '${name}'.`);
|
|
47
|
+
return { name, kind, binding, sampler: typeof spec === "string" ? undefined : spec.sampler };
|
|
51
48
|
}
|
|
52
49
|
function validateSamplerRefs(textures, samplerNames) {
|
|
53
50
|
for (const [name, spec] of Object.entries(textures)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-textures.js","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"material-textures.js","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export type { RenderPipelineOptions } from "./pipeline.ts";
|
|
|
6
6
|
export type { DrawSpec } from "./rapid-renderer.ts";
|
|
7
7
|
export type { UniformLayout, UniformPoolOptions, UniformSlot } from "./uniform-pool-types.ts";
|
|
8
8
|
export type { ColorAttachment, RenderPassDrawOptions, RenderPassDynamicOffsets, RenderPassOptions, } from "./render-pass.ts";
|
|
9
|
-
export { box, capsule, cone, cylinder, degToRad, disk, dodecahedron, fullscreenQuad, icosahedron, icosphere, material, Mesh, octahedron, orthographicCamera, perspectiveCamera, plane, ring, sampler, sphere, srgb, tetrahedron, torus } from "./domain/index.ts";
|
|
9
|
+
export { box, capsule, cone, cylinder, degToRad, disk, dodecahedron, fullscreenQuad, getMaterialDeclarations, icosahedron, icosphere, material, Mesh, octahedron, orthographicCamera, perspectiveCamera, plane, ring, sampler, sphere, srgb, tetrahedron, torus, wgslDeclarations } from "./domain/index.ts";
|
|
10
10
|
export type { BoxSpec, Camera, CapsuleSpec, ConeSpec, CylinderSpec, DiskSpec, FullscreenQuadSpec, IcosphereSpec, Material, MaterialSamplerSpec, MaterialSpec, MaterialTextureSpec, MaterialUniformValue, Mat4, MeshGpu, MeshPrimitive, PlaneSpec, PolyhedronSpec, RingSpec, Sampler, SamplerSpec, SphereSpec, TextureKind, TextureSpec, TextureValue, TorusSpec, Vec3, VertexAttributes, VertexLayoutKind, WgslUniformType, WriteTextureValues } from "./domain/index.ts";
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC9F,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC9F,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7S,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export { createRenderPipeline } from "./pipeline.js";
|
|
|
2
2
|
export { RenderPass } from "./render-pass.js";
|
|
3
3
|
export { RapidRenderer } from "./rapid-renderer.js";
|
|
4
4
|
export { UniformPool } from "./uniform-pool.js";
|
|
5
|
-
export { box, capsule, cone, cylinder, degToRad, disk, dodecahedron, fullscreenQuad, icosahedron, icosphere, material, Mesh, octahedron, orthographicCamera, perspectiveCamera, plane, ring, sampler, sphere, srgb, tetrahedron, torus } from "./domain/index.js";
|
|
5
|
+
export { box, capsule, cone, cylinder, degToRad, disk, dodecahedron, fullscreenQuad, getMaterialDeclarations, icosahedron, icosphere, material, Mesh, octahedron, orthographicCamera, perspectiveCamera, plane, ring, sampler, sphere, srgb, tetrahedron, torus, wgslDeclarations } from "./domain/index.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/passes/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { pass } from "./pass.ts";
|
|
2
2
|
export { passSequence } from "./pass-sequence.ts";
|
|
3
3
|
export { renderTarget } from "../render-target/render-target.ts";
|
|
4
|
+
export { renderTargetMulti } from "../render-target/render-target-multi.ts";
|
|
4
5
|
export { renderTargetForCanvas } from "../render-target/render-target-canvas.ts";
|
|
5
|
-
export type { PassSpec, PassTarget, RenderTarget, RenderTargetGpu, RenderTargetSpec, } from "../render-target/types.ts";
|
|
6
|
+
export type { PassSpec, PassTarget, ColorAttachmentSpec, RenderTarget, RenderTargetGpu, RenderTargetMultiSpec, RenderTargetN, RenderTargetSpec, } from "../render-target/types.ts";
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,YAAY,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,YAAY,EACV,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}
|
package/dist/passes/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { pass } from "./pass.js";
|
|
2
2
|
export { passSequence } from "./pass-sequence.js";
|
|
3
3
|
export { renderTarget } from "../render-target/render-target.js";
|
|
4
|
+
export { renderTargetMulti } from "../render-target/render-target-multi.js";
|
|
4
5
|
export { renderTargetForCanvas } from "../render-target/render-target-canvas.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/passes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pass.d.ts","sourceRoot":"","sources":["../../src/passes/pass.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pass.d.ts","sourceRoot":"","sources":["../../src/passes/pass.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,QAAQ,EAA4B,MAAM,2BAA2B,CAAC;AAchG,gFAAgF;AAChF,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAyBzC"}
|
package/dist/passes/pass.js
CHANGED
|
@@ -30,13 +30,18 @@ export function pass(spec) {
|
|
|
30
30
|
function colorAttachmentsFor(target, spec) {
|
|
31
31
|
const loadOp = spec.colorLoadOp ?? "clear";
|
|
32
32
|
if (isRenderTarget(target)) {
|
|
33
|
-
|
|
33
|
+
if (target.gpu.colorAttachments.length > 1 && target.sampleCount !== 1)
|
|
34
|
+
throw invalidUsage("MRT pass targets do not support MSAA in v2.");
|
|
35
|
+
const clearColors = clearColorsForRenderTarget(target, spec.clearColor);
|
|
36
|
+
return target.gpu.colorAttachments.map((source, index) => {
|
|
34
37
|
const attachment = { ...source };
|
|
35
38
|
attachment.loadOp = spec.colorLoadOp ?? attachment.loadOp;
|
|
36
|
-
attachment.clearValue =
|
|
39
|
+
attachment.clearValue = clearColors?.[index] === undefined ? attachment.clearValue : colorDict(clearColors[index]);
|
|
37
40
|
return attachment;
|
|
38
41
|
});
|
|
39
42
|
}
|
|
43
|
+
if (isPerAttachmentClear(spec.clearColor))
|
|
44
|
+
throw invalidUsage("per-attachment clearColor requires a multi-color RenderTarget target.");
|
|
40
45
|
if (isTexture(target))
|
|
41
46
|
return [{ view: target.createView(), loadOp, storeOp: "store", clearValue: colorDict(spec.clearColor) }];
|
|
42
47
|
if (isTextureView(target))
|
|
@@ -83,6 +88,19 @@ function isTextureView(value) {
|
|
|
83
88
|
function isObject(value) {
|
|
84
89
|
return typeof value === "object" && value !== null;
|
|
85
90
|
}
|
|
91
|
+
function clearColorsForRenderTarget(target, color) {
|
|
92
|
+
if (color === undefined)
|
|
93
|
+
return undefined;
|
|
94
|
+
if (!isPerAttachmentClear(color))
|
|
95
|
+
return target.gpu.colorAttachments.map(() => color);
|
|
96
|
+
if (color.length !== target.gpu.colorAttachments.length) {
|
|
97
|
+
throw invalidUsage(`pass() clearColor array length ${color.length} must match RenderTarget color attachment count ${target.gpu.colorAttachments.length}.`);
|
|
98
|
+
}
|
|
99
|
+
return color;
|
|
100
|
+
}
|
|
101
|
+
function isPerAttachmentClear(color) {
|
|
102
|
+
return Array.isArray(color) && typeof color[0] !== "number";
|
|
103
|
+
}
|
|
86
104
|
function colorDict(color) {
|
|
87
105
|
if (!color)
|
|
88
106
|
return DEFAULT_CLEAR_COLOR;
|
package/dist/passes/pass.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pass.js","sourceRoot":"","sources":["../../src/passes/pass.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pass.js","sourceRoot":"","sources":["../../src/passes/pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ColorAttachmentSpec, RenderTargetMultiSpec, RenderTargetN } from "./types.ts";
|
|
2
|
+
/** Creates an offscreen render target with N color textures and optional shared depth. */
|
|
3
|
+
export declare function renderTargetMulti<const Specs extends readonly ColorAttachmentSpec[]>(spec: RenderTargetMultiSpec<Specs>): Promise<RenderTargetN<Specs>>;
|
|
4
|
+
//# sourceMappingURL=render-target-multi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-target-multi.d.ts","sourceRoot":"","sources":["../../src/render-target/render-target-multi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAU7G,0FAA0F;AAC1F,wBAAsB,iBAAiB,CAAC,KAAK,CAAC,KAAK,SAAS,SAAS,mBAAmB,EAAE,EACxF,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAkD/B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ValidationError } from "@vgpu/core";
|
|
2
|
+
const DEFAULT_CLEAR_COLOR = Object.freeze({ r: 0, g: 0, b: 0, a: 1 });
|
|
3
|
+
const COLOR_RENDERABLE_FORMATS = new Set([
|
|
4
|
+
"r8unorm", "r8snorm", "r8uint", "r8sint", "rg8unorm", "rg8snorm", "rg8uint", "rg8sint",
|
|
5
|
+
"rgba8unorm", "rgba8unorm-srgb", "rgba8snorm", "rgba8uint", "rgba8sint", "bgra8unorm", "bgra8unorm-srgb",
|
|
6
|
+
"rgb10a2uint", "rgb10a2unorm", "rg11b10ufloat", "rg32uint", "rg32sint", "rg32float",
|
|
7
|
+
"rgba16uint", "rgba16sint", "rgba16float", "rgba32uint", "rgba32sint", "rgba32float",
|
|
8
|
+
]);
|
|
9
|
+
/** Creates an offscreen render target with N color textures and optional shared depth. */
|
|
10
|
+
export async function renderTargetMulti(spec) {
|
|
11
|
+
validateSpec(spec);
|
|
12
|
+
const size = [spec.size[0], spec.size[1]];
|
|
13
|
+
const depthFormat = spec.depth === true ? "depth24plus" : spec.depth || undefined;
|
|
14
|
+
const colors = spec.colors.map((color, index) => spec.device.createTexture({
|
|
15
|
+
size,
|
|
16
|
+
format: color.format,
|
|
17
|
+
usage: ["render_attachment", "texture_binding"],
|
|
18
|
+
sampleCount: 1,
|
|
19
|
+
label: color.label ?? childLabel(spec.label, `color${index}`),
|
|
20
|
+
}));
|
|
21
|
+
const depth = depthFormat ? spec.device.createTexture({
|
|
22
|
+
size,
|
|
23
|
+
format: depthFormat,
|
|
24
|
+
usage: ["render_attachment"],
|
|
25
|
+
sampleCount: 1,
|
|
26
|
+
label: childLabel(spec.label, "depth"),
|
|
27
|
+
}) : undefined;
|
|
28
|
+
const colorAttachments = Object.freeze(colors.map((color, index) => ({
|
|
29
|
+
view: color.createView(),
|
|
30
|
+
loadOp: "clear",
|
|
31
|
+
storeOp: "store",
|
|
32
|
+
clearValue: colorDict(spec.colors[index]?.clearColor),
|
|
33
|
+
})));
|
|
34
|
+
const depthStencilAttachment = depth ? {
|
|
35
|
+
view: depth.createView(),
|
|
36
|
+
depthLoadOp: "clear",
|
|
37
|
+
depthStoreOp: "store",
|
|
38
|
+
depthClearValue: 1,
|
|
39
|
+
} : undefined;
|
|
40
|
+
const colorTextures = Object.freeze(colors.map((color) => color.gpu));
|
|
41
|
+
const gpu = Object.freeze({
|
|
42
|
+
colorAttachments,
|
|
43
|
+
colorAttachment: colorAttachments[0],
|
|
44
|
+
depthStencilAttachment,
|
|
45
|
+
colorTexture: colorTextures[0],
|
|
46
|
+
colorTextures,
|
|
47
|
+
depthTexture: depth?.gpu,
|
|
48
|
+
});
|
|
49
|
+
const frozenColors = Object.freeze(colors);
|
|
50
|
+
return Object.freeze({
|
|
51
|
+
color: colors[0],
|
|
52
|
+
colors: frozenColors,
|
|
53
|
+
depth,
|
|
54
|
+
size,
|
|
55
|
+
format: spec.colors[0]?.format,
|
|
56
|
+
sampleCount: 1,
|
|
57
|
+
label: spec.label,
|
|
58
|
+
gpu,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function validateSpec(spec) {
|
|
62
|
+
if ("msaa" in spec)
|
|
63
|
+
throw invalidUsage("RenderTargetMultiSpec.msaa is not supported for MRT v2.");
|
|
64
|
+
if ("format" in spec)
|
|
65
|
+
throw invalidUsage("RenderTargetMultiSpec uses per-attachment colors[].format instead of top-level format.");
|
|
66
|
+
if ("clearColor" in spec)
|
|
67
|
+
throw invalidUsage("RenderTargetMultiSpec uses per-attachment colors[].clearColor instead of top-level clearColor.");
|
|
68
|
+
const size = spec.size;
|
|
69
|
+
if (size.length !== 2 || !size.every((value) => Number.isInteger(value) && value > 0)) {
|
|
70
|
+
throw invalidUsage("RenderTargetMultiSpec.size must be [width, height] with positive integer values.");
|
|
71
|
+
}
|
|
72
|
+
if (spec.colors.length < 1)
|
|
73
|
+
throw invalidUsage("RenderTargetMultiSpec.colors must contain at least one color attachment.");
|
|
74
|
+
const maxColorAttachments = spec.device.gpu.limits?.maxColorAttachments;
|
|
75
|
+
if (maxColorAttachments !== undefined && spec.colors.length > maxColorAttachments) {
|
|
76
|
+
throw invalidUsage(`RenderTargetMultiSpec.colors length ${spec.colors.length} exceeds device limit ${maxColorAttachments}.`);
|
|
77
|
+
}
|
|
78
|
+
for (const [index, color] of spec.colors.entries()) {
|
|
79
|
+
if (!COLOR_RENDERABLE_FORMATS.has(color.format)) {
|
|
80
|
+
throw invalidUsage(`RenderTargetMultiSpec.colors[${index}].format must be color-renderable; received ${color.format}.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function colorDict(color) {
|
|
85
|
+
if (!color)
|
|
86
|
+
return DEFAULT_CLEAR_COLOR;
|
|
87
|
+
if (Array.isArray(color))
|
|
88
|
+
return { r: color[0], g: color[1], b: color[2], a: color[3] };
|
|
89
|
+
return color;
|
|
90
|
+
}
|
|
91
|
+
function childLabel(label, suffix) {
|
|
92
|
+
return label ? `${label}.${suffix}` : undefined;
|
|
93
|
+
}
|
|
94
|
+
function invalidUsage(message) {
|
|
95
|
+
return new ValidationError({ code: "VGPU-CORE-INVALID-USAGE", message, where: "renderTargetMulti" });
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=render-target-multi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-target-multi.js","sourceRoot":"","sources":["../../src/render-target/render-target-multi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RenderTarget, RenderTargetSpec } from "./types.ts";
|
|
1
|
+
import type { ColorAttachmentSpec, RenderTarget, RenderTargetMultiSpec, RenderTargetN, RenderTargetSpec } from "./types.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Creates an offscreen render target with one sampleable color texture, optional
|
|
4
4
|
* depth, and optional MSAA resolve. Label propagation follows the locked v1
|
|
@@ -7,4 +7,5 @@ import type { RenderTarget, RenderTargetSpec } from "./types.ts";
|
|
|
7
7
|
* `.color` texture. Depth uses `${label}.depth`.
|
|
8
8
|
*/
|
|
9
9
|
export declare function renderTarget(spec: RenderTargetSpec): Promise<RenderTarget>;
|
|
10
|
+
export declare function renderTarget<const Specs extends readonly ColorAttachmentSpec[]>(spec: RenderTargetMultiSpec<Specs>): Promise<RenderTargetN<Specs>>;
|
|
10
11
|
//# sourceMappingURL=render-target.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-target.d.ts","sourceRoot":"","sources":["../../src/render-target/render-target.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-target.d.ts","sourceRoot":"","sources":["../../src/render-target/render-target.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAmB,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAW7I;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAC5E,wBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,SAAS,mBAAmB,EAAE,EAAE,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ValidationError } from "@vgpu/core";
|
|
2
|
+
import { renderTargetMulti } from "./render-target-multi.js";
|
|
2
3
|
const DEFAULT_FORMAT = "rgba8unorm";
|
|
3
4
|
const DEFAULT_CLEAR_COLOR = Object.freeze({ r: 0, g: 0, b: 0, a: 1 });
|
|
4
5
|
const COLOR_RENDERABLE_FORMATS = new Set([
|
|
@@ -7,14 +8,9 @@ const COLOR_RENDERABLE_FORMATS = new Set([
|
|
|
7
8
|
"rgb10a2uint", "rgb10a2unorm", "rg11b10ufloat", "rg32uint", "rg32sint", "rg32float",
|
|
8
9
|
"rgba16uint", "rgba16sint", "rgba16float", "rgba32uint", "rgba32sint", "rgba32float",
|
|
9
10
|
]);
|
|
10
|
-
/**
|
|
11
|
-
* Creates an offscreen render target with one sampleable color texture, optional
|
|
12
|
-
* depth, and optional MSAA resolve. Label propagation follows the locked v1
|
|
13
|
-
* decision: non-MSAA uses `${label}.color`; MSAA uses `${label}.color` for the
|
|
14
|
-
* multisample attachment and `${label}.color.resolve` for the exposed sampleable
|
|
15
|
-
* `.color` texture. Depth uses `${label}.depth`.
|
|
16
|
-
*/
|
|
17
11
|
export async function renderTarget(spec) {
|
|
12
|
+
if ("colors" in spec)
|
|
13
|
+
return renderTargetMulti(spec);
|
|
18
14
|
validateSpec(spec);
|
|
19
15
|
const format = spec.format ?? DEFAULT_FORMAT;
|
|
20
16
|
const depthFormat = spec.depth === true ? "depth24plus" : spec.depth || undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-target.js","sourceRoot":"","sources":["../../src/render-target/render-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"render-target.js","sourceRoot":"","sources":["../../src/render-target/render-target.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,8 @@ export interface RenderTargetGpu {
|
|
|
23
23
|
readonly resolveTexture?: GPUTexture;
|
|
24
24
|
readonly depthTexture?: GPUTexture;
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
export type ClearColor = GPUColorDict | readonly [number, number, number, number];
|
|
27
|
+
/** Options for creating a single-color render target. */
|
|
27
28
|
export interface RenderTargetSpec {
|
|
28
29
|
readonly device: Device;
|
|
29
30
|
readonly size: readonly [number, number];
|
|
@@ -31,8 +32,29 @@ export interface RenderTargetSpec {
|
|
|
31
32
|
readonly depth?: boolean | GPUTextureFormat;
|
|
32
33
|
readonly msaa?: boolean | 4;
|
|
33
34
|
readonly label?: string;
|
|
34
|
-
readonly clearColor?:
|
|
35
|
+
readonly clearColor?: ClearColor;
|
|
35
36
|
}
|
|
37
|
+
/** Per-attachment options for creating a multi-color render target. */
|
|
38
|
+
export interface ColorAttachmentSpec {
|
|
39
|
+
readonly format: GPUTextureFormat;
|
|
40
|
+
readonly clearColor?: ClearColor;
|
|
41
|
+
readonly label?: string;
|
|
42
|
+
}
|
|
43
|
+
/** Options for creating a multi-color render target. */
|
|
44
|
+
export interface RenderTargetMultiSpec<Specs extends readonly ColorAttachmentSpec[] = readonly ColorAttachmentSpec[]> {
|
|
45
|
+
readonly device: Device;
|
|
46
|
+
readonly size: readonly [number, number];
|
|
47
|
+
readonly colors: readonly [...Specs];
|
|
48
|
+
readonly depth?: boolean | GPUTextureFormat;
|
|
49
|
+
readonly label?: string;
|
|
50
|
+
}
|
|
51
|
+
/** RenderTarget narrowed to the tuple length of a RenderTargetMultiSpec. */
|
|
52
|
+
export type RenderTargetN<Specs extends readonly ColorAttachmentSpec[]> = Omit<RenderTarget, "colors" | "format"> & {
|
|
53
|
+
readonly colors: {
|
|
54
|
+
readonly [K in keyof Specs]: Texture;
|
|
55
|
+
};
|
|
56
|
+
readonly format: Specs extends readonly [infer First extends ColorAttachmentSpec, ...ColorAttachmentSpec[]] ? First["format"] : GPUTextureFormat;
|
|
57
|
+
};
|
|
36
58
|
/** Supported color target inputs for pass(). */
|
|
37
59
|
export type PassTarget = RenderTarget | Texture | GPUTextureView;
|
|
38
60
|
/** Options for rendering one material and mesh into a target. */
|
|
@@ -41,7 +63,7 @@ export interface PassSpec {
|
|
|
41
63
|
readonly mesh: Mesh;
|
|
42
64
|
readonly target: PassTarget;
|
|
43
65
|
readonly depthTarget?: Texture | GPUTextureView;
|
|
44
|
-
readonly clearColor?:
|
|
66
|
+
readonly clearColor?: ClearColor | readonly (ClearColor | undefined)[];
|
|
45
67
|
readonly colorLoadOp?: "clear" | "load";
|
|
46
68
|
readonly depthLoadOp?: "clear" | "load";
|
|
47
69
|
readonly depthClearValue?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/render-target/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;CAC/B;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACnE,uFAAuF;IACvF,QAAQ,CAAC,eAAe,EAAE,4BAA4B,CAAC;IACvD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,mCAAmC,CAAC;IACtE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;CACpC;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/render-target/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;CAC/B;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACnE,uFAAuF;IACvF,QAAQ,CAAC,eAAe,EAAE,4BAA4B,CAAC;IACvD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,mCAAmC,CAAC;IACtE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;CACpC;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAElF,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wDAAwD;AACxD,MAAM,WAAW,qBAAqB,CAAC,KAAK,SAAS,SAAS,mBAAmB,EAAE,GAAG,SAAS,mBAAmB,EAAE;IAClH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,SAAS,mBAAmB,EAAE,IACpE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG;IACxC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,KAAK,GAAG,OAAO;KAAE,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,KAAK,SAAS,SAAS,CAAC,MAAM,KAAK,SAAS,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAAC,GACvG,KAAK,CAAC,QAAQ,CAAC,GACf,gBAAgB,CAAC;CACtB,CAAC;AAEJ,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,cAAc,CAAC;AAEjE,iEAAiE;AACjE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;CAC7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vgpu/render",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Render pipeline + render pass abstractions for vgpu.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"webgpu",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
],
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"wgpu-matrix": "^3.4.2",
|
|
61
|
-
"@vgpu/core": "0.0.
|
|
61
|
+
"@vgpu/core": "0.0.3"
|
|
62
62
|
},
|
|
63
63
|
"vgpuExportBundleBudgetsGzipBytes": {
|
|
64
64
|
".": 49152,
|
package/src/RenderPass.docs.md
CHANGED
|
@@ -39,3 +39,45 @@ pass.setVertexBuffer(0, vertices);
|
|
|
39
39
|
pass.draw({ vertexCount: 3 });
|
|
40
40
|
pass.end();
|
|
41
41
|
```
|
|
42
|
+
|
|
43
|
+
## Multiple render targets
|
|
44
|
+
|
|
45
|
+
`@vgpu/render/passes` supports offscreen MRT through `renderTargetMulti()` or the
|
|
46
|
+
`renderTarget({ colors })` overload. Each color attachment declares its own
|
|
47
|
+
format, optional label, and default clear color; depth is shared and MSAA remains
|
|
48
|
+
single-color only in this release.
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
const gbuffer = await renderTargetMulti({
|
|
52
|
+
device,
|
|
53
|
+
size: [1024, 768],
|
|
54
|
+
colors: [
|
|
55
|
+
{ format: "rgba8unorm", label: "albedo" },
|
|
56
|
+
{ format: "rgba8unorm", label: "normal", clearColor: [0.5, 0.5, 1, 1] },
|
|
57
|
+
],
|
|
58
|
+
depth: true,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
pass({ mesh, material: gbufferMaterial, target: gbuffer });
|
|
62
|
+
pass({
|
|
63
|
+
mesh: fullscreenQuad,
|
|
64
|
+
material: compositeMaterial(gbuffer.colors[0], gbuffer.colors[1]),
|
|
65
|
+
target: finalColor,
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`pass().clearColor` accepts either a scalar color, which broadcasts to every MRT
|
|
70
|
+
attachment, or an array whose length matches `target.colors.length`. Scalar
|
|
71
|
+
`colorLoadOp`, `depthLoadOp`, and `depthClearValue` are also broadcast/shared.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
pass({
|
|
75
|
+
mesh,
|
|
76
|
+
material: pickingMaterial,
|
|
77
|
+
target: pickingTarget,
|
|
78
|
+
clearColor: [
|
|
79
|
+
[0, 0, 0, 1], // visible color
|
|
80
|
+
[0, 0, 0, 1], // entity-id buffer, packed into rgba8unorm for snapshots
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
```
|
|
@@ -32,6 +32,34 @@ struct Uniforms {
|
|
|
32
32
|
|
|
33
33
|
Your shader reads fields as `uniforms.fieldName`. Provide `vs_main` and `fs_main` entry points.
|
|
34
34
|
|
|
35
|
+
Texture and sampler declarations are not injected by default. If your material
|
|
36
|
+
uses `textures` / `samplers`, either write the `@group/@binding var` lines in
|
|
37
|
+
your WGSL source, prepend `getMaterialDeclarations(spec)` yourself, or pass
|
|
38
|
+
`autoDeclarations: true` to keep the generated declarations hidden in the
|
|
39
|
+
runtime shader string. Enabling `autoDeclarations: true` while also writing the
|
|
40
|
+
same declarations manually will fail shader compilation with a WGSL redeclare
|
|
41
|
+
error.
|
|
42
|
+
|
|
43
|
+
Binding allocation order is a public contract: uniforms first, then samplers,
|
|
44
|
+
then textures, each in insertion order. Binding 0 is the uniform buffer when
|
|
45
|
+
`uniforms` has fields; otherwise samplers start at 0. When a texture needs the
|
|
46
|
+
implicit `materialSampler`, that sampler is allocated before explicit sampler
|
|
47
|
+
keys. Texture declarations produced by `getMaterialDeclarations()` and
|
|
48
|
+
`wgslDeclarations()` never include the `Uniforms` struct.
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
const spec = {
|
|
52
|
+
device,
|
|
53
|
+
vertex,
|
|
54
|
+
fragment,
|
|
55
|
+
uniforms: {},
|
|
56
|
+
textures: { albedo: "texture_2d_f32" },
|
|
57
|
+
vertexLayout: "position-uv",
|
|
58
|
+
} as const;
|
|
59
|
+
const declarations = getMaterialDeclarations(spec);
|
|
60
|
+
const mat = material({ ...spec, fragment: `${declarations}\n${fragment}` });
|
|
61
|
+
```
|
|
62
|
+
|
|
35
63
|
## Example
|
|
36
64
|
|
|
37
65
|
```ts
|