@flighthq/effects-wgpu 0.1.0 → 0.2.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.
Files changed (256) hide show
  1. package/dist/index.d.ts +17 -10
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -10
  4. package/dist/index.js.map +1 -1
  5. package/dist/wgpuBevelEffect.d.ts +4 -0
  6. package/dist/wgpuBevelEffect.d.ts.map +1 -0
  7. package/dist/wgpuBevelEffect.js +122 -0
  8. package/dist/wgpuBevelEffect.js.map +1 -0
  9. package/dist/wgpuBloomEffect.d.ts.map +1 -1
  10. package/dist/wgpuBloomEffect.js +9 -8
  11. package/dist/wgpuBloomEffect.js.map +1 -1
  12. package/dist/wgpuBlurEffect.d.ts +8 -0
  13. package/dist/wgpuBlurEffect.d.ts.map +1 -0
  14. package/dist/wgpuBlurEffect.js +70 -0
  15. package/dist/wgpuBlurEffect.js.map +1 -0
  16. package/dist/wgpuBokehDepthOfFieldEffect.d.ts.map +1 -1
  17. package/dist/wgpuBokehDepthOfFieldEffect.js +2 -2
  18. package/dist/wgpuBokehDepthOfFieldEffect.js.map +1 -1
  19. package/dist/wgpuCameraMotionBlurEffect.d.ts.map +1 -1
  20. package/dist/wgpuCameraMotionBlurEffect.js +2 -2
  21. package/dist/wgpuCameraMotionBlurEffect.js.map +1 -1
  22. package/dist/wgpuChromaticAberrationEffect.d.ts.map +1 -1
  23. package/dist/wgpuChromaticAberrationEffect.js +2 -2
  24. package/dist/wgpuChromaticAberrationEffect.js.map +1 -1
  25. package/dist/wgpuColorLutPass.d.ts +3 -0
  26. package/dist/wgpuColorLutPass.d.ts.map +1 -0
  27. package/dist/wgpuColorLutPass.js +144 -0
  28. package/dist/wgpuColorLutPass.js.map +1 -0
  29. package/dist/wgpuColorMatrixPass.d.ts +3 -0
  30. package/dist/wgpuColorMatrixPass.d.ts.map +1 -0
  31. package/dist/wgpuColorMatrixPass.js +51 -0
  32. package/dist/wgpuColorMatrixPass.js.map +1 -0
  33. package/dist/wgpuConvolutionEffect.d.ts +5 -0
  34. package/dist/wgpuConvolutionEffect.d.ts.map +1 -0
  35. package/dist/wgpuConvolutionEffect.js +108 -0
  36. package/dist/wgpuConvolutionEffect.js.map +1 -0
  37. package/dist/wgpuCrtEffect.d.ts.map +1 -1
  38. package/dist/wgpuCrtEffect.js +2 -2
  39. package/dist/wgpuCrtEffect.js.map +1 -1
  40. package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -1
  41. package/dist/wgpuDirectionalBlurEffect.js +2 -2
  42. package/dist/wgpuDirectionalBlurEffect.js.map +1 -1
  43. package/dist/wgpuDisplacementEffect.d.ts.map +1 -1
  44. package/dist/wgpuDisplacementEffect.js +2 -2
  45. package/dist/wgpuDisplacementEffect.js.map +1 -1
  46. package/dist/wgpuDitherEffect.d.ts.map +1 -1
  47. package/dist/wgpuDitherEffect.js +2 -2
  48. package/dist/wgpuDitherEffect.js.map +1 -1
  49. package/dist/wgpuDropShadowEffect.d.ts +4 -0
  50. package/dist/wgpuDropShadowEffect.d.ts.map +1 -0
  51. package/dist/wgpuDropShadowEffect.js +49 -0
  52. package/dist/wgpuDropShadowEffect.js.map +1 -0
  53. package/dist/wgpuEffectBlitShader.d.ts +15 -0
  54. package/dist/wgpuEffectBlitShader.d.ts.map +1 -0
  55. package/dist/wgpuEffectBlitShader.js +71 -0
  56. package/dist/wgpuEffectBlitShader.js.map +1 -0
  57. package/dist/wgpuEffectBoxBlur.d.ts +14 -0
  58. package/dist/wgpuEffectBoxBlur.d.ts.map +1 -0
  59. package/dist/wgpuEffectBoxBlur.js +81 -0
  60. package/dist/wgpuEffectBoxBlur.js.map +1 -0
  61. package/dist/wgpuEffectGradientRamp.d.ts +17 -0
  62. package/dist/wgpuEffectGradientRamp.d.ts.map +1 -0
  63. package/dist/wgpuEffectGradientRamp.js +89 -0
  64. package/dist/wgpuEffectGradientRamp.js.map +1 -0
  65. package/dist/wgpuEffectPass.d.ts +41 -0
  66. package/dist/wgpuEffectPass.d.ts.map +1 -0
  67. package/dist/wgpuEffectPass.js +259 -0
  68. package/dist/wgpuEffectPass.js.map +1 -0
  69. package/dist/wgpuEffectProgramCache.d.ts +2 -2
  70. package/dist/wgpuEffectProgramCache.d.ts.map +1 -1
  71. package/dist/wgpuEffectProgramCache.js +5 -5
  72. package/dist/wgpuEffectProgramCache.js.map +1 -1
  73. package/dist/wgpuEffectTintShader.d.ts +8 -0
  74. package/dist/wgpuEffectTintShader.d.ts.map +1 -0
  75. package/dist/wgpuEffectTintShader.js +109 -0
  76. package/dist/wgpuEffectTintShader.js.map +1 -0
  77. package/dist/wgpuFilmGrainEffect.d.ts.map +1 -1
  78. package/dist/wgpuFilmGrainEffect.js +2 -2
  79. package/dist/wgpuFilmGrainEffect.js.map +1 -1
  80. package/dist/wgpuFxaaEffect.d.ts.map +1 -1
  81. package/dist/wgpuFxaaEffect.js +2 -2
  82. package/dist/wgpuFxaaEffect.js.map +1 -1
  83. package/dist/wgpuGlitchEffect.d.ts.map +1 -1
  84. package/dist/wgpuGlitchEffect.js +2 -2
  85. package/dist/wgpuGlitchEffect.js.map +1 -1
  86. package/dist/wgpuGodRaysEffect.d.ts.map +1 -1
  87. package/dist/wgpuGodRaysEffect.js +2 -2
  88. package/dist/wgpuGodRaysEffect.js.map +1 -1
  89. package/dist/wgpuGradientBevelEffect.d.ts +4 -0
  90. package/dist/wgpuGradientBevelEffect.d.ts.map +1 -0
  91. package/dist/wgpuGradientBevelEffect.js +189 -0
  92. package/dist/wgpuGradientBevelEffect.js.map +1 -0
  93. package/dist/wgpuGradientGlowEffect.d.ts +4 -0
  94. package/dist/wgpuGradientGlowEffect.d.ts.map +1 -0
  95. package/dist/wgpuGradientGlowEffect.js +97 -0
  96. package/dist/wgpuGradientGlowEffect.js.map +1 -0
  97. package/dist/wgpuHalftoneEffect.d.ts.map +1 -1
  98. package/dist/wgpuHalftoneEffect.js +2 -2
  99. package/dist/wgpuHalftoneEffect.js.map +1 -1
  100. package/dist/wgpuInnerGlowEffect.d.ts +4 -0
  101. package/dist/wgpuInnerGlowEffect.d.ts.map +1 -0
  102. package/dist/wgpuInnerGlowEffect.js +37 -0
  103. package/dist/wgpuInnerGlowEffect.js.map +1 -0
  104. package/dist/wgpuInnerShadowEffect.d.ts +4 -0
  105. package/dist/wgpuInnerShadowEffect.d.ts.map +1 -0
  106. package/dist/wgpuInnerShadowEffect.js +42 -0
  107. package/dist/wgpuInnerShadowEffect.js.map +1 -0
  108. package/dist/wgpuKuwaharaEffect.d.ts.map +1 -1
  109. package/dist/wgpuKuwaharaEffect.js +2 -2
  110. package/dist/wgpuKuwaharaEffect.js.map +1 -1
  111. package/dist/wgpuLensDirtEffect.d.ts.map +1 -1
  112. package/dist/wgpuLensDirtEffect.js +2 -2
  113. package/dist/wgpuLensDirtEffect.js.map +1 -1
  114. package/dist/wgpuLensDistortionEffect.d.ts.map +1 -1
  115. package/dist/wgpuLensDistortionEffect.js +2 -2
  116. package/dist/wgpuLensDistortionEffect.js.map +1 -1
  117. package/dist/wgpuLensFlareEffect.d.ts.map +1 -1
  118. package/dist/wgpuLensFlareEffect.js +2 -2
  119. package/dist/wgpuLensFlareEffect.js.map +1 -1
  120. package/dist/wgpuMedianEffect.d.ts +5 -0
  121. package/dist/wgpuMedianEffect.d.ts.map +1 -0
  122. package/dist/wgpuMedianEffect.js +74 -0
  123. package/dist/wgpuMedianEffect.js.map +1 -0
  124. package/dist/wgpuMotionBlurEffect.d.ts.map +1 -1
  125. package/dist/wgpuMotionBlurEffect.js +6 -7
  126. package/dist/wgpuMotionBlurEffect.js.map +1 -1
  127. package/dist/wgpuOuterGlowEffect.d.ts +4 -0
  128. package/dist/wgpuOuterGlowEffect.d.ts.map +1 -0
  129. package/dist/wgpuOuterGlowEffect.js +43 -0
  130. package/dist/wgpuOuterGlowEffect.js.map +1 -0
  131. package/dist/wgpuOutlineEffect.d.ts.map +1 -1
  132. package/dist/wgpuOutlineEffect.js +2 -2
  133. package/dist/wgpuOutlineEffect.js.map +1 -1
  134. package/dist/wgpuPixelateEffect.d.ts.map +1 -1
  135. package/dist/wgpuPixelateEffect.js +2 -2
  136. package/dist/wgpuPixelateEffect.js.map +1 -1
  137. package/dist/wgpuPosterizeEffect.d.ts.map +1 -1
  138. package/dist/wgpuPosterizeEffect.js +2 -2
  139. package/dist/wgpuPosterizeEffect.js.map +1 -1
  140. package/dist/wgpuRadialBlurEffect.d.ts.map +1 -1
  141. package/dist/wgpuRadialBlurEffect.js +2 -2
  142. package/dist/wgpuRadialBlurEffect.js.map +1 -1
  143. package/dist/wgpuRenderEffectPipeline.d.ts +2 -2
  144. package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -1
  145. package/dist/wgpuRenderEffectPipeline.js +59 -9
  146. package/dist/wgpuRenderEffectPipeline.js.map +1 -1
  147. package/dist/wgpuRenderEffectRegistrants.d.ts +1 -0
  148. package/dist/wgpuRenderEffectRegistrants.d.ts.map +1 -1
  149. package/dist/wgpuRenderEffectRegistrants.js +39 -28
  150. package/dist/wgpuRenderEffectRegistrants.js.map +1 -1
  151. package/dist/wgpuScanlinesEffect.d.ts.map +1 -1
  152. package/dist/wgpuScanlinesEffect.js +2 -2
  153. package/dist/wgpuScanlinesEffect.js.map +1 -1
  154. package/dist/wgpuScreenSpaceFogEffect.d.ts.map +1 -1
  155. package/dist/wgpuScreenSpaceFogEffect.js +2 -2
  156. package/dist/wgpuScreenSpaceFogEffect.js.map +1 -1
  157. package/dist/wgpuSharpenEffect.d.ts.map +1 -1
  158. package/dist/wgpuSharpenEffect.js +2 -2
  159. package/dist/wgpuSharpenEffect.js.map +1 -1
  160. package/dist/wgpuSketchEffect.d.ts.map +1 -1
  161. package/dist/wgpuSketchEffect.js +2 -2
  162. package/dist/wgpuSketchEffect.js.map +1 -1
  163. package/dist/wgpuSmaaEffect.d.ts.map +1 -1
  164. package/dist/wgpuSmaaEffect.js +2 -2
  165. package/dist/wgpuSmaaEffect.js.map +1 -1
  166. package/dist/wgpuSsaoEffect.d.ts.map +1 -1
  167. package/dist/wgpuSsaoEffect.js +2 -2
  168. package/dist/wgpuSsaoEffect.js.map +1 -1
  169. package/dist/wgpuSsrEffect.d.ts.map +1 -1
  170. package/dist/wgpuSsrEffect.js +2 -2
  171. package/dist/wgpuSsrEffect.js.map +1 -1
  172. package/dist/wgpuTaaEffect.d.ts.map +1 -1
  173. package/dist/wgpuTaaEffect.js +2 -2
  174. package/dist/wgpuTaaEffect.js.map +1 -1
  175. package/dist/wgpuTiltShiftEffect.d.ts.map +1 -1
  176. package/dist/wgpuTiltShiftEffect.js +2 -2
  177. package/dist/wgpuTiltShiftEffect.js.map +1 -1
  178. package/dist/wgpuToneMapEffect.d.ts.map +1 -1
  179. package/dist/wgpuToneMapEffect.js +2 -2
  180. package/dist/wgpuToneMapEffect.js.map +1 -1
  181. package/dist/wgpuVignetteEffect.d.ts.map +1 -1
  182. package/dist/wgpuVignetteEffect.js +2 -2
  183. package/dist/wgpuVignetteEffect.js.map +1 -1
  184. package/dist/wgpuWhiteBalanceEffect.d.ts.map +1 -1
  185. package/dist/wgpuWhiteBalanceEffect.js +2 -2
  186. package/dist/wgpuWhiteBalanceEffect.js.map +1 -1
  187. package/package.json +11 -7
  188. package/src/wgpuBevelEffect.test.ts +13 -0
  189. package/src/wgpuBlurEffect.test.ts +19 -0
  190. package/src/wgpuColorLutPass.test.ts +7 -0
  191. package/src/wgpuColorMatrixPass.test.ts +7 -0
  192. package/src/wgpuConvolutionEffect.test.ts +13 -0
  193. package/src/wgpuDropShadowEffect.test.ts +13 -0
  194. package/src/wgpuEffectBlitShader.test.ts +13 -0
  195. package/src/wgpuEffectBoxBlur.test.ts +7 -0
  196. package/src/wgpuEffectGradientRamp.test.ts +7 -0
  197. package/src/wgpuEffectPass.test.ts +51 -0
  198. package/src/wgpuEffectTintShader.test.ts +23 -0
  199. package/src/wgpuGradientBevelEffect.test.ts +13 -0
  200. package/src/wgpuGradientGlowEffect.test.ts +13 -0
  201. package/src/wgpuInnerGlowEffect.test.ts +13 -0
  202. package/src/wgpuInnerShadowEffect.test.ts +13 -0
  203. package/src/wgpuMedianEffect.test.ts +13 -0
  204. package/src/wgpuOuterGlowEffect.test.ts +13 -0
  205. package/src/wgpuRenderEffectPipeline.test.ts +2 -0
  206. package/src/wgpuRenderEffectRegistrants.test.ts +25 -14
  207. package/dist/wgpuBrightnessContrastEffect.d.ts +0 -4
  208. package/dist/wgpuBrightnessContrastEffect.d.ts.map +0 -1
  209. package/dist/wgpuBrightnessContrastEffect.js +0 -29
  210. package/dist/wgpuBrightnessContrastEffect.js.map +0 -1
  211. package/dist/wgpuChannelMixerEffect.d.ts +0 -4
  212. package/dist/wgpuChannelMixerEffect.d.ts.map +0 -1
  213. package/dist/wgpuChannelMixerEffect.js +0 -34
  214. package/dist/wgpuChannelMixerEffect.js.map +0 -1
  215. package/dist/wgpuColorGradeEffect.d.ts +0 -4
  216. package/dist/wgpuColorGradeEffect.d.ts.map +0 -1
  217. package/dist/wgpuColorGradeEffect.js +0 -52
  218. package/dist/wgpuColorGradeEffect.js.map +0 -1
  219. package/dist/wgpuExposureEffect.d.ts +0 -4
  220. package/dist/wgpuExposureEffect.d.ts.map +0 -1
  221. package/dist/wgpuExposureEffect.js +0 -28
  222. package/dist/wgpuExposureEffect.js.map +0 -1
  223. package/dist/wgpuGrayscaleEffect.d.ts +0 -4
  224. package/dist/wgpuGrayscaleEffect.d.ts.map +0 -1
  225. package/dist/wgpuGrayscaleEffect.js +0 -27
  226. package/dist/wgpuGrayscaleEffect.js.map +0 -1
  227. package/dist/wgpuHueSaturationEffect.d.ts +0 -4
  228. package/dist/wgpuHueSaturationEffect.d.ts.map +0 -1
  229. package/dist/wgpuHueSaturationEffect.js +0 -75
  230. package/dist/wgpuHueSaturationEffect.js.map +0 -1
  231. package/dist/wgpuInvertEffect.d.ts +0 -4
  232. package/dist/wgpuInvertEffect.d.ts.map +0 -1
  233. package/dist/wgpuInvertEffect.js +0 -26
  234. package/dist/wgpuInvertEffect.js.map +0 -1
  235. package/dist/wgpuLiftGammaGainEffect.d.ts +0 -4
  236. package/dist/wgpuLiftGammaGainEffect.d.ts.map +0 -1
  237. package/dist/wgpuLiftGammaGainEffect.js +0 -51
  238. package/dist/wgpuLiftGammaGainEffect.js.map +0 -1
  239. package/dist/wgpuLookupTableGradeEffect.d.ts +0 -4
  240. package/dist/wgpuLookupTableGradeEffect.d.ts.map +0 -1
  241. package/dist/wgpuLookupTableGradeEffect.js +0 -30
  242. package/dist/wgpuLookupTableGradeEffect.js.map +0 -1
  243. package/dist/wgpuSepiaEffect.d.ts +0 -4
  244. package/dist/wgpuSepiaEffect.d.ts.map +0 -1
  245. package/dist/wgpuSepiaEffect.js +0 -31
  246. package/dist/wgpuSepiaEffect.js.map +0 -1
  247. package/src/wgpuBrightnessContrastEffect.test.ts +0 -16
  248. package/src/wgpuChannelMixerEffect.test.ts +0 -13
  249. package/src/wgpuColorGradeEffect.test.ts +0 -13
  250. package/src/wgpuExposureEffect.test.ts +0 -13
  251. package/src/wgpuGrayscaleEffect.test.ts +0 -13
  252. package/src/wgpuHueSaturationEffect.test.ts +0 -13
  253. package/src/wgpuInvertEffect.test.ts +0 -13
  254. package/src/wgpuLiftGammaGainEffect.test.ts +0 -13
  255. package/src/wgpuLookupTableGradeEffect.test.ts +0 -16
  256. package/src/wgpuSepiaEffect.test.ts +0 -13
@@ -0,0 +1,144 @@
1
+ import { EFFECT_VERTEX_WGSL, getWgpuEffectPassState } from './wgpuEffectPass';
2
+ // Generic pointwise color-LUT pass — the single fold-in realization for the whole LUT-tier Adjustment
3
+ // family on WebGPU. A run of consecutive pointwise adjustments containing any nonlinear (LUT-tier) member
4
+ // bakes to ONE 3D `ColorLut` (matrices folded in) and runs through this one trilinear pass instead of one
5
+ // pass per op. The LUT uploads as a `size³` rgba8unorm 3D texture (group 2); the shared linear sampler
6
+ // does the trilinear interpolation. Sampled color is treated as premultiplied and passed straight into
7
+ // the LUT (matching the per-op color passes this replaces); alpha is preserved. `cache` owns the uploaded
8
+ // 3D texture across frames; the LUT is re-uploaded only when it differs by identity from the last one
9
+ // written into `cache` (bakeColorLutForRun returns a stable reference for an unchanged run), so a static
10
+ // grade uploads once. The caller owns `cache.texture` and destroys it on teardown.
11
+ export function applyColorLutPassToWgpu(state, source, dest, lut, cache) {
12
+ const { device } = state;
13
+ const fs = getWgpuEffectPassState(state);
14
+ const texture = uploadLutTexture(state, lut, cache);
15
+ const sourceBG = device.createBindGroup({
16
+ layout: fs.textureBGLayout,
17
+ entries: [
18
+ { binding: 0, resource: source.view },
19
+ { binding: 1, resource: fs.sampler },
20
+ ],
21
+ });
22
+ const lutBG = device.createBindGroup({
23
+ layout: getLutBindGroupLayout(state),
24
+ entries: [
25
+ { binding: 0, resource: texture.createView({ dimension: '3d' }) },
26
+ { binding: 1, resource: fs.sampler },
27
+ ],
28
+ });
29
+ const pipeline = getLutPipeline(state, dest.format);
30
+ const slotOffset = fs.acquireSlot();
31
+ fs.writeSlot(slotOffset, (f32) => {
32
+ f32[0] = lut.size;
33
+ });
34
+ const pass = fs.beginPass(dest, 'load');
35
+ pass.setPipeline(pipeline.pipeline);
36
+ pass.setBindGroup(0, fs.uniformBG, [slotOffset]);
37
+ pass.setBindGroup(1, sourceBG);
38
+ pass.setBindGroup(2, lutBG);
39
+ pass.draw(6);
40
+ pass.end();
41
+ }
42
+ function getLutBindGroupLayout(state) {
43
+ let layout = lutBindGroupLayouts.get(state);
44
+ if (layout === undefined) {
45
+ layout = state.device.createBindGroupLayout({
46
+ entries: [
47
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { viewDimension: '3d' } },
48
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },
49
+ ],
50
+ });
51
+ lutBindGroupLayouts.set(state, layout);
52
+ }
53
+ return layout;
54
+ }
55
+ // A render pipeline's color target format must match the attachment it draws into, so an HDR
56
+ // (rgba16float) effect target needs its own variant; pipelines are cached per (state, dest format).
57
+ function getLutPipeline(state, format) {
58
+ let byFormat = lutPipelines.get(state);
59
+ if (byFormat === undefined) {
60
+ byFormat = new Map();
61
+ lutPipelines.set(state, byFormat);
62
+ }
63
+ let pipeline = byFormat.get(format);
64
+ if (pipeline === undefined) {
65
+ const fs = getWgpuEffectPassState(state);
66
+ const { device } = state;
67
+ const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + COLOR_LUT_FRAGMENT_WGSL });
68
+ const pipelineLayout = device.createPipelineLayout({
69
+ bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout, getLutBindGroupLayout(state)],
70
+ });
71
+ const gpuPipeline = device.createRenderPipeline({
72
+ layout: pipelineLayout,
73
+ vertex: { module: shaderModule, entryPoint: 'vs_main' },
74
+ fragment: {
75
+ module: shaderModule,
76
+ entryPoint: 'fs_main',
77
+ targets: [{ format, blend: REPLACE_BLEND }],
78
+ },
79
+ primitive: { topology: 'triangle-list' },
80
+ });
81
+ pipeline = { pipeline: gpuPipeline, blendMode: 'replace' };
82
+ byFormat.set(format, pipeline);
83
+ }
84
+ return pipeline;
85
+ }
86
+ // Uploads `lut` into the cache's reusable rgba8unorm 3D texture and returns it. The texture is recreated
87
+ // when the LUT size changes; the write is skipped entirely when `lut` is the same reference already in the
88
+ // texture — the common static-grade case — so an unchanged grade costs one writeTexture total, not one
89
+ // per frame.
90
+ function uploadLutTexture(state, lut, cache) {
91
+ const { device } = state;
92
+ const n = lut.size;
93
+ if (cache.texture !== null && cache.lut === lut)
94
+ return cache.texture;
95
+ if (cache.texture === null || cache.size !== n) {
96
+ cache.texture?.destroy();
97
+ cache.texture = device.createTexture({
98
+ size: [n, n, n],
99
+ dimension: '3d',
100
+ format: 'rgba8unorm',
101
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
102
+ });
103
+ cache.size = n;
104
+ }
105
+ const samples = lut.samples;
106
+ const data = new Uint8Array(n * n * n * 4);
107
+ for (let i = 0, j = 0, o = 0; i < n * n * n; i++) {
108
+ data[o++] = Math.round(clamp01(samples[j++]) * 255);
109
+ data[o++] = Math.round(clamp01(samples[j++]) * 255);
110
+ data[o++] = Math.round(clamp01(samples[j++]) * 255);
111
+ data[o++] = 255;
112
+ }
113
+ device.queue.writeTexture({ texture: cache.texture }, data, { bytesPerRow: n * 4, rowsPerImage: n }, [n, n, n]);
114
+ cache.lut = lut;
115
+ return cache.texture;
116
+ }
117
+ function clamp01(v) {
118
+ return v < 0 ? 0 : v > 1 ? 1 : v;
119
+ }
120
+ const REPLACE_BLEND = {
121
+ color: { srcFactor: 'one', dstFactor: 'zero', operation: 'add' },
122
+ alpha: { srcFactor: 'one', dstFactor: 'zero', operation: 'add' },
123
+ };
124
+ // Half-texel scale/offset maps the [0,1] color to LUT cell centres, so v=0 hits cell 0 and v=1 the last.
125
+ const COLOR_LUT_FRAGMENT_WGSL = /* wgsl */ `
126
+ struct Uniforms { u_size : f32, _p0 : f32, _p1 : f32, _p2 : f32, }
127
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
128
+ @group(1) @binding(0) var tex : texture_2d<f32>;
129
+ @group(1) @binding(1) var smp : sampler;
130
+ @group(2) @binding(0) var lut : texture_3d<f32>;
131
+ @group(2) @binding(1) var lutSmp : sampler;
132
+
133
+ @fragment
134
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
135
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
136
+ let scale = (uni.u_size - 1.0) / uni.u_size;
137
+ let offset = 0.5 / uni.u_size;
138
+ let lc = clamp(c.rgb, vec3f(0.0), vec3f(1.0)) * scale + offset;
139
+ let graded = textureSampleLevel(lut, lutSmp, lc, 0.0).rgb;
140
+ return vec4f(graded, c.a);
141
+ }`;
142
+ const lutBindGroupLayouts = new WeakMap();
143
+ const lutPipelines = new WeakMap();
144
+ //# sourceMappingURL=wgpuColorLutPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuColorLutPass.js","sourceRoot":"","sources":["../src/wgpuColorLutPass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyColorMatrixPassToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, matrix: ReadonlyArray<number>): void;
3
+ //# sourceMappingURL=wgpuColorMatrixPass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuColorMatrixPass.d.ts","sourceRoot":"","sources":["../src/wgpuColorMatrixPass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUzE,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,IAAI,CAyBN"}
@@ -0,0 +1,51 @@
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Generic pointwise color-matrix pass — the single fold-in realization for the whole matrix-tier
4
+ // Adjustment family on WebGPU. A run of consecutive matrix-tier adjustments fuses to ONE 4×5 matrix (in
5
+ // the adjustments colorMatrixMath convention: linear RGBA coefficients + a 0–255 offset column) and
6
+ // runs through this one pass instead of one pass per op. Sampled color is treated as premultiplied and
7
+ // the RGB result is clamped, matching the per-op color passes this replaces.
8
+ export function applyColorMatrixPassToWgpu(state, source, dest, matrix) {
9
+ const pipeline = getWgpuEffectPipeline(state, 'adjustment.colorMatrix', COLOR_MATRIX_FRAGMENT_WGSL, 'replace');
10
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
11
+ // Four coefficient rows (R/G/B/A) as vec4f, then the offset column as a fifth vec4f.
12
+ f32[0] = matrix[0] ?? 0;
13
+ f32[1] = matrix[1] ?? 0;
14
+ f32[2] = matrix[2] ?? 0;
15
+ f32[3] = matrix[3] ?? 0;
16
+ f32[4] = matrix[5] ?? 0;
17
+ f32[5] = matrix[6] ?? 0;
18
+ f32[6] = matrix[7] ?? 0;
19
+ f32[7] = matrix[8] ?? 0;
20
+ f32[8] = matrix[10] ?? 0;
21
+ f32[9] = matrix[11] ?? 0;
22
+ f32[10] = matrix[12] ?? 0;
23
+ f32[11] = matrix[13] ?? 0;
24
+ f32[12] = matrix[15] ?? 0;
25
+ f32[13] = matrix[16] ?? 0;
26
+ f32[14] = matrix[17] ?? 0;
27
+ f32[15] = matrix[18] ?? 0;
28
+ f32[16] = matrix[4] ?? 0;
29
+ f32[17] = matrix[9] ?? 0;
30
+ f32[18] = matrix[14] ?? 0;
31
+ f32[19] = matrix[19] ?? 0;
32
+ });
33
+ }
34
+ // Slot layout: [0..3]=row R, [4..7]=row G, [8..11]=row B, [12..15]=row A, [16..19]=offset column.
35
+ // The offset column is 0–255; normalized color needs it divided by 255.
36
+ const COLOR_MATRIX_FRAGMENT_WGSL = /* wgsl */ `
37
+ struct Uniforms { u_row_r : vec4f, u_row_g : vec4f, u_row_b : vec4f, u_row_a : vec4f, u_offset : vec4f, }
38
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
39
+ @group(1) @binding(0) var tex : texture_2d<f32>;
40
+ @group(1) @binding(1) var smp : sampler;
41
+
42
+ @fragment
43
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
44
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
45
+ let nr = uni.u_row_r.x * c.r + uni.u_row_r.y * c.g + uni.u_row_r.z * c.b + uni.u_row_r.w * c.a + uni.u_offset.x / 255.0;
46
+ let ng = uni.u_row_g.x * c.r + uni.u_row_g.y * c.g + uni.u_row_g.z * c.b + uni.u_row_g.w * c.a + uni.u_offset.y / 255.0;
47
+ let nb = uni.u_row_b.x * c.r + uni.u_row_b.y * c.g + uni.u_row_b.z * c.b + uni.u_row_b.w * c.a + uni.u_offset.z / 255.0;
48
+ let na = uni.u_row_a.x * c.r + uni.u_row_a.y * c.g + uni.u_row_a.z * c.b + uni.u_row_a.w * c.a + uni.u_offset.w / 255.0;
49
+ return vec4f(clamp(vec3f(nr, ng, nb), vec3f(0.0), vec3f(1.0)), na);
50
+ }`;
51
+ //# sourceMappingURL=wgpuColorMatrixPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuColorMatrixPass.js","sourceRoot":"","sources":["../src/wgpuColorMatrixPass.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,iGAAiG;AACjG,wGAAwG;AACxG,oGAAoG;AACpG,uGAAuG;AACvG,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA6B;IAE7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC/G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,qFAAqF;QACrF,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,wEAAwE;AACxE,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;EAc5C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ConvolutionEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare const MAX_CONVOLUTION_EFFECT_WGPU_KERNEL_SIZE = 49;
3
+ export declare function applyConvolutionEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<ConvolutionEffect>): void;
4
+ export declare const defaultWgpuConvolutionEffectRunner: WgpuRenderEffectRunner;
5
+ //# sourceMappingURL=wgpuConvolutionEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuConvolutionEffect.d.ts","sourceRoot":"","sources":["../src/wgpuConvolutionEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOpH,eAAO,MAAM,uCAAuC,KAAK,CAAC;AAI1D,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,IAAI,CAmCN;AAED,eAAO,MAAM,kCAAkC,EAAE,sBAEhD,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Largest kernel the WebGPU path supports (a 7×7 = 49 elements). The uniform struct packs to 244
4
+ // bytes, within the effect-pass 256-byte slot.
5
+ export const MAX_CONVOLUTION_EFFECT_WGPU_KERNEL_SIZE = 49;
6
+ // Generic matrix-kernel convolution: each output pixel is the weighted sum of its matrixX×matrixY
7
+ // neighborhood, normalized by `divisor` (defaults to the matrix sum) and offset by `bias`.
8
+ export function applyConvolutionEffectToWgpu(state, source, dest, effect) {
9
+ const { matrix, matrixX, matrixY } = effect;
10
+ if (matrixX <= 0 || matrixY <= 0)
11
+ throw new Error('Convolution matrix dimensions must be positive');
12
+ if (matrixX * matrixY > MAX_CONVOLUTION_EFFECT_WGPU_KERNEL_SIZE)
13
+ throw new Error(`Convolution kernel exceeds the WebGPU maximum of 7×7 (${matrixX}×${matrixY} given)`);
14
+ if (matrix.length < matrixX * matrixY)
15
+ throw new Error('Convolution matrix does not match its declared dimensions');
16
+ const bias = effect.bias ?? 0;
17
+ const clampEdge = effect.clamp ?? true;
18
+ const preserveAlpha = effect.preserveAlpha ?? true;
19
+ const edgeColor = effect.color ?? 0;
20
+ const divisor = effect.divisor ?? getAutoDivisor(matrix, matrixX * matrixY);
21
+ const pipeline = getWgpuEffectPipeline(state, 'stylization.convolution', CONVOLUTION_WGSL, 'replace');
22
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32, i32) => {
23
+ // texelSize at offset 0 (f32[0], f32[1])
24
+ f32[0] = 1 / source.width;
25
+ f32[1] = 1 / source.height;
26
+ // matrixX, matrixY at offset 8, 12 (i32[2], i32[3])
27
+ i32[2] = matrixX;
28
+ i32[3] = matrixY;
29
+ // divisor, bias at offset 16, 20 (f32[4], f32[5])
30
+ f32[4] = divisor;
31
+ f32[5] = bias;
32
+ // clampEdge, preserveAlpha at offset 24, 28 (i32[6], i32[7])
33
+ i32[6] = clampEdge ? 1 : 0;
34
+ i32[7] = preserveAlpha ? 1 : 0;
35
+ // edgeColor at offset 32 (f32[8..11])
36
+ f32[8] = ((edgeColor >> 16) & 0xff) / 255;
37
+ f32[9] = ((edgeColor >> 8) & 0xff) / 255;
38
+ f32[10] = (edgeColor & 0xff) / 255;
39
+ f32[11] = ((edgeColor >>> 24) & 0xff) / 255;
40
+ // matrix at offset 48 (f32[12..60])
41
+ for (let i = 0; i < matrixX * matrixY; i++)
42
+ f32[12 + i] = matrix[i];
43
+ });
44
+ }
45
+ export const defaultWgpuConvolutionEffectRunner = (ctx, effect) => {
46
+ applyConvolutionEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
47
+ };
48
+ // Sums the kernel weights; returns 1 when the sum is 0 (e.g. an edge-detect kernel) so the divide is safe.
49
+ function getAutoDivisor(matrix, length) {
50
+ let sum = 0;
51
+ for (let i = 0; i < length; i++)
52
+ sum += matrix[i];
53
+ return sum === 0 ? 1 : sum;
54
+ }
55
+ // Uniforms layout:
56
+ // offset 0: texelSize (vec2f) offset 8: matrixX (i32) offset 12: matrixY (i32)
57
+ // offset 16: divisor (f32) offset 20: bias (f32) offset 24: clampEdge (i32)
58
+ // offset 28: preserveAlpha (i32) offset 32: edgeColor (vec4f)
59
+ // offset 48: matrix (array<f32, 49>) — 244 bytes total, within the 256-byte slot.
60
+ const CONVOLUTION_WGSL = /* wgsl */ `
61
+ struct Uniforms {
62
+ texelSize : vec2f,
63
+ matrixX : i32,
64
+ matrixY : i32,
65
+ divisor : f32,
66
+ bias : f32,
67
+ clampEdge : i32,
68
+ preserveAlpha : i32,
69
+ edgeColor : vec4f,
70
+ matrix : array<f32, ${MAX_CONVOLUTION_EFFECT_WGPU_KERNEL_SIZE}>,
71
+ }
72
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
73
+ @group(1) @binding(0) var tex : texture_2d<f32>;
74
+ @group(1) @binding(1) var smp : sampler;
75
+
76
+ fn sampleAt(uv : vec2f) -> vec4f {
77
+ if (uni.clampEdge != 0) {
78
+ return textureSampleLevel(tex, smp, clamp(uv, vec2f(0.0), vec2f(1.0)), 0.0);
79
+ }
80
+ if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
81
+ return uni.edgeColor;
82
+ }
83
+ return textureSampleLevel(tex, smp, uv, 0.0);
84
+ }
85
+
86
+ @fragment
87
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
88
+ let offsetX = uni.matrixX / 2;
89
+ let offsetY = uni.matrixY / 2;
90
+ var sum = vec4f(0.0);
91
+ for (var ky : i32 = 0; ky < uni.matrixY; ky++) {
92
+ for (var kx : i32 = 0; kx < uni.matrixX; kx++) {
93
+ let weight = uni.matrix[ky * uni.matrixX + kx];
94
+ let off = vec2f(f32(kx - offsetX), f32(ky - offsetY)) * uni.texelSize;
95
+ sum += sampleAt(uv + off) * weight;
96
+ }
97
+ }
98
+ sum = sum / uni.divisor;
99
+ sum += uni.bias / 255.0;
100
+ sum = clamp(sum, vec4f(0.0), vec4f(1.0));
101
+ if (uni.preserveAlpha != 0) {
102
+ let origAlpha = textureSampleLevel(tex, smp, uv, 0.0).a;
103
+ let straightRGB = select(vec3f(0.0), clamp(sum.rgb / sum.a, vec3f(0.0), vec3f(1.0)), sum.a > 0.0);
104
+ sum = vec4f(straightRGB * origAlpha, origAlpha);
105
+ }
106
+ return sum;
107
+ }`;
108
+ //# sourceMappingURL=wgpuConvolutionEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuConvolutionEffect.js","sourceRoot":"","sources":["../src/wgpuConvolutionEffect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuCrtEffect.d.ts","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAM5G,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAcN;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC"}
1
+ {"version":3,"file":"wgpuCrtEffect.d.ts","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO5G,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAcN;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
3
  // CRT: barrel-distort the uv (curvature), darken alternating scanlines, vignette the edges, and split
4
4
  // the channels outward (chromatic aberration) for a tube-monitor look.
@@ -8,7 +8,7 @@ export function applyCrtEffectToWgpu(state, source, dest, effect) {
8
8
  const vignette = effect.vignette ?? 0.3;
9
9
  const aberration = effect.aberration ?? 0.005;
10
10
  const pipeline = getWgpuEffectPipeline(state, 'stylization.crt', CRT_FRAGMENT_WGSL, 'replace');
11
- drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
11
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
12
12
  f32[0] = curvature;
13
13
  f32[1] = scanlineIntensity;
14
14
  f32[2] = vignette;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuCrtEffect.js","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAClC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA2B;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC/F,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,sGAAsG;AACtG,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCnC,CAAC"}
1
+ {"version":3,"file":"wgpuCrtEffect.js","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAClC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA2B;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC/F,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,sGAAsG;AACtG,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOxH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACtC,IAAI,CAYN;AAED,eAAO,MAAM,sCAAsC,EAAE,sBAEpD,CAAC"}
1
+ {"version":3,"file":"wgpuDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQxH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACtC,IAAI,CAYN;AAED,eAAO,MAAM,sCAAsC,EAAE,sBAEpD,CAAC"}
@@ -1,4 +1,4 @@
1
- import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
3
  // Directional blur: accumulate samples stepped along `angle` over `length` texels, normalized by the
4
4
  // sample count. Single-pass reference recipe, the Wgpu mirror of effects-gl's
@@ -8,7 +8,7 @@ export function applyDirectionalBlurEffectToWgpu(state, source, dest, effect) {
8
8
  const length = effect.length ?? 8;
9
9
  const samples = effect.samples ?? 16;
10
10
  const pipeline = getWgpuEffectPipeline(state, 'motion.directionalBlur', DIRECTIONAL_BLUR_FRAGMENT_WGSL, 'replace');
11
- drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
11
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
12
12
  f32[0] = angle;
13
13
  f32[1] = length;
14
14
  f32[2] = samples;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDirectionalBlurEffect.js","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,qGAAqG;AACrG,8EAA8E;AAC9E,wFAAwF;AACxF,MAAM,UAAU,gCAAgC,CAC9C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAuC;IAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IACnH,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sCAAsC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5F,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA+B,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,8BAA8B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhD,CAAC"}
1
+ {"version":3,"file":"wgpuDirectionalBlurEffect.js","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,qGAAqG;AACrG,8EAA8E;AAC9E,wFAAwF;AACxF,MAAM,UAAU,gCAAgC,CAC9C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAuC;IAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IACnH,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sCAAsC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5F,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA+B,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,8BAA8B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDisplacementEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKrH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAaN;AAED,eAAO,MAAM,mCAAmC,EAAE,sBAEjD,CAAC"}
1
+ {"version":3,"file":"wgpuDisplacementEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAMrH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAaN;AAED,eAAO,MAAM,mCAAmC,EAAE,sBAEjD,CAAC"}
@@ -1,4 +1,4 @@
1
- import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
3
  // Displacement / heat-haze: warp the sample uv by an animated sine field for a refractive wobble.
4
4
  export function applyDisplacementEffectToWgpu(state, source, dest, effect) {
@@ -6,7 +6,7 @@ export function applyDisplacementEffectToWgpu(state, source, dest, effect) {
6
6
  const frequency = effect.frequency ?? 12;
7
7
  const seed = effect.seed ?? 0;
8
8
  const pipeline = getWgpuEffectPipeline(state, 'lens.displacement', DISPLACEMENT_FRAGMENT_WGSL, 'replace');
9
- drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
9
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
10
10
  f32[0] = intensity;
11
11
  f32[1] = frequency;
12
12
  f32[2] = seed;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDisplacementEffect.js","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,kGAAkG;AAClG,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAoC;IAEpC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC1G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,sCAAsC;AACtC,0EAA0E;AAC1E,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB5C,CAAC"}
1
+ {"version":3,"file":"wgpuDisplacementEffect.js","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,kGAAkG;AAClG,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAoC;IAEpC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC1G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,sCAAsC;AACtC,0EAA0E;AAC1E,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDitherEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAM/G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CASN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC"}
1
+ {"version":3,"file":"wgpuDitherEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO/G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CASN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC"}
@@ -1,11 +1,11 @@
1
- import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
1
+ import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
3
  // Dither: quantize each channel to `levels` steps with a 4x4 ordered Bayer threshold for a retro
4
4
  // banded-but-textured look.
5
5
  export function applyDitherEffectToWgpu(state, source, dest, effect) {
6
6
  const levels = effect.levels ?? 4;
7
7
  const pipeline = getWgpuEffectPipeline(state, 'stylization.dither', DITHER_FRAGMENT_WGSL, 'replace');
8
- drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
8
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
9
9
  f32[0] = Math.max(2, levels);
10
10
  // u_resolution (vec2f) aligns to slot [2].
11
11
  f32[2] = source.width;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDitherEffect.js","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,iGAAiG;AACjG,4BAA4B;AAC5B,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBtC,CAAC"}
1
+ {"version":3,"file":"wgpuDitherEffect.js","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,iGAAiG;AACjG,4BAA4B;AAC5B,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBtC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DropShadowEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget, WgpuRenderTargetPool } from '@flighthq/types';
2
+ export declare function applyDropShadowEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, pool: WgpuRenderTargetPool, effect: Readonly<DropShadowEffect>): void;
3
+ export declare const defaultWgpuDropShadowEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuDropShadowEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDropShadowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDropShadowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CA0CN;AAED,eAAO,MAAM,iCAAiC,EAAE,sBAE/C,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu';
2
+ import { applyWgpuEffectBlitOffsetPass, applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
3
+ import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
4
+ import { clearWgpuEffectTarget } from './wgpuEffectPass';
5
+ import { applyWgpuEffectTintPass } from './wgpuEffectTintShader';
6
+ // Drop-shadow composite effect: tint the scene silhouette, blur it, offset it by angle/distance, then composite the source over the shadow.
7
+ // Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
8
+ // multi-pass recipe (tint → box blur → offset → composite), then releases them.
9
+ export function applyDropShadowEffectToWgpu(state, source, dest, pool, effect) {
10
+ if (effect.knockout)
11
+ return;
12
+ const src = source;
13
+ const dst = dest;
14
+ const descriptor = { width: source.width, height: source.height, format: source.format };
15
+ const mask = acquireWgpuRenderTarget(state, pool, descriptor);
16
+ const blurred = acquireWgpuRenderTarget(state, pool, descriptor);
17
+ const blurTemp = acquireWgpuRenderTarget(state, pool, descriptor);
18
+ const angle = ((effect.angle ?? 45) * Math.PI) / 180;
19
+ const distance = effect.distance ?? 4;
20
+ const dx = Math.cos(angle) * distance;
21
+ const dy = Math.sin(angle) * distance;
22
+ const color = effect.color ?? 0;
23
+ const alpha = effect.alpha ?? 1;
24
+ const strength = effect.strength ?? 1;
25
+ const quality = Math.max(1, Math.round(effect.quality ?? 1));
26
+ const hideObject = effect.hideObject ?? false;
27
+ const tintStrength = Math.min(1, strength);
28
+ const shadowPasses = Math.max(1, Math.floor(strength));
29
+ applyWgpuEffectTintPass(state, src, mask, color, alpha, tintStrength);
30
+ applyWgpuEffectBoxBlur(state, mask, blurred, blurTemp, {
31
+ blurX: effect.blurX ?? 4,
32
+ blurY: effect.blurY ?? 4,
33
+ passes: quality,
34
+ });
35
+ clearWgpuEffectTarget(state, dst);
36
+ for (let i = 0; i < shadowPasses; i++) {
37
+ applyWgpuEffectBlitOffsetPass(state, blurred, dst, dx, dy);
38
+ }
39
+ if (!hideObject) {
40
+ applyWgpuEffectBlitPass(state, src, dst);
41
+ }
42
+ releaseWgpuRenderTarget(pool, mask);
43
+ releaseWgpuRenderTarget(pool, blurred);
44
+ releaseWgpuRenderTarget(pool, blurTemp);
45
+ }
46
+ export const defaultWgpuDropShadowEffectRunner = (ctx, effect) => {
47
+ applyDropShadowEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
48
+ };
49
+ //# sourceMappingURL=wgpuDropShadowEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDropShadowEffect.js","sourceRoot":"","sources":["../src/wgpuDropShadowEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ /**
3
+ * Blits source into dest at a pixel offset (dx, dy in screen-space Y-down).
4
+ * Pixels sampling outside the source bounds produce transparent output.
5
+ *
6
+ * The offset matches the Gl path exactly — (-dx/w, +dy/h). The shader samples `uv + offset`, so a
7
+ * screen-space shift of (+dx,+dy) needs offset (-dx, +dy): the +dy is NOT negated for Wgpu. Wgpu's UV
8
+ * y=0 is top (opposite Gl's bottom-origin) but Wgpu render-target textures are also stored top-down, so
9
+ * the two inversions cancel. A previous extra Y negation put the shadow on the wrong side of the source
10
+ * (it landed up-left instead of down-right) — caught by filter-drop-shadow-parity.
11
+ */
12
+ export declare function applyWgpuEffectBlitOffsetPass(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget, dx: number, dy: number): void;
13
+ /** Blits source directly into dest without modification. */
14
+ export declare function applyWgpuEffectBlitPass(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget): void;
15
+ //# sourceMappingURL=wgpuEffectBlitShader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectBlitShader.d.ts","sourceRoot":"","sources":["../src/wgpuEffectBlitShader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAoCzE;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,EACtB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI,CAMN;AAED,4DAA4D;AAC5D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAGN"}