@motion-core/motion-gpu 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -0
- package/dist/advanced.d.ts +1 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +14 -6
- package/dist/core/advanced.d.ts +1 -0
- package/dist/core/advanced.d.ts.map +1 -0
- package/dist/core/advanced.js +14 -5
- package/dist/core/compute-shader.d.ts +87 -0
- package/dist/core/compute-shader.d.ts.map +1 -0
- package/dist/core/compute-shader.js +205 -0
- package/dist/core/compute-shader.js.map +1 -0
- package/dist/core/current-value.d.ts +1 -0
- package/dist/core/current-value.d.ts.map +1 -0
- package/dist/core/current-value.js +35 -34
- package/dist/core/current-value.js.map +1 -0
- package/dist/core/error-diagnostics.d.ts +1 -0
- package/dist/core/error-diagnostics.d.ts.map +1 -0
- package/dist/core/error-diagnostics.js +70 -137
- package/dist/core/error-diagnostics.js.map +1 -0
- package/dist/core/error-report.d.ts +2 -1
- package/dist/core/error-report.d.ts.map +1 -0
- package/dist/core/error-report.js +247 -233
- package/dist/core/error-report.js.map +1 -0
- package/dist/core/frame-registry.d.ts +1 -0
- package/dist/core/frame-registry.d.ts.map +1 -0
- package/dist/core/frame-registry.js +546 -662
- package/dist/core/frame-registry.js.map +1 -0
- package/dist/core/index.d.ts +6 -2
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -12
- package/dist/core/material-preprocess.d.ts +1 -0
- package/dist/core/material-preprocess.d.ts.map +1 -0
- package/dist/core/material-preprocess.js +131 -152
- package/dist/core/material-preprocess.js.map +1 -0
- package/dist/core/material.d.ts +23 -6
- package/dist/core/material.d.ts.map +1 -0
- package/dist/core/material.js +290 -317
- package/dist/core/material.js.map +1 -0
- package/dist/core/recompile-policy.d.ts +1 -0
- package/dist/core/recompile-policy.d.ts.map +1 -0
- package/dist/core/recompile-policy.js +18 -13
- package/dist/core/recompile-policy.js.map +1 -0
- package/dist/core/render-graph.d.ts +8 -3
- package/dist/core/render-graph.d.ts.map +1 -0
- package/dist/core/render-graph.js +77 -68
- package/dist/core/render-graph.js.map +1 -0
- package/dist/core/render-targets.d.ts +1 -0
- package/dist/core/render-targets.d.ts.map +1 -0
- package/dist/core/render-targets.js +52 -53
- package/dist/core/render-targets.js.map +1 -0
- package/dist/core/renderer.d.ts +1 -0
- package/dist/core/renderer.d.ts.map +1 -0
- package/dist/core/renderer.js +1337 -1081
- package/dist/core/renderer.js.map +1 -0
- package/dist/core/runtime-loop.d.ts +3 -2
- package/dist/core/runtime-loop.d.ts.map +1 -0
- package/dist/core/runtime-loop.js +353 -362
- package/dist/core/runtime-loop.js.map +1 -0
- package/dist/core/scheduler-helpers.d.ts +1 -0
- package/dist/core/scheduler-helpers.d.ts.map +1 -0
- package/dist/core/scheduler-helpers.js +52 -51
- package/dist/core/scheduler-helpers.js.map +1 -0
- package/dist/core/shader.d.ts +10 -1
- package/dist/core/shader.d.ts.map +1 -0
- package/dist/core/shader.js +109 -115
- package/dist/core/shader.js.map +1 -0
- package/dist/core/storage-buffers.d.ts +37 -0
- package/dist/core/storage-buffers.d.ts.map +1 -0
- package/dist/core/storage-buffers.js +95 -0
- package/dist/core/storage-buffers.js.map +1 -0
- package/dist/core/texture-loader.d.ts +1 -0
- package/dist/core/texture-loader.d.ts.map +1 -0
- package/dist/core/texture-loader.js +209 -273
- package/dist/core/texture-loader.js.map +1 -0
- package/dist/core/textures.d.ts +13 -0
- package/dist/core/textures.d.ts.map +1 -0
- package/dist/core/textures.js +111 -116
- package/dist/core/textures.js.map +1 -0
- package/dist/core/types.d.ts +147 -4
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +0 -4
- package/dist/core/uniforms.d.ts +1 -0
- package/dist/core/uniforms.d.ts.map +1 -0
- package/dist/core/uniforms.js +170 -191
- package/dist/core/uniforms.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -6
- package/dist/passes/BlitPass.d.ts +1 -0
- package/dist/passes/BlitPass.d.ts.map +1 -0
- package/dist/passes/BlitPass.js +23 -18
- package/dist/passes/BlitPass.js.map +1 -0
- package/dist/passes/ComputePass.d.ts +83 -0
- package/dist/passes/ComputePass.d.ts.map +1 -0
- package/dist/passes/ComputePass.js +92 -0
- package/dist/passes/ComputePass.js.map +1 -0
- package/dist/passes/CopyPass.d.ts +1 -0
- package/dist/passes/CopyPass.d.ts.map +1 -0
- package/dist/passes/CopyPass.js +58 -52
- package/dist/passes/CopyPass.js.map +1 -0
- package/dist/passes/FullscreenPass.d.ts +1 -0
- package/dist/passes/FullscreenPass.d.ts.map +1 -0
- package/dist/passes/FullscreenPass.js +127 -130
- package/dist/passes/FullscreenPass.js.map +1 -0
- package/dist/passes/PingPongComputePass.d.ts +104 -0
- package/dist/passes/PingPongComputePass.d.ts.map +1 -0
- package/dist/passes/PingPongComputePass.js +132 -0
- package/dist/passes/PingPongComputePass.js.map +1 -0
- package/dist/passes/ShaderPass.d.ts +1 -0
- package/dist/passes/ShaderPass.d.ts.map +1 -0
- package/dist/passes/ShaderPass.js +41 -37
- package/dist/passes/ShaderPass.js.map +1 -0
- package/dist/passes/index.d.ts +3 -0
- package/dist/passes/index.d.ts.map +1 -0
- package/dist/passes/index.js +6 -3
- package/dist/react/FragCanvas.d.ts +3 -2
- package/dist/react/FragCanvas.d.ts.map +1 -0
- package/dist/react/FragCanvas.js +234 -211
- package/dist/react/FragCanvas.js.map +1 -0
- package/dist/react/MotionGPUErrorOverlay.d.ts +1 -0
- package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -0
- package/dist/react/MotionGPUErrorOverlay.js +200 -14
- package/dist/react/MotionGPUErrorOverlay.js.map +1 -0
- package/dist/react/Portal.d.ts +1 -0
- package/dist/react/Portal.d.ts.map +1 -0
- package/dist/react/Portal.js +18 -21
- package/dist/react/Portal.js.map +1 -0
- package/dist/react/advanced.d.ts +1 -0
- package/dist/react/advanced.d.ts.map +1 -0
- package/dist/react/advanced.js +14 -6
- package/dist/react/frame-context.d.ts +1 -0
- package/dist/react/frame-context.d.ts.map +1 -0
- package/dist/react/frame-context.js +88 -94
- package/dist/react/frame-context.js.map +1 -0
- package/dist/react/index.d.ts +6 -2
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +12 -9
- package/dist/react/motiongpu-context.d.ts +1 -0
- package/dist/react/motiongpu-context.d.ts.map +1 -0
- package/dist/react/motiongpu-context.js +18 -15
- package/dist/react/motiongpu-context.js.map +1 -0
- package/dist/react/use-motiongpu-user-context.d.ts +1 -0
- package/dist/react/use-motiongpu-user-context.d.ts.map +1 -0
- package/dist/react/use-motiongpu-user-context.js +83 -82
- package/dist/react/use-motiongpu-user-context.js.map +1 -0
- package/dist/react/use-texture.d.ts +1 -0
- package/dist/react/use-texture.d.ts.map +1 -0
- package/dist/react/use-texture.js +132 -152
- package/dist/react/use-texture.js.map +1 -0
- package/dist/svelte/FragCanvas.svelte +2 -2
- package/dist/svelte/FragCanvas.svelte.d.ts +3 -2
- package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
- package/dist/svelte/MotionGPUErrorOverlay.svelte +137 -7
- package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts +1 -0
- package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -0
- package/dist/svelte/Portal.svelte.d.ts +1 -0
- package/dist/svelte/Portal.svelte.d.ts.map +1 -0
- package/dist/svelte/advanced.d.ts +1 -0
- package/dist/svelte/advanced.d.ts.map +1 -0
- package/dist/svelte/advanced.js +13 -6
- package/dist/svelte/frame-context.d.ts +1 -0
- package/dist/svelte/frame-context.d.ts.map +1 -0
- package/dist/svelte/frame-context.js +27 -27
- package/dist/svelte/frame-context.js.map +1 -0
- package/dist/svelte/index.d.ts +6 -2
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +12 -9
- package/dist/svelte/motiongpu-context.d.ts +1 -0
- package/dist/svelte/motiongpu-context.d.ts.map +1 -0
- package/dist/svelte/motiongpu-context.js +24 -21
- package/dist/svelte/motiongpu-context.js.map +1 -0
- package/dist/svelte/use-motiongpu-user-context.d.ts +1 -0
- package/dist/svelte/use-motiongpu-user-context.d.ts.map +1 -0
- package/dist/svelte/use-motiongpu-user-context.js +69 -70
- package/dist/svelte/use-motiongpu-user-context.js.map +1 -0
- package/dist/svelte/use-texture.d.ts +1 -0
- package/dist/svelte/use-texture.d.ts.map +1 -0
- package/dist/svelte/use-texture.js +125 -147
- package/dist/svelte/use-texture.js.map +1 -0
- package/package.json +12 -7
- package/src/lib/advanced.ts +6 -0
- package/src/lib/core/advanced.ts +12 -0
- package/src/lib/core/compute-shader.ts +326 -0
- package/src/lib/core/current-value.ts +64 -0
- package/src/lib/core/error-diagnostics.ts +236 -0
- package/src/lib/core/error-report.ts +535 -0
- package/src/lib/core/frame-registry.ts +1190 -0
- package/src/lib/core/index.ts +94 -0
- package/src/lib/core/material-preprocess.ts +295 -0
- package/src/lib/core/material.ts +748 -0
- package/src/lib/core/recompile-policy.ts +31 -0
- package/src/lib/core/render-graph.ts +173 -0
- package/src/lib/core/render-targets.ts +107 -0
- package/src/lib/core/renderer.ts +2161 -0
- package/src/lib/core/runtime-loop.ts +537 -0
- package/src/lib/core/scheduler-helpers.ts +136 -0
- package/src/lib/core/shader.ts +301 -0
- package/src/lib/core/storage-buffers.ts +142 -0
- package/src/lib/core/texture-loader.ts +482 -0
- package/src/lib/core/textures.ts +257 -0
- package/src/lib/core/types.ts +743 -0
- package/src/lib/core/uniforms.ts +282 -0
- package/src/lib/index.ts +6 -0
- package/src/lib/passes/BlitPass.ts +54 -0
- package/src/lib/passes/ComputePass.ts +136 -0
- package/src/lib/passes/CopyPass.ts +80 -0
- package/src/lib/passes/FullscreenPass.ts +173 -0
- package/src/lib/passes/PingPongComputePass.ts +180 -0
- package/src/lib/passes/ShaderPass.ts +89 -0
- package/src/lib/passes/index.ts +9 -0
- package/src/lib/react/FragCanvas.tsx +345 -0
- package/src/lib/react/MotionGPUErrorOverlay.tsx +524 -0
- package/src/lib/react/Portal.tsx +34 -0
- package/src/lib/react/advanced.ts +36 -0
- package/src/lib/react/frame-context.ts +169 -0
- package/src/lib/react/index.ts +68 -0
- package/src/lib/react/motiongpu-context.ts +88 -0
- package/src/lib/react/use-motiongpu-user-context.ts +186 -0
- package/src/lib/react/use-texture.ts +233 -0
- package/src/lib/svelte/FragCanvas.svelte +249 -0
- package/src/lib/svelte/MotionGPUErrorOverlay.svelte +512 -0
- package/src/lib/svelte/Portal.svelte +31 -0
- package/src/lib/svelte/advanced.ts +32 -0
- package/src/lib/svelte/frame-context.ts +87 -0
- package/src/lib/svelte/index.ts +68 -0
- package/src/lib/svelte/motiongpu-context.ts +97 -0
- package/src/lib/svelte/use-motiongpu-user-context.ts +145 -0
- package/src/lib/svelte/use-texture.ts +232 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { assertComputeContract, extractWorkgroupSize } from "../core/compute-shader.js";
|
|
2
|
+
//#region src/lib/passes/PingPongComputePass.ts
|
|
3
|
+
/**
|
|
4
|
+
* Ping-pong compute pass for iterative GPU simulations.
|
|
5
|
+
*
|
|
6
|
+
* Manages two texture buffers (A/B) and alternates between them each iteration,
|
|
7
|
+
* enabling read-from-previous-write patterns commonly used in fluid simulations,
|
|
8
|
+
* reaction-diffusion, and particle systems.
|
|
9
|
+
*/
|
|
10
|
+
var PingPongComputePass = class PingPongComputePass {
|
|
11
|
+
/**
|
|
12
|
+
* Enables/disables this pass without removing it from graph.
|
|
13
|
+
*/
|
|
14
|
+
enabled;
|
|
15
|
+
/**
|
|
16
|
+
* Discriminant flag for render graph to identify compute passes.
|
|
17
|
+
*/
|
|
18
|
+
isCompute = true;
|
|
19
|
+
/**
|
|
20
|
+
* Discriminant flag to identify ping-pong compute passes.
|
|
21
|
+
*/
|
|
22
|
+
isPingPong = true;
|
|
23
|
+
compute;
|
|
24
|
+
target;
|
|
25
|
+
iterations;
|
|
26
|
+
dispatch;
|
|
27
|
+
workgroupSize;
|
|
28
|
+
frameCount = 0;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
assertComputeContract(options.compute);
|
|
31
|
+
const workgroupSize = extractWorkgroupSize(options.compute);
|
|
32
|
+
this.compute = options.compute;
|
|
33
|
+
this.target = options.target;
|
|
34
|
+
this.iterations = PingPongComputePass.assertIterations(options.iterations ?? 1);
|
|
35
|
+
this.dispatch = options.dispatch ?? "auto";
|
|
36
|
+
this.enabled = options.enabled ?? true;
|
|
37
|
+
this.workgroupSize = workgroupSize;
|
|
38
|
+
}
|
|
39
|
+
static assertIterations(count) {
|
|
40
|
+
if (!Number.isFinite(count) || count < 1 || !Number.isInteger(count)) throw new Error(`PingPongComputePass iterations must be a positive integer >= 1, got ${count}`);
|
|
41
|
+
return count;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the texture key holding the latest result.
|
|
45
|
+
* Alternates between `{target}A` and `{target}B` based on total iteration parity.
|
|
46
|
+
*/
|
|
47
|
+
getCurrentOutput() {
|
|
48
|
+
return this.frameCount * this.iterations % 2 === 0 ? `${this.target}A` : `${this.target}B`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Advances the internal frame counter (called by renderer after each frame's iterations).
|
|
52
|
+
*/
|
|
53
|
+
advanceFrame() {
|
|
54
|
+
this.frameCount += 1;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Replaces compute shader and updates workgroup size.
|
|
58
|
+
*/
|
|
59
|
+
setCompute(compute) {
|
|
60
|
+
assertComputeContract(compute);
|
|
61
|
+
const workgroupSize = extractWorkgroupSize(compute);
|
|
62
|
+
this.compute = compute;
|
|
63
|
+
this.workgroupSize = workgroupSize;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Updates iteration count.
|
|
67
|
+
*
|
|
68
|
+
* @param count - Must be >= 1.
|
|
69
|
+
*/
|
|
70
|
+
setIterations(count) {
|
|
71
|
+
this.iterations = PingPongComputePass.assertIterations(count);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Updates dispatch strategy.
|
|
75
|
+
*/
|
|
76
|
+
setDispatch(dispatch) {
|
|
77
|
+
this.dispatch = dispatch ?? "auto";
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the target texture key.
|
|
81
|
+
*/
|
|
82
|
+
getTarget() {
|
|
83
|
+
return this.target;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns the current iteration count.
|
|
87
|
+
*/
|
|
88
|
+
getIterations() {
|
|
89
|
+
return this.iterations;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns current compute shader source.
|
|
93
|
+
*/
|
|
94
|
+
getCompute() {
|
|
95
|
+
return this.compute;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns parsed workgroup size.
|
|
99
|
+
*/
|
|
100
|
+
getWorkgroupSize() {
|
|
101
|
+
return [...this.workgroupSize];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Resolves dispatch workgroup counts for current frame.
|
|
105
|
+
*/
|
|
106
|
+
resolveDispatch(ctx) {
|
|
107
|
+
if (this.dispatch === "auto") return [
|
|
108
|
+
Math.ceil(ctx.width / this.workgroupSize[0]),
|
|
109
|
+
Math.ceil(ctx.height / this.workgroupSize[1]),
|
|
110
|
+
Math.ceil(1 / this.workgroupSize[2])
|
|
111
|
+
];
|
|
112
|
+
if (typeof this.dispatch === "function") return this.dispatch(ctx);
|
|
113
|
+
if (Array.isArray(this.dispatch)) return [
|
|
114
|
+
this.dispatch[0],
|
|
115
|
+
this.dispatch[1] ?? 1,
|
|
116
|
+
this.dispatch[2] ?? 1
|
|
117
|
+
];
|
|
118
|
+
return [
|
|
119
|
+
1,
|
|
120
|
+
1,
|
|
121
|
+
1
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Releases resources (no-op, GPU lifecycle is renderer-managed).
|
|
126
|
+
*/
|
|
127
|
+
dispose() {}
|
|
128
|
+
};
|
|
129
|
+
//#endregion
|
|
130
|
+
export { PingPongComputePass };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=PingPongComputePass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PingPongComputePass.js","names":[],"sources":["../../src/lib/passes/PingPongComputePass.ts"],"sourcesContent":["import { assertComputeContract, extractWorkgroupSize } from '../core/compute-shader.js';\nimport type { ComputePassOptions, ComputeDispatchContext } from './ComputePass.js';\n\n/**\n * Options for constructing a `PingPongComputePass`.\n */\nexport interface PingPongComputePassOptions {\n\t/**\n\t * Compute shader WGSL source code.\n\t */\n\tcompute: string;\n\t/**\n\t * Target texture key from `material.textures`.\n\t * The engine will auto-generate `{target}A` and `{target}B` bindings.\n\t */\n\ttarget: string;\n\t/**\n\t * Number of compute iterations per frame. Default: 1.\n\t */\n\titerations?: number;\n\t/**\n\t * Dispatch workgroup counts (same as ComputePass).\n\t */\n\tdispatch?: ComputePassOptions['dispatch'];\n\t/**\n\t * Enables/disables this pass.\n\t */\n\tenabled?: boolean;\n}\n\n/**\n * Ping-pong compute pass for iterative GPU simulations.\n *\n * Manages two texture buffers (A/B) and alternates between them each iteration,\n * enabling read-from-previous-write patterns commonly used in fluid simulations,\n * reaction-diffusion, and particle systems.\n */\nexport class PingPongComputePass {\n\t/**\n\t * Enables/disables this pass without removing it from graph.\n\t */\n\tenabled: boolean;\n\n\t/**\n\t * Discriminant flag for render graph to identify compute passes.\n\t */\n\treadonly isCompute = true as const;\n\n\t/**\n\t * Discriminant flag to identify ping-pong compute passes.\n\t */\n\treadonly isPingPong = true as const;\n\n\tprivate compute: string;\n\tprivate target: string;\n\tprivate iterations: number;\n\tprivate dispatch: ComputePassOptions['dispatch'];\n\tprivate workgroupSize: [number, number, number];\n\tprivate frameCount: number = 0;\n\n\tconstructor(options: PingPongComputePassOptions) {\n\t\tassertComputeContract(options.compute);\n\t\tconst workgroupSize = extractWorkgroupSize(options.compute);\n\t\tthis.compute = options.compute;\n\t\tthis.target = options.target;\n\t\tthis.iterations = PingPongComputePass.assertIterations(options.iterations ?? 1);\n\t\tthis.dispatch = options.dispatch ?? 'auto';\n\t\tthis.enabled = options.enabled ?? true;\n\t\tthis.workgroupSize = workgroupSize;\n\t}\n\n\tprivate static assertIterations(count: number): number {\n\t\tif (!Number.isFinite(count) || count < 1 || !Number.isInteger(count)) {\n\t\t\tthrow new Error(\n\t\t\t\t`PingPongComputePass iterations must be a positive integer >= 1, got ${count}`\n\t\t\t);\n\t\t}\n\t\treturn count;\n\t}\n\n\t/**\n\t * Returns the texture key holding the latest result.\n\t * Alternates between `{target}A` and `{target}B` based on total iteration parity.\n\t */\n\tgetCurrentOutput(): string {\n\t\tconst totalIterations = this.frameCount * this.iterations;\n\t\treturn totalIterations % 2 === 0 ? `${this.target}A` : `${this.target}B`;\n\t}\n\n\t/**\n\t * Advances the internal frame counter (called by renderer after each frame's iterations).\n\t */\n\tadvanceFrame(): void {\n\t\tthis.frameCount += 1;\n\t}\n\n\t/**\n\t * Replaces compute shader and updates workgroup size.\n\t */\n\tsetCompute(compute: string): void {\n\t\tassertComputeContract(compute);\n\t\tconst workgroupSize = extractWorkgroupSize(compute);\n\t\tthis.compute = compute;\n\t\tthis.workgroupSize = workgroupSize;\n\t}\n\n\t/**\n\t * Updates iteration count.\n\t *\n\t * @param count - Must be >= 1.\n\t */\n\tsetIterations(count: number): void {\n\t\tthis.iterations = PingPongComputePass.assertIterations(count);\n\t}\n\n\t/**\n\t * Updates dispatch strategy.\n\t */\n\tsetDispatch(dispatch: ComputePassOptions['dispatch']): void {\n\t\tthis.dispatch = dispatch ?? 'auto';\n\t}\n\n\t/**\n\t * Returns the target texture key.\n\t */\n\tgetTarget(): string {\n\t\treturn this.target;\n\t}\n\n\t/**\n\t * Returns the current iteration count.\n\t */\n\tgetIterations(): number {\n\t\treturn this.iterations;\n\t}\n\n\t/**\n\t * Returns current compute shader source.\n\t */\n\tgetCompute(): string {\n\t\treturn this.compute;\n\t}\n\n\t/**\n\t * Returns parsed workgroup size.\n\t */\n\tgetWorkgroupSize(): [number, number, number] {\n\t\treturn [...this.workgroupSize];\n\t}\n\n\t/**\n\t * Resolves dispatch workgroup counts for current frame.\n\t */\n\tresolveDispatch(ctx: ComputeDispatchContext): [number, number, number] {\n\t\tif (this.dispatch === 'auto') {\n\t\t\treturn [\n\t\t\t\tMath.ceil(ctx.width / this.workgroupSize[0]),\n\t\t\t\tMath.ceil(ctx.height / this.workgroupSize[1]),\n\t\t\t\tMath.ceil(1 / this.workgroupSize[2])\n\t\t\t];\n\t\t}\n\n\t\tif (typeof this.dispatch === 'function') {\n\t\t\treturn this.dispatch(ctx);\n\t\t}\n\n\t\tif (Array.isArray(this.dispatch)) {\n\t\t\treturn [this.dispatch[0], this.dispatch[1] ?? 1, this.dispatch[2] ?? 1];\n\t\t}\n\n\t\treturn [1, 1, 1];\n\t}\n\n\t/**\n\t * Releases resources (no-op, GPU lifecycle is renderer-managed).\n\t */\n\tdispose(): void {\n\t\t// No-op\n\t}\n}\n"],"mappings":";;;;;;;;;AAqCA,IAAa,sBAAb,MAAa,oBAAoB;;;;CAIhC;;;;CAKA,YAAqB;;;;CAKrB,aAAsB;CAEtB;CACA;CACA;CACA;CACA;CACA,aAA6B;CAE7B,YAAY,SAAqC;AAChD,wBAAsB,QAAQ,QAAQ;EACtC,MAAM,gBAAgB,qBAAqB,QAAQ,QAAQ;AAC3D,OAAK,UAAU,QAAQ;AACvB,OAAK,SAAS,QAAQ;AACtB,OAAK,aAAa,oBAAoB,iBAAiB,QAAQ,cAAc,EAAE;AAC/E,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,gBAAgB;;CAGtB,OAAe,iBAAiB,OAAuB;AACtD,MAAI,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,KAAK,CAAC,OAAO,UAAU,MAAM,CACnE,OAAM,IAAI,MACT,uEAAuE,QACvE;AAEF,SAAO;;;;;;CAOR,mBAA2B;AAE1B,SADwB,KAAK,aAAa,KAAK,aACtB,MAAM,IAAI,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,OAAO;;;;;CAMvE,eAAqB;AACpB,OAAK,cAAc;;;;;CAMpB,WAAW,SAAuB;AACjC,wBAAsB,QAAQ;EAC9B,MAAM,gBAAgB,qBAAqB,QAAQ;AACnD,OAAK,UAAU;AACf,OAAK,gBAAgB;;;;;;;CAQtB,cAAc,OAAqB;AAClC,OAAK,aAAa,oBAAoB,iBAAiB,MAAM;;;;;CAM9D,YAAY,UAAgD;AAC3D,OAAK,WAAW,YAAY;;;;;CAM7B,YAAoB;AACnB,SAAO,KAAK;;;;;CAMb,gBAAwB;AACvB,SAAO,KAAK;;;;;CAMb,aAAqB;AACpB,SAAO,KAAK;;;;;CAMb,mBAA6C;AAC5C,SAAO,CAAC,GAAG,KAAK,cAAc;;;;;CAM/B,gBAAgB,KAAuD;AACtE,MAAI,KAAK,aAAa,OACrB,QAAO;GACN,KAAK,KAAK,IAAI,QAAQ,KAAK,cAAc,GAAG;GAC5C,KAAK,KAAK,IAAI,SAAS,KAAK,cAAc,GAAG;GAC7C,KAAK,KAAK,IAAI,KAAK,cAAc,GAAG;GACpC;AAGF,MAAI,OAAO,KAAK,aAAa,WAC5B,QAAO,KAAK,SAAS,IAAI;AAG1B,MAAI,MAAM,QAAQ,KAAK,SAAS,CAC/B,QAAO;GAAC,KAAK,SAAS;GAAI,KAAK,SAAS,MAAM;GAAG,KAAK,SAAS,MAAM;GAAE;AAGxE,SAAO;GAAC;GAAG;GAAG;GAAE;;;;;CAMjB,UAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderPass.d.ts","sourceRoot":"","sources":["../../src/lib/passes/ShaderPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAKjF,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC/D,QAAQ,EAAE,MAAM,CAAC;CACjB;AA2CD;;GAEG;AACH,qBAAa,UAAW,SAAQ,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,iBAAiB;IAMtC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOnC,WAAW,IAAI,MAAM;IAIrB,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,qBAAqB,IAAI,MAAM;CAGzC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { FullscreenPass } from
|
|
2
|
-
|
|
1
|
+
import { FullscreenPass } from "./FullscreenPass.js";
|
|
2
|
+
//#region src/lib/passes/ShaderPass.ts
|
|
3
|
+
var SHADER_PASS_CONTRACT = /\bfn\s+shade\s*\(\s*inputColor\s*:\s*vec4f\s*,\s*uv\s*:\s*vec2f\s*\)\s*->\s*vec4f/;
|
|
3
4
|
function buildShaderPassProgram(fragment) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
return `
|
|
5
|
+
if (!SHADER_PASS_CONTRACT.test(fragment)) throw new Error("ShaderPass fragment must declare `fn shade(inputColor: vec4f, uv: vec2f) -> vec4f`.");
|
|
6
|
+
return `
|
|
8
7
|
struct MotionGPUVertexOut {
|
|
9
8
|
@builtin(position) position: vec4f,
|
|
10
9
|
@location(0) uv: vec2f,
|
|
@@ -38,34 +37,39 @@ fn motiongpuShaderPassFragment(in: MotionGPUVertexOut) -> @location(0) vec4f {
|
|
|
38
37
|
`;
|
|
39
38
|
}
|
|
40
39
|
/**
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
40
|
+
* Fullscreen programmable shader pass.
|
|
41
|
+
*/
|
|
42
|
+
var ShaderPass = class extends FullscreenPass {
|
|
43
|
+
fragment;
|
|
44
|
+
program;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
super(options);
|
|
47
|
+
this.fragment = options.fragment;
|
|
48
|
+
this.program = buildShaderPassProgram(options.fragment);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Replaces current shader fragment and invalidates pipeline cache.
|
|
52
|
+
*/
|
|
53
|
+
setFragment(fragment) {
|
|
54
|
+
const nextProgram = buildShaderPassProgram(fragment);
|
|
55
|
+
this.fragment = fragment;
|
|
56
|
+
this.program = nextProgram;
|
|
57
|
+
this.invalidateFullscreenCache();
|
|
58
|
+
}
|
|
59
|
+
getFragment() {
|
|
60
|
+
return this.fragment;
|
|
61
|
+
}
|
|
62
|
+
getProgram() {
|
|
63
|
+
return this.program;
|
|
64
|
+
}
|
|
65
|
+
getVertexEntryPoint() {
|
|
66
|
+
return "motiongpuShaderPassVertex";
|
|
67
|
+
}
|
|
68
|
+
getFragmentEntryPoint() {
|
|
69
|
+
return "motiongpuShaderPassFragment";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
73
|
+
export { ShaderPass };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=ShaderPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderPass.js","names":[],"sources":["../../src/lib/passes/ShaderPass.ts"],"sourcesContent":["import { FullscreenPass, type FullscreenPassOptions } from './FullscreenPass.js';\n\nconst SHADER_PASS_CONTRACT =\n\t/\\bfn\\s+shade\\s*\\(\\s*inputColor\\s*:\\s*vec4f\\s*,\\s*uv\\s*:\\s*vec2f\\s*\\)\\s*->\\s*vec4f/;\n\nexport interface ShaderPassOptions extends FullscreenPassOptions {\n\tfragment: string;\n}\n\nfunction buildShaderPassProgram(fragment: string): string {\n\tif (!SHADER_PASS_CONTRACT.test(fragment)) {\n\t\tthrow new Error(\n\t\t\t'ShaderPass fragment must declare `fn shade(inputColor: vec4f, uv: vec2f) -> vec4f`.'\n\t\t);\n\t}\n\n\treturn `\nstruct MotionGPUVertexOut {\n\t@builtin(position) position: vec4f,\n\t@location(0) uv: vec2f,\n};\n\n@group(0) @binding(0) var motiongpuShaderPassSampler: sampler;\n@group(0) @binding(1) var motiongpuShaderPassTexture: texture_2d<f32>;\n\n@vertex\nfn motiongpuShaderPassVertex(@builtin(vertex_index) index: u32) -> MotionGPUVertexOut {\n\tvar positions = array<vec2f, 3>(\n\t\tvec2f(-1.0, -3.0),\n\t\tvec2f(-1.0, 1.0),\n\t\tvec2f(3.0, 1.0)\n\t);\n\n\tlet position = positions[index];\n\tvar out: MotionGPUVertexOut;\n\tout.position = vec4f(position, 0.0, 1.0);\n\tout.uv = (position + vec2f(1.0, 1.0)) * 0.5;\n\treturn out;\n}\n\n${fragment}\n\n@fragment\nfn motiongpuShaderPassFragment(in: MotionGPUVertexOut) -> @location(0) vec4f {\n\tlet inputColor = textureSample(motiongpuShaderPassTexture, motiongpuShaderPassSampler, in.uv);\n\treturn shade(inputColor, in.uv);\n}\n`;\n}\n\n/**\n * Fullscreen programmable shader pass.\n */\nexport class ShaderPass extends FullscreenPass {\n\tprivate fragment: string;\n\tprivate program: string;\n\n\tconstructor(options: ShaderPassOptions) {\n\t\tsuper(options);\n\t\tthis.fragment = options.fragment;\n\t\tthis.program = buildShaderPassProgram(options.fragment);\n\t}\n\n\t/**\n\t * Replaces current shader fragment and invalidates pipeline cache.\n\t */\n\tsetFragment(fragment: string): void {\n\t\tconst nextProgram = buildShaderPassProgram(fragment);\n\t\tthis.fragment = fragment;\n\t\tthis.program = nextProgram;\n\t\tthis.invalidateFullscreenCache();\n\t}\n\n\tgetFragment(): string {\n\t\treturn this.fragment;\n\t}\n\n\tprotected getProgram(): string {\n\t\treturn this.program;\n\t}\n\n\tprotected getVertexEntryPoint(): string {\n\t\treturn 'motiongpuShaderPassVertex';\n\t}\n\n\tprotected getFragmentEntryPoint(): string {\n\t\treturn 'motiongpuShaderPassFragment';\n\t}\n}\n"],"mappings":";;AAEA,IAAM,uBACL;AAMD,SAAS,uBAAuB,UAA0B;AACzD,KAAI,CAAC,qBAAqB,KAAK,SAAS,CACvC,OAAM,IAAI,MACT,sFACA;AAGF,QAAO;;;;;;;;;;;;;;;;;;;;;;;;EAwBN,SAAS;;;;;;;;;;;;AAaX,IAAa,aAAb,cAAgC,eAAe;CAC9C;CACA;CAEA,YAAY,SAA4B;AACvC,QAAM,QAAQ;AACd,OAAK,WAAW,QAAQ;AACxB,OAAK,UAAU,uBAAuB,QAAQ,SAAS;;;;;CAMxD,YAAY,UAAwB;EACnC,MAAM,cAAc,uBAAuB,SAAS;AACpD,OAAK,WAAW;AAChB,OAAK,UAAU;AACf,OAAK,2BAA2B;;CAGjC,cAAsB;AACrB,SAAO,KAAK;;CAGb,aAA+B;AAC9B,SAAO,KAAK;;CAGb,sBAAwC;AACvC,SAAO;;CAGR,wBAA0C;AACzC,SAAO"}
|
package/dist/passes/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { BlitPass, type BlitPassOptions } from './BlitPass.js';
|
|
2
2
|
export { CopyPass, type CopyPassOptions } from './CopyPass.js';
|
|
3
3
|
export { ShaderPass, type ShaderPassOptions } from './ShaderPass.js';
|
|
4
|
+
export { ComputePass, type ComputePassOptions, type ComputeDispatchContext } from './ComputePass.js';
|
|
5
|
+
export { PingPongComputePass, type PingPongComputePassOptions } from './PingPongComputePass.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACN,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/passes/index.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { BlitPass } from "./BlitPass.js";
|
|
2
|
+
import { CopyPass } from "./CopyPass.js";
|
|
3
|
+
import { ShaderPass } from "./ShaderPass.js";
|
|
4
|
+
import { ComputePass } from "./ComputePass.js";
|
|
5
|
+
import { PingPongComputePass } from "./PingPongComputePass.js";
|
|
6
|
+
export { BlitPass, ComputePass, CopyPass, PingPongComputePass, ShaderPass };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/// <reference types="@webgpu/types" />
|
|
2
2
|
import { type MotionGPUErrorReport } from '../core/error-report.js';
|
|
3
3
|
import type { FragMaterial } from '../core/material.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { AnyPass, OutputColorSpace, RenderMode, RenderTargetDefinitionMap } from '../core/types.js';
|
|
5
5
|
import { type CSSProperties, type ReactNode } from 'react';
|
|
6
6
|
export interface FragCanvasProps {
|
|
7
7
|
material: FragMaterial;
|
|
8
8
|
renderTargets?: RenderTargetDefinitionMap;
|
|
9
|
-
passes?:
|
|
9
|
+
passes?: AnyPass[];
|
|
10
10
|
clearColor?: [number, number, number, number];
|
|
11
11
|
outputColorSpace?: OutputColorSpace;
|
|
12
12
|
renderMode?: RenderMode;
|
|
@@ -25,3 +25,4 @@ export interface FragCanvasProps {
|
|
|
25
25
|
children?: ReactNode;
|
|
26
26
|
}
|
|
27
27
|
export declare function FragCanvas({ material, renderTargets, passes, clearColor, outputColorSpace, renderMode, autoRender, maxDelta, adapterOptions, deviceDescriptor, dpr, showErrorOverlay, errorRenderer, onError, errorHistoryLimit, onErrorHistory, className, style, children }: FragCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=FragCanvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FragCanvas.d.ts","sourceRoot":"","sources":["../../src/lib/react/FragCanvas.tsx"],"names":[],"mappings":";AACA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EACX,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,yBAAyB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA+B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKxF,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,CAAC,EAAE,yBAAyB,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,SAAS,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACrB;AA0HD,wBAAgB,UAAU,CAAC,EAC1B,QAAQ,EACR,aAAkB,EAClB,MAAW,EACX,UAAyB,EACzB,gBAAyB,EACzB,UAAqB,EACrB,UAAiB,EACjB,QAAc,EACd,cAA0B,EAC1B,gBAA4B,EAC5B,GAAqB,EACrB,gBAAuB,EACvB,aAAa,EACb,OAAmB,EACnB,iBAAqB,EACrB,cAA0B,EAC1B,SAAc,EACd,KAAK,EACL,QAAQ,EACR,EAAE,eAAe,2CAsKjB"}
|