@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.
Files changed (207) hide show
  1. package/dist/advanced.d.ts +1 -0
  2. package/dist/advanced.d.ts.map +1 -0
  3. package/dist/advanced.js +12 -6
  4. package/dist/core/advanced.d.ts +1 -0
  5. package/dist/core/advanced.d.ts.map +1 -0
  6. package/dist/core/advanced.js +12 -5
  7. package/dist/core/current-value.d.ts +1 -0
  8. package/dist/core/current-value.d.ts.map +1 -0
  9. package/dist/core/current-value.js +35 -34
  10. package/dist/core/current-value.js.map +1 -0
  11. package/dist/core/error-diagnostics.d.ts +1 -0
  12. package/dist/core/error-diagnostics.d.ts.map +1 -0
  13. package/dist/core/error-diagnostics.js +70 -137
  14. package/dist/core/error-diagnostics.js.map +1 -0
  15. package/dist/core/error-report.d.ts +1 -0
  16. package/dist/core/error-report.d.ts.map +1 -0
  17. package/dist/core/error-report.js +184 -233
  18. package/dist/core/error-report.js.map +1 -0
  19. package/dist/core/frame-registry.d.ts +1 -0
  20. package/dist/core/frame-registry.d.ts.map +1 -0
  21. package/dist/core/frame-registry.js +546 -662
  22. package/dist/core/frame-registry.js.map +1 -0
  23. package/dist/core/index.d.ts +1 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +11 -12
  26. package/dist/core/material-preprocess.d.ts +1 -0
  27. package/dist/core/material-preprocess.d.ts.map +1 -0
  28. package/dist/core/material-preprocess.js +128 -151
  29. package/dist/core/material-preprocess.js.map +1 -0
  30. package/dist/core/material.d.ts +1 -0
  31. package/dist/core/material.d.ts.map +1 -0
  32. package/dist/core/material.js +263 -317
  33. package/dist/core/material.js.map +1 -0
  34. package/dist/core/recompile-policy.d.ts +1 -0
  35. package/dist/core/recompile-policy.d.ts.map +1 -0
  36. package/dist/core/recompile-policy.js +18 -13
  37. package/dist/core/recompile-policy.js.map +1 -0
  38. package/dist/core/render-graph.d.ts +1 -0
  39. package/dist/core/render-graph.d.ts.map +1 -0
  40. package/dist/core/render-graph.js +61 -68
  41. package/dist/core/render-graph.js.map +1 -0
  42. package/dist/core/render-targets.d.ts +2 -0
  43. package/dist/core/render-targets.d.ts.map +1 -0
  44. package/dist/core/render-targets.js +52 -53
  45. package/dist/core/render-targets.js.map +1 -0
  46. package/dist/core/renderer.d.ts +1 -0
  47. package/dist/core/renderer.d.ts.map +1 -0
  48. package/dist/core/renderer.js +942 -1081
  49. package/dist/core/renderer.js.map +1 -0
  50. package/dist/core/runtime-loop.d.ts +2 -0
  51. package/dist/core/runtime-loop.d.ts.map +1 -0
  52. package/dist/core/runtime-loop.js +305 -362
  53. package/dist/core/runtime-loop.js.map +1 -0
  54. package/dist/core/scheduler-helpers.d.ts +1 -0
  55. package/dist/core/scheduler-helpers.d.ts.map +1 -0
  56. package/dist/core/scheduler-helpers.js +52 -51
  57. package/dist/core/scheduler-helpers.js.map +1 -0
  58. package/dist/core/shader.d.ts +1 -0
  59. package/dist/core/shader.d.ts.map +1 -0
  60. package/dist/core/shader.js +92 -117
  61. package/dist/core/shader.js.map +1 -0
  62. package/dist/core/texture-loader.d.ts +1 -0
  63. package/dist/core/texture-loader.d.ts.map +1 -0
  64. package/dist/core/texture-loader.js +205 -273
  65. package/dist/core/texture-loader.js.map +1 -0
  66. package/dist/core/textures.d.ts +2 -0
  67. package/dist/core/textures.d.ts.map +1 -0
  68. package/dist/core/textures.js +106 -116
  69. package/dist/core/textures.js.map +1 -0
  70. package/dist/core/types.d.ts +2 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +0 -4
  73. package/dist/core/uniforms.d.ts +1 -0
  74. package/dist/core/uniforms.d.ts.map +1 -0
  75. package/dist/core/uniforms.js +170 -191
  76. package/dist/core/uniforms.js.map +1 -0
  77. package/dist/index.d.ts +1 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +11 -6
  80. package/dist/passes/BlitPass.d.ts +1 -0
  81. package/dist/passes/BlitPass.d.ts.map +1 -0
  82. package/dist/passes/BlitPass.js +23 -18
  83. package/dist/passes/BlitPass.js.map +1 -0
  84. package/dist/passes/CopyPass.d.ts +2 -0
  85. package/dist/passes/CopyPass.d.ts.map +1 -0
  86. package/dist/passes/CopyPass.js +58 -52
  87. package/dist/passes/CopyPass.js.map +1 -0
  88. package/dist/passes/FullscreenPass.d.ts +2 -0
  89. package/dist/passes/FullscreenPass.d.ts.map +1 -0
  90. package/dist/passes/FullscreenPass.js +127 -130
  91. package/dist/passes/FullscreenPass.js.map +1 -0
  92. package/dist/passes/ShaderPass.d.ts +1 -0
  93. package/dist/passes/ShaderPass.d.ts.map +1 -0
  94. package/dist/passes/ShaderPass.js +40 -37
  95. package/dist/passes/ShaderPass.js.map +1 -0
  96. package/dist/passes/index.d.ts +1 -0
  97. package/dist/passes/index.d.ts.map +1 -0
  98. package/dist/passes/index.js +4 -3
  99. package/dist/react/FragCanvas.d.ts +2 -0
  100. package/dist/react/FragCanvas.d.ts.map +1 -0
  101. package/dist/react/FragCanvas.js +234 -211
  102. package/dist/react/FragCanvas.js.map +1 -0
  103. package/dist/react/MotionGPUErrorOverlay.d.ts +1 -0
  104. package/dist/react/MotionGPUErrorOverlay.d.ts.map +1 -0
  105. package/dist/react/MotionGPUErrorOverlay.js +384 -48
  106. package/dist/react/MotionGPUErrorOverlay.js.map +1 -0
  107. package/dist/react/Portal.d.ts +1 -0
  108. package/dist/react/Portal.d.ts.map +1 -0
  109. package/dist/react/Portal.js +18 -21
  110. package/dist/react/Portal.js.map +1 -0
  111. package/dist/react/advanced.d.ts +1 -0
  112. package/dist/react/advanced.d.ts.map +1 -0
  113. package/dist/react/advanced.js +12 -6
  114. package/dist/react/frame-context.d.ts +1 -0
  115. package/dist/react/frame-context.d.ts.map +1 -0
  116. package/dist/react/frame-context.js +88 -94
  117. package/dist/react/frame-context.js.map +1 -0
  118. package/dist/react/index.d.ts +1 -0
  119. package/dist/react/index.d.ts.map +1 -0
  120. package/dist/react/index.js +10 -9
  121. package/dist/react/motiongpu-context.d.ts +1 -0
  122. package/dist/react/motiongpu-context.d.ts.map +1 -0
  123. package/dist/react/motiongpu-context.js +18 -15
  124. package/dist/react/motiongpu-context.js.map +1 -0
  125. package/dist/react/use-motiongpu-user-context.d.ts +1 -0
  126. package/dist/react/use-motiongpu-user-context.d.ts.map +1 -0
  127. package/dist/react/use-motiongpu-user-context.js +83 -82
  128. package/dist/react/use-motiongpu-user-context.js.map +1 -0
  129. package/dist/react/use-texture.d.ts +1 -0
  130. package/dist/react/use-texture.d.ts.map +1 -0
  131. package/dist/react/use-texture.js +132 -152
  132. package/dist/react/use-texture.js.map +1 -0
  133. package/dist/svelte/FragCanvas.svelte.d.ts +2 -0
  134. package/dist/svelte/FragCanvas.svelte.d.ts.map +1 -0
  135. package/dist/svelte/MotionGPUErrorOverlay.svelte +17 -20
  136. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts +1 -0
  137. package/dist/svelte/MotionGPUErrorOverlay.svelte.d.ts.map +1 -0
  138. package/dist/svelte/Portal.svelte.d.ts +1 -0
  139. package/dist/svelte/Portal.svelte.d.ts.map +1 -0
  140. package/dist/svelte/advanced.d.ts +1 -0
  141. package/dist/svelte/advanced.d.ts.map +1 -0
  142. package/dist/svelte/advanced.js +11 -6
  143. package/dist/svelte/frame-context.d.ts +1 -0
  144. package/dist/svelte/frame-context.d.ts.map +1 -0
  145. package/dist/svelte/frame-context.js +27 -27
  146. package/dist/svelte/frame-context.js.map +1 -0
  147. package/dist/svelte/index.d.ts +1 -0
  148. package/dist/svelte/index.d.ts.map +1 -0
  149. package/dist/svelte/index.js +10 -9
  150. package/dist/svelte/motiongpu-context.d.ts +1 -0
  151. package/dist/svelte/motiongpu-context.d.ts.map +1 -0
  152. package/dist/svelte/motiongpu-context.js +24 -21
  153. package/dist/svelte/motiongpu-context.js.map +1 -0
  154. package/dist/svelte/use-motiongpu-user-context.d.ts +1 -0
  155. package/dist/svelte/use-motiongpu-user-context.d.ts.map +1 -0
  156. package/dist/svelte/use-motiongpu-user-context.js +69 -70
  157. package/dist/svelte/use-motiongpu-user-context.js.map +1 -0
  158. package/dist/svelte/use-texture.d.ts +1 -0
  159. package/dist/svelte/use-texture.d.ts.map +1 -0
  160. package/dist/svelte/use-texture.js +125 -147
  161. package/dist/svelte/use-texture.js.map +1 -0
  162. package/package.json +15 -7
  163. package/src/lib/advanced.ts +6 -0
  164. package/src/lib/core/advanced.ts +12 -0
  165. package/src/lib/core/current-value.ts +64 -0
  166. package/src/lib/core/error-diagnostics.ts +236 -0
  167. package/src/lib/core/error-report.ts +406 -0
  168. package/src/lib/core/frame-registry.ts +1189 -0
  169. package/src/lib/core/index.ts +77 -0
  170. package/src/lib/core/material-preprocess.ts +284 -0
  171. package/src/lib/core/material.ts +667 -0
  172. package/src/lib/core/recompile-policy.ts +31 -0
  173. package/src/lib/core/render-graph.ts +143 -0
  174. package/src/lib/core/render-targets.ts +107 -0
  175. package/src/lib/core/renderer.ts +1547 -0
  176. package/src/lib/core/runtime-loop.ts +458 -0
  177. package/src/lib/core/scheduler-helpers.ts +136 -0
  178. package/src/lib/core/shader.ts +258 -0
  179. package/src/lib/core/texture-loader.ts +476 -0
  180. package/src/lib/core/textures.ts +235 -0
  181. package/src/lib/core/types.ts +582 -0
  182. package/src/lib/core/uniforms.ts +282 -0
  183. package/src/lib/index.ts +6 -0
  184. package/src/lib/passes/BlitPass.ts +54 -0
  185. package/src/lib/passes/CopyPass.ts +80 -0
  186. package/src/lib/passes/FullscreenPass.ts +173 -0
  187. package/src/lib/passes/ShaderPass.ts +88 -0
  188. package/src/lib/passes/index.ts +3 -0
  189. package/src/lib/react/MotionGPUErrorOverlay.tsx +392 -0
  190. package/src/lib/react/advanced.ts +36 -0
  191. package/src/lib/react/frame-context.ts +169 -0
  192. package/src/lib/react/index.ts +51 -0
  193. package/src/lib/react/motiongpu-context.ts +88 -0
  194. package/src/lib/react/use-motiongpu-user-context.ts +186 -0
  195. package/src/lib/react/use-texture.ts +233 -0
  196. package/src/lib/svelte/FragCanvas.svelte +249 -0
  197. package/src/lib/svelte/MotionGPUErrorOverlay.svelte +382 -0
  198. package/src/lib/svelte/Portal.svelte +31 -0
  199. package/src/lib/svelte/advanced.ts +32 -0
  200. package/src/lib/svelte/frame-context.ts +87 -0
  201. package/src/lib/svelte/index.ts +51 -0
  202. package/src/lib/svelte/motiongpu-context.ts +97 -0
  203. package/src/lib/svelte/use-motiongpu-user-context.ts +145 -0
  204. package/src/lib/svelte/use-texture.ts +232 -0
  205. package/dist/react/MotionGPUErrorOverlay.tsx +0 -129
  206. /package/{dist → src/lib}/react/FragCanvas.tsx +0 -0
  207. /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
- * Shared base for fullscreen texture sampling passes.
3
- */
4
- export class FullscreenPass {
5
- enabled;
6
- needsSwap;
7
- input;
8
- output;
9
- clear;
10
- clearColor;
11
- preserve;
12
- filter;
13
- device = null;
14
- sampler = null;
15
- bindGroupLayout = null;
16
- shaderModule = null;
17
- pipelineByFormat = new Map();
18
- bindGroupByView = new WeakMap();
19
- constructor(options = {}) {
20
- this.enabled = options.enabled ?? true;
21
- this.needsSwap = options.needsSwap ?? true;
22
- this.input = options.input ?? 'source';
23
- this.output = options.output ?? (this.needsSwap ? 'target' : 'source');
24
- this.clear = options.clear ?? false;
25
- this.clearColor = options.clearColor ?? [0, 0, 0, 1];
26
- this.preserve = options.preserve ?? true;
27
- this.filter = options.filter ?? 'linear';
28
- }
29
- invalidateFullscreenCache() {
30
- this.shaderModule = null;
31
- this.pipelineByFormat.clear();
32
- this.bindGroupByView = new WeakMap();
33
- }
34
- ensureResources(device, format) {
35
- if (this.device !== device) {
36
- this.device = device;
37
- this.sampler = null;
38
- this.bindGroupLayout = null;
39
- this.invalidateFullscreenCache();
40
- }
41
- if (!this.sampler) {
42
- this.sampler = device.createSampler({
43
- magFilter: this.filter,
44
- minFilter: this.filter,
45
- addressModeU: 'clamp-to-edge',
46
- addressModeV: 'clamp-to-edge'
47
- });
48
- }
49
- if (!this.bindGroupLayout) {
50
- this.bindGroupLayout = device.createBindGroupLayout({
51
- entries: [
52
- {
53
- binding: 0,
54
- visibility: GPUShaderStage.FRAGMENT,
55
- sampler: { type: 'filtering' }
56
- },
57
- {
58
- binding: 1,
59
- visibility: GPUShaderStage.FRAGMENT,
60
- texture: {
61
- sampleType: 'float',
62
- viewDimension: '2d',
63
- multisampled: false
64
- }
65
- }
66
- ]
67
- });
68
- }
69
- if (!this.shaderModule) {
70
- this.shaderModule = device.createShaderModule({ code: this.getProgram() });
71
- }
72
- let pipeline = this.pipelineByFormat.get(format);
73
- if (!pipeline) {
74
- const pipelineLayout = device.createPipelineLayout({
75
- bindGroupLayouts: [this.bindGroupLayout]
76
- });
77
- pipeline = device.createRenderPipeline({
78
- layout: pipelineLayout,
79
- vertex: {
80
- module: this.shaderModule,
81
- entryPoint: this.getVertexEntryPoint()
82
- },
83
- fragment: {
84
- module: this.shaderModule,
85
- entryPoint: this.getFragmentEntryPoint(),
86
- targets: [{ format }]
87
- },
88
- primitive: { topology: 'triangle-list' }
89
- });
90
- this.pipelineByFormat.set(format, pipeline);
91
- }
92
- return {
93
- sampler: this.sampler,
94
- bindGroupLayout: this.bindGroupLayout,
95
- pipeline
96
- };
97
- }
98
- setSize(width, height) {
99
- void width;
100
- void height;
101
- }
102
- renderFullscreen(context) {
103
- const { sampler, bindGroupLayout, pipeline } = this.ensureResources(context.device, context.output.format);
104
- const inputView = context.input.view;
105
- let bindGroup = this.bindGroupByView.get(inputView);
106
- if (!bindGroup) {
107
- bindGroup = context.device.createBindGroup({
108
- layout: bindGroupLayout,
109
- entries: [
110
- { binding: 0, resource: sampler },
111
- { binding: 1, resource: inputView }
112
- ]
113
- });
114
- this.bindGroupByView.set(inputView, bindGroup);
115
- }
116
- const pass = context.beginRenderPass();
117
- pass.setPipeline(pipeline);
118
- pass.setBindGroup(0, bindGroup);
119
- pass.draw(3);
120
- pass.end();
121
- }
122
- render(context) {
123
- this.renderFullscreen(context);
124
- }
125
- dispose() {
126
- this.device = null;
127
- this.sampler = null;
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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"}
@@ -18,3 +18,4 @@ export declare class ShaderPass extends FullscreenPass {
18
18
  protected getVertexEntryPoint(): string;
19
19
  protected getFragmentEntryPoint(): string;
20
20
  }
21
+ //# sourceMappingURL=ShaderPass.d.ts.map
@@ -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 './FullscreenPass.js';
2
- const SHADER_PASS_CONTRACT = /\bfn\s+shade\s*\(\s*inputColor\s*:\s*vec4f\s*,\s*uv\s*:\s*vec2f\s*\)\s*->\s*vec4f/;
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
- if (!SHADER_PASS_CONTRACT.test(fragment)) {
5
- throw new Error('ShaderPass fragment must declare `fn shade(inputColor: vec4f, uv: vec2f) -> vec4f`.');
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
- * Fullscreen programmable shader pass.
42
- */
43
- export class ShaderPass extends FullscreenPass {
44
- fragment;
45
- program;
46
- constructor(options) {
47
- super(options);
48
- this.fragment = options.fragment;
49
- this.program = buildShaderPassProgram(options.fragment);
50
- }
51
- /**
52
- * Replaces current shader fragment and invalidates pipeline cache.
53
- */
54
- setFragment(fragment) {
55
- this.fragment = fragment;
56
- this.program = buildShaderPassProgram(fragment);
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
- }
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"}
@@ -1,3 +1,4 @@
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
+ //# 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"}
@@ -1,3 +1,4 @@
1
- export { BlitPass } from './BlitPass.js';
2
- export { CopyPass } from './CopyPass.js';
3
- export { ShaderPass } from './ShaderPass.js';
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"}