@motion-core/motion-gpu 0.4.0 → 0.4.2
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/advanced.d.ts +1 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +12 -6
- package/dist/core/advanced.d.ts +1 -0
- package/dist/core/advanced.d.ts.map +1 -0
- package/dist/core/advanced.js +12 -5
- 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 +1 -0
- package/dist/core/error-report.d.ts.map +1 -0
- package/dist/core/error-report.js +184 -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 +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -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 +128 -151
- package/dist/core/material-preprocess.js.map +1 -0
- package/dist/core/material.d.ts +1 -0
- package/dist/core/material.d.ts.map +1 -0
- package/dist/core/material.js +263 -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 +1 -0
- package/dist/core/render-graph.d.ts.map +1 -0
- package/dist/core/render-graph.js +61 -68
- package/dist/core/render-graph.js.map +1 -0
- package/dist/core/render-targets.d.ts +2 -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 +942 -1081
- package/dist/core/renderer.js.map +1 -0
- package/dist/core/runtime-loop.d.ts +2 -0
- package/dist/core/runtime-loop.d.ts.map +1 -0
- package/dist/core/runtime-loop.js +305 -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 +1 -0
- package/dist/core/shader.d.ts.map +1 -0
- package/dist/core/shader.js +92 -117
- package/dist/core/shader.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 +205 -273
- package/dist/core/texture-loader.js.map +1 -0
- package/dist/core/textures.d.ts +2 -0
- package/dist/core/textures.d.ts.map +1 -0
- package/dist/core/textures.js +106 -116
- package/dist/core/textures.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- 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 +11 -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/CopyPass.d.ts +2 -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 +2 -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/ShaderPass.d.ts +1 -0
- package/dist/passes/ShaderPass.d.ts.map +1 -0
- package/dist/passes/ShaderPass.js +40 -37
- package/dist/passes/ShaderPass.js.map +1 -0
- package/dist/passes/index.d.ts +1 -0
- package/dist/passes/index.d.ts.map +1 -0
- package/dist/passes/index.js +4 -3
- package/dist/react/FragCanvas.d.ts +2 -0
- 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 +384 -48
- 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 +12 -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 +1 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +10 -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.d.ts +2 -0
- package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
- package/dist/svelte/MotionGPUErrorOverlay.svelte +17 -20
- 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 +11 -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 +1 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +10 -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 +15 -7
- package/src/lib/advanced.ts +6 -0
- package/src/lib/core/advanced.ts +12 -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 +406 -0
- package/src/lib/core/frame-registry.ts +1189 -0
- package/src/lib/core/index.ts +77 -0
- package/src/lib/core/material-preprocess.ts +284 -0
- package/src/lib/core/material.ts +667 -0
- package/src/lib/core/recompile-policy.ts +31 -0
- package/src/lib/core/render-graph.ts +143 -0
- package/src/lib/core/render-targets.ts +107 -0
- package/src/lib/core/renderer.ts +1547 -0
- package/src/lib/core/runtime-loop.ts +458 -0
- package/src/lib/core/scheduler-helpers.ts +136 -0
- package/src/lib/core/shader.ts +258 -0
- package/src/lib/core/texture-loader.ts +476 -0
- package/src/lib/core/textures.ts +235 -0
- package/src/lib/core/types.ts +582 -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/CopyPass.ts +80 -0
- package/src/lib/passes/FullscreenPass.ts +173 -0
- package/src/lib/passes/ShaderPass.ts +88 -0
- package/src/lib/passes/index.ts +3 -0
- package/src/lib/react/MotionGPUErrorOverlay.tsx +392 -0
- package/src/lib/react/advanced.ts +36 -0
- package/src/lib/react/frame-context.ts +169 -0
- package/src/lib/react/index.ts +51 -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 +382 -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 +51 -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
- package/dist/react/MotionGPUErrorOverlay.tsx +0 -129
- /package/{dist → src/lib}/react/FragCanvas.tsx +0 -0
- /package/{dist → src/lib}/react/Portal.tsx +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopyPass.js","names":[],"sources":["../../src/lib/passes/CopyPass.ts"],"sourcesContent":["import type {\n\tRenderPass,\n\tRenderPassContext,\n\tRenderPassFlags,\n\tRenderPassInputSlot,\n\tRenderPassOutputSlot\n} from '../core/types.js';\nimport { BlitPass } from './BlitPass.js';\n\nexport interface CopyPassOptions extends RenderPassFlags {\n\tenabled?: boolean;\n\tneedsSwap?: boolean;\n\tinput?: RenderPassInputSlot;\n\toutput?: RenderPassOutputSlot;\n\tfilter?: GPUFilterMode;\n}\n\n/**\n * Texture copy pass with fullscreen-blit fallback.\n */\nexport class CopyPass implements RenderPass {\n\tenabled: boolean;\n\tneedsSwap: boolean;\n\tinput: RenderPassInputSlot;\n\toutput: RenderPassOutputSlot;\n\tclear: boolean;\n\tclearColor: [number, number, number, number];\n\tpreserve: boolean;\n\tprivate readonly fallbackBlit: BlitPass;\n\n\tconstructor(options: CopyPassOptions = {}) {\n\t\tthis.enabled = options.enabled ?? true;\n\t\tthis.needsSwap = options.needsSwap ?? true;\n\t\tthis.input = options.input ?? 'source';\n\t\tthis.output = options.output ?? (this.needsSwap ? 'target' : 'source');\n\t\tthis.clear = options.clear ?? false;\n\t\tthis.clearColor = options.clearColor ?? [0, 0, 0, 1];\n\t\tthis.preserve = options.preserve ?? true;\n\t\tthis.fallbackBlit = new BlitPass({\n\t\t\tenabled: true,\n\t\t\tneedsSwap: false,\n\t\t\tinput: this.input,\n\t\t\toutput: this.output,\n\t\t\t...(options.filter !== undefined ? { filter: options.filter } : {})\n\t\t});\n\t}\n\n\tsetSize(width: number, height: number): void {\n\t\tthis.fallbackBlit.setSize(width, height);\n\t}\n\n\trender(context: RenderPassContext): void {\n\t\tconst source = context.input;\n\t\tconst target = context.output;\n\t\tconst canDirectCopy =\n\t\t\tcontext.clear === false &&\n\t\t\tcontext.preserve === true &&\n\t\t\tsource.texture !== target.texture &&\n\t\t\tsource.texture !== context.canvas.texture &&\n\t\t\ttarget.texture !== context.canvas.texture &&\n\t\t\tsource.width === target.width &&\n\t\t\tsource.height === target.height &&\n\t\t\tsource.format === target.format;\n\n\t\tif (canDirectCopy) {\n\t\t\tcontext.commandEncoder.copyTextureToTexture(\n\t\t\t\t{ texture: source.texture },\n\t\t\t\t{ texture: target.texture },\n\t\t\t\t{ width: source.width, height: source.height, depthOrArrayLayers: 1 }\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fallbackBlit.render(context);\n\t}\n\n\tdispose(): void {\n\t\tthis.fallbackBlit.dispose();\n\t}\n}\n"],"mappings":";;;;;AAoBA,IAAa,WAAb,MAA4C;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,UAA2B,EAAE,EAAE;AAC1C,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,YAAY,QAAQ,aAAa;AACtC,OAAK,QAAQ,QAAQ,SAAS;AAC9B,OAAK,SAAS,QAAQ,WAAW,KAAK,YAAY,WAAW;AAC7D,OAAK,QAAQ,QAAQ,SAAS;AAC9B,OAAK,aAAa,QAAQ,cAAc;GAAC;GAAG;GAAG;GAAG;GAAE;AACpD,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,eAAe,IAAI,SAAS;GAChC,SAAS;GACT,WAAW;GACX,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,QAAQ,GAAG,EAAE;GAClE,CAAC;;CAGH,QAAQ,OAAe,QAAsB;AAC5C,OAAK,aAAa,QAAQ,OAAO,OAAO;;CAGzC,OAAO,SAAkC;EACxC,MAAM,SAAS,QAAQ;EACvB,MAAM,SAAS,QAAQ;AAWvB,MATC,QAAQ,UAAU,SAClB,QAAQ,aAAa,QACrB,OAAO,YAAY,OAAO,WAC1B,OAAO,YAAY,QAAQ,OAAO,WAClC,OAAO,YAAY,QAAQ,OAAO,WAClC,OAAO,UAAU,OAAO,SACxB,OAAO,WAAW,OAAO,UACzB,OAAO,WAAW,OAAO,QAEP;AAClB,WAAQ,eAAe,qBACtB,EAAE,SAAS,OAAO,SAAS,EAC3B,EAAE,SAAS,OAAO,SAAS,EAC3B;IAAE,OAAO,OAAO;IAAO,QAAQ,OAAO;IAAQ,oBAAoB;IAAG,CACrE;AACD;;AAGD,OAAK,aAAa,OAAO,QAAQ;;CAGlC,UAAgB;AACf,OAAK,aAAa,SAAS"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
1
2
|
import type { RenderPass, RenderPassContext, RenderPassFlags, RenderPassInputSlot, RenderPassOutputSlot } from '../core/types.js';
|
|
2
3
|
export interface FullscreenPassOptions extends RenderPassFlags {
|
|
3
4
|
enabled?: boolean;
|
|
@@ -35,3 +36,4 @@ export declare abstract class FullscreenPass implements RenderPass {
|
|
|
35
36
|
render(context: RenderPassContext): void;
|
|
36
37
|
dispose(): void;
|
|
37
38
|
}
|
|
39
|
+
//# sourceMappingURL=FullscreenPass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FullscreenPass.d.ts","sourceRoot":"","sources":["../../src/lib/passes/FullscreenPass.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACX,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;GAEG;AACH,8BAAsB,cAAe,YAAW,UAAU;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkD;IACnF,OAAO,CAAC,eAAe,CAA+C;IAEtE,SAAS,aAAa,OAAO,GAAE,qBAA0B;IAWzD,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,MAAM;IACvC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM;IAChD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,MAAM;IAElD,SAAS,CAAC,yBAAyB,IAAI,IAAI;IAM3C,OAAO,CAAC,eAAe;IA6EvB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5C,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAwB5D,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIxC,OAAO,IAAI,IAAI;CAMf"}
|
|
@@ -1,131 +1,128 @@
|
|
|
1
|
+
//#region src/lib/passes/FullscreenPass.ts
|
|
1
2
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this.bindGroupLayout = null;
|
|
129
|
-
this.invalidateFullscreenCache();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
3
|
+
* Shared base for fullscreen texture sampling passes.
|
|
4
|
+
*/
|
|
5
|
+
var FullscreenPass = class {
|
|
6
|
+
enabled;
|
|
7
|
+
needsSwap;
|
|
8
|
+
input;
|
|
9
|
+
output;
|
|
10
|
+
clear;
|
|
11
|
+
clearColor;
|
|
12
|
+
preserve;
|
|
13
|
+
filter;
|
|
14
|
+
device = null;
|
|
15
|
+
sampler = null;
|
|
16
|
+
bindGroupLayout = null;
|
|
17
|
+
shaderModule = null;
|
|
18
|
+
pipelineByFormat = /* @__PURE__ */ new Map();
|
|
19
|
+
bindGroupByView = /* @__PURE__ */ new WeakMap();
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.enabled = options.enabled ?? true;
|
|
22
|
+
this.needsSwap = options.needsSwap ?? true;
|
|
23
|
+
this.input = options.input ?? "source";
|
|
24
|
+
this.output = options.output ?? (this.needsSwap ? "target" : "source");
|
|
25
|
+
this.clear = options.clear ?? false;
|
|
26
|
+
this.clearColor = options.clearColor ?? [
|
|
27
|
+
0,
|
|
28
|
+
0,
|
|
29
|
+
0,
|
|
30
|
+
1
|
|
31
|
+
];
|
|
32
|
+
this.preserve = options.preserve ?? true;
|
|
33
|
+
this.filter = options.filter ?? "linear";
|
|
34
|
+
}
|
|
35
|
+
invalidateFullscreenCache() {
|
|
36
|
+
this.shaderModule = null;
|
|
37
|
+
this.pipelineByFormat.clear();
|
|
38
|
+
this.bindGroupByView = /* @__PURE__ */ new WeakMap();
|
|
39
|
+
}
|
|
40
|
+
ensureResources(device, format) {
|
|
41
|
+
if (this.device !== device) {
|
|
42
|
+
this.device = device;
|
|
43
|
+
this.sampler = null;
|
|
44
|
+
this.bindGroupLayout = null;
|
|
45
|
+
this.invalidateFullscreenCache();
|
|
46
|
+
}
|
|
47
|
+
if (!this.sampler) this.sampler = device.createSampler({
|
|
48
|
+
magFilter: this.filter,
|
|
49
|
+
minFilter: this.filter,
|
|
50
|
+
addressModeU: "clamp-to-edge",
|
|
51
|
+
addressModeV: "clamp-to-edge"
|
|
52
|
+
});
|
|
53
|
+
if (!this.bindGroupLayout) this.bindGroupLayout = device.createBindGroupLayout({ entries: [{
|
|
54
|
+
binding: 0,
|
|
55
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
56
|
+
sampler: { type: "filtering" }
|
|
57
|
+
}, {
|
|
58
|
+
binding: 1,
|
|
59
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
60
|
+
texture: {
|
|
61
|
+
sampleType: "float",
|
|
62
|
+
viewDimension: "2d",
|
|
63
|
+
multisampled: false
|
|
64
|
+
}
|
|
65
|
+
}] });
|
|
66
|
+
if (!this.shaderModule) this.shaderModule = device.createShaderModule({ code: this.getProgram() });
|
|
67
|
+
let pipeline = this.pipelineByFormat.get(format);
|
|
68
|
+
if (!pipeline) {
|
|
69
|
+
const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] });
|
|
70
|
+
pipeline = device.createRenderPipeline({
|
|
71
|
+
layout: pipelineLayout,
|
|
72
|
+
vertex: {
|
|
73
|
+
module: this.shaderModule,
|
|
74
|
+
entryPoint: this.getVertexEntryPoint()
|
|
75
|
+
},
|
|
76
|
+
fragment: {
|
|
77
|
+
module: this.shaderModule,
|
|
78
|
+
entryPoint: this.getFragmentEntryPoint(),
|
|
79
|
+
targets: [{ format }]
|
|
80
|
+
},
|
|
81
|
+
primitive: { topology: "triangle-list" }
|
|
82
|
+
});
|
|
83
|
+
this.pipelineByFormat.set(format, pipeline);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
sampler: this.sampler,
|
|
87
|
+
bindGroupLayout: this.bindGroupLayout,
|
|
88
|
+
pipeline
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
setSize(width, height) {}
|
|
92
|
+
renderFullscreen(context) {
|
|
93
|
+
const { sampler, bindGroupLayout, pipeline } = this.ensureResources(context.device, context.output.format);
|
|
94
|
+
const inputView = context.input.view;
|
|
95
|
+
let bindGroup = this.bindGroupByView.get(inputView);
|
|
96
|
+
if (!bindGroup) {
|
|
97
|
+
bindGroup = context.device.createBindGroup({
|
|
98
|
+
layout: bindGroupLayout,
|
|
99
|
+
entries: [{
|
|
100
|
+
binding: 0,
|
|
101
|
+
resource: sampler
|
|
102
|
+
}, {
|
|
103
|
+
binding: 1,
|
|
104
|
+
resource: inputView
|
|
105
|
+
}]
|
|
106
|
+
});
|
|
107
|
+
this.bindGroupByView.set(inputView, bindGroup);
|
|
108
|
+
}
|
|
109
|
+
const pass = context.beginRenderPass();
|
|
110
|
+
pass.setPipeline(pipeline);
|
|
111
|
+
pass.setBindGroup(0, bindGroup);
|
|
112
|
+
pass.draw(3);
|
|
113
|
+
pass.end();
|
|
114
|
+
}
|
|
115
|
+
render(context) {
|
|
116
|
+
this.renderFullscreen(context);
|
|
117
|
+
}
|
|
118
|
+
dispose() {
|
|
119
|
+
this.device = null;
|
|
120
|
+
this.sampler = null;
|
|
121
|
+
this.bindGroupLayout = null;
|
|
122
|
+
this.invalidateFullscreenCache();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
//#endregion
|
|
126
|
+
export { FullscreenPass };
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=FullscreenPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FullscreenPass.js","names":[],"sources":["../../src/lib/passes/FullscreenPass.ts"],"sourcesContent":["import type {\n\tRenderPass,\n\tRenderPassContext,\n\tRenderPassFlags,\n\tRenderPassInputSlot,\n\tRenderPassOutputSlot\n} from '../core/types.js';\n\nexport interface FullscreenPassOptions extends RenderPassFlags {\n\tenabled?: boolean;\n\tneedsSwap?: boolean;\n\tinput?: RenderPassInputSlot;\n\toutput?: RenderPassOutputSlot;\n\tfilter?: GPUFilterMode;\n}\n\n/**\n * Shared base for fullscreen texture sampling passes.\n */\nexport abstract class FullscreenPass implements RenderPass {\n\tenabled: boolean;\n\tneedsSwap: boolean;\n\tinput: RenderPassInputSlot;\n\toutput: RenderPassOutputSlot;\n\tclear: boolean;\n\tclearColor: [number, number, number, number];\n\tpreserve: boolean;\n\tprivate readonly filter: GPUFilterMode;\n\tprivate device: GPUDevice | null = null;\n\tprivate sampler: GPUSampler | null = null;\n\tprivate bindGroupLayout: GPUBindGroupLayout | null = null;\n\tprivate shaderModule: GPUShaderModule | null = null;\n\tprivate readonly pipelineByFormat = new Map<GPUTextureFormat, GPURenderPipeline>();\n\tprivate bindGroupByView = new WeakMap<GPUTextureView, GPUBindGroup>();\n\n\tprotected constructor(options: FullscreenPassOptions = {}) {\n\t\tthis.enabled = options.enabled ?? true;\n\t\tthis.needsSwap = options.needsSwap ?? true;\n\t\tthis.input = options.input ?? 'source';\n\t\tthis.output = options.output ?? (this.needsSwap ? 'target' : 'source');\n\t\tthis.clear = options.clear ?? false;\n\t\tthis.clearColor = options.clearColor ?? [0, 0, 0, 1];\n\t\tthis.preserve = options.preserve ?? true;\n\t\tthis.filter = options.filter ?? 'linear';\n\t}\n\n\tprotected abstract getProgram(): string;\n\tprotected abstract getVertexEntryPoint(): string;\n\tprotected abstract getFragmentEntryPoint(): string;\n\n\tprotected invalidateFullscreenCache(): void {\n\t\tthis.shaderModule = null;\n\t\tthis.pipelineByFormat.clear();\n\t\tthis.bindGroupByView = new WeakMap();\n\t}\n\n\tprivate ensureResources(\n\t\tdevice: GPUDevice,\n\t\tformat: GPUTextureFormat\n\t): {\n\t\tsampler: GPUSampler;\n\t\tbindGroupLayout: GPUBindGroupLayout;\n\t\tpipeline: GPURenderPipeline;\n\t} {\n\t\tif (this.device !== device) {\n\t\t\tthis.device = device;\n\t\t\tthis.sampler = null;\n\t\t\tthis.bindGroupLayout = null;\n\t\t\tthis.invalidateFullscreenCache();\n\t\t}\n\n\t\tif (!this.sampler) {\n\t\t\tthis.sampler = device.createSampler({\n\t\t\t\tmagFilter: this.filter,\n\t\t\t\tminFilter: this.filter,\n\t\t\t\taddressModeU: 'clamp-to-edge',\n\t\t\t\taddressModeV: 'clamp-to-edge'\n\t\t\t});\n\t\t}\n\n\t\tif (!this.bindGroupLayout) {\n\t\t\tthis.bindGroupLayout = device.createBindGroupLayout({\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\t\tsampler: { type: 'filtering' }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\t\ttexture: {\n\t\t\t\t\t\t\tsampleType: 'float',\n\t\t\t\t\t\t\tviewDimension: '2d',\n\t\t\t\t\t\t\tmultisampled: false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t}\n\n\t\tif (!this.shaderModule) {\n\t\t\tthis.shaderModule = device.createShaderModule({ code: this.getProgram() });\n\t\t}\n\n\t\tlet pipeline = this.pipelineByFormat.get(format);\n\t\tif (!pipeline) {\n\t\t\tconst pipelineLayout = device.createPipelineLayout({\n\t\t\t\tbindGroupLayouts: [this.bindGroupLayout]\n\t\t\t});\n\t\t\tpipeline = device.createRenderPipeline({\n\t\t\t\tlayout: pipelineLayout,\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule: this.shaderModule,\n\t\t\t\t\tentryPoint: this.getVertexEntryPoint()\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule: this.shaderModule,\n\t\t\t\t\tentryPoint: this.getFragmentEntryPoint(),\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: 'triangle-list' }\n\t\t\t});\n\t\t\tthis.pipelineByFormat.set(format, pipeline);\n\t\t}\n\n\t\treturn {\n\t\t\tsampler: this.sampler,\n\t\t\tbindGroupLayout: this.bindGroupLayout,\n\t\t\tpipeline\n\t\t};\n\t}\n\n\tsetSize(width: number, height: number): void {\n\t\tvoid width;\n\t\tvoid height;\n\t}\n\n\tprotected renderFullscreen(context: RenderPassContext): void {\n\t\tconst { sampler, bindGroupLayout, pipeline } = this.ensureResources(\n\t\t\tcontext.device,\n\t\t\tcontext.output.format\n\t\t);\n\t\tconst inputView = context.input.view;\n\t\tlet bindGroup = this.bindGroupByView.get(inputView);\n\t\tif (!bindGroup) {\n\t\t\tbindGroup = context.device.createBindGroup({\n\t\t\t\tlayout: bindGroupLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{ binding: 0, resource: sampler },\n\t\t\t\t\t{ binding: 1, resource: inputView }\n\t\t\t\t]\n\t\t\t});\n\t\t\tthis.bindGroupByView.set(inputView, bindGroup);\n\t\t}\n\t\tconst pass = context.beginRenderPass();\n\t\tpass.setPipeline(pipeline);\n\t\tpass.setBindGroup(0, bindGroup);\n\t\tpass.draw(3);\n\t\tpass.end();\n\t}\n\n\trender(context: RenderPassContext): void {\n\t\tthis.renderFullscreen(context);\n\t}\n\n\tdispose(): void {\n\t\tthis.device = null;\n\t\tthis.sampler = null;\n\t\tthis.bindGroupLayout = null;\n\t\tthis.invalidateFullscreenCache();\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -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;IAMnC,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,38 @@ 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
|
+
this.fragment = fragment;
|
|
55
|
+
this.program = buildShaderPassProgram(fragment);
|
|
56
|
+
this.invalidateFullscreenCache();
|
|
57
|
+
}
|
|
58
|
+
getFragment() {
|
|
59
|
+
return this.fragment;
|
|
60
|
+
}
|
|
61
|
+
getProgram() {
|
|
62
|
+
return this.program;
|
|
63
|
+
}
|
|
64
|
+
getVertexEntryPoint() {
|
|
65
|
+
return "motiongpuShaderPassVertex";
|
|
66
|
+
}
|
|
67
|
+
getFragmentEntryPoint() {
|
|
68
|
+
return "motiongpuShaderPassFragment";
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
//#endregion
|
|
72
|
+
export { ShaderPass };
|
|
73
|
+
|
|
74
|
+
//# 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\tthis.fragment = fragment;\n\t\tthis.program = buildShaderPassProgram(fragment);\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;AACnC,OAAK,WAAW;AAChB,OAAK,UAAU,uBAAuB,SAAS;AAC/C,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
|
@@ -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"}
|
package/dist/passes/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { BlitPass } from "./BlitPass.js";
|
|
2
|
+
import { CopyPass } from "./CopyPass.js";
|
|
3
|
+
import { ShaderPass } from "./ShaderPass.js";
|
|
4
|
+
export { BlitPass, CopyPass, ShaderPass };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
1
2
|
import { type MotionGPUErrorReport } from '../core/error-report.js';
|
|
2
3
|
import type { FragMaterial } from '../core/material.js';
|
|
3
4
|
import type { OutputColorSpace, RenderPass, RenderMode, RenderTargetDefinitionMap } from '../core/types.js';
|
|
@@ -24,3 +25,4 @@ export interface FragCanvasProps {
|
|
|
24
25
|
children?: ReactNode;
|
|
25
26
|
}
|
|
26
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,gBAAgB,EAChB,UAAU,EACV,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,UAAU,EAAE,CAAC;IACtB,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"}
|