@flighthq/effects-wgpu 0.1.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 (245) hide show
  1. package/dist/index.d.ts +49 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +49 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/wgpuBloomEffect.d.ts +4 -0
  6. package/dist/wgpuBloomEffect.d.ts.map +1 -0
  7. package/dist/wgpuBloomEffect.js +72 -0
  8. package/dist/wgpuBloomEffect.js.map +1 -0
  9. package/dist/wgpuBokehDepthOfFieldEffect.d.ts +4 -0
  10. package/dist/wgpuBokehDepthOfFieldEffect.d.ts.map +1 -0
  11. package/dist/wgpuBokehDepthOfFieldEffect.js +51 -0
  12. package/dist/wgpuBokehDepthOfFieldEffect.js.map +1 -0
  13. package/dist/wgpuBrightnessContrastEffect.d.ts +4 -0
  14. package/dist/wgpuBrightnessContrastEffect.d.ts.map +1 -0
  15. package/dist/wgpuBrightnessContrastEffect.js +29 -0
  16. package/dist/wgpuBrightnessContrastEffect.js.map +1 -0
  17. package/dist/wgpuCameraMotionBlurEffect.d.ts +4 -0
  18. package/dist/wgpuCameraMotionBlurEffect.d.ts.map +1 -0
  19. package/dist/wgpuCameraMotionBlurEffect.js +49 -0
  20. package/dist/wgpuCameraMotionBlurEffect.js.map +1 -0
  21. package/dist/wgpuChannelMixerEffect.d.ts +4 -0
  22. package/dist/wgpuChannelMixerEffect.d.ts.map +1 -0
  23. package/dist/wgpuChannelMixerEffect.js +34 -0
  24. package/dist/wgpuChannelMixerEffect.js.map +1 -0
  25. package/dist/wgpuChromaticAberrationEffect.d.ts +4 -0
  26. package/dist/wgpuChromaticAberrationEffect.d.ts.map +1 -0
  27. package/dist/wgpuChromaticAberrationEffect.js +40 -0
  28. package/dist/wgpuChromaticAberrationEffect.js.map +1 -0
  29. package/dist/wgpuColorGradeEffect.d.ts +4 -0
  30. package/dist/wgpuColorGradeEffect.d.ts.map +1 -0
  31. package/dist/wgpuColorGradeEffect.js +52 -0
  32. package/dist/wgpuColorGradeEffect.js.map +1 -0
  33. package/dist/wgpuCrtEffect.d.ts +4 -0
  34. package/dist/wgpuCrtEffect.d.ts.map +1 -0
  35. package/dist/wgpuCrtEffect.js +60 -0
  36. package/dist/wgpuCrtEffect.js.map +1 -0
  37. package/dist/wgpuDirectionalBlurEffect.d.ts +4 -0
  38. package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -0
  39. package/dist/wgpuDirectionalBlurEffect.js +52 -0
  40. package/dist/wgpuDirectionalBlurEffect.js.map +1 -0
  41. package/dist/wgpuDisplacementEffect.d.ts +4 -0
  42. package/dist/wgpuDisplacementEffect.d.ts.map +1 -0
  43. package/dist/wgpuDisplacementEffect.js +44 -0
  44. package/dist/wgpuDisplacementEffect.js.map +1 -0
  45. package/dist/wgpuDitherEffect.d.ts +4 -0
  46. package/dist/wgpuDitherEffect.d.ts.map +1 -0
  47. package/dist/wgpuDitherEffect.js +45 -0
  48. package/dist/wgpuDitherEffect.js.map +1 -0
  49. package/dist/wgpuEffectProgramCache.d.ts +4 -0
  50. package/dist/wgpuEffectProgramCache.d.ts.map +1 -0
  51. package/dist/wgpuEffectProgramCache.js +26 -0
  52. package/dist/wgpuEffectProgramCache.js.map +1 -0
  53. package/dist/wgpuExposureEffect.d.ts +4 -0
  54. package/dist/wgpuExposureEffect.d.ts.map +1 -0
  55. package/dist/wgpuExposureEffect.js +28 -0
  56. package/dist/wgpuExposureEffect.js.map +1 -0
  57. package/dist/wgpuFilmGrainEffect.d.ts +4 -0
  58. package/dist/wgpuFilmGrainEffect.d.ts.map +1 -0
  59. package/dist/wgpuFilmGrainEffect.js +41 -0
  60. package/dist/wgpuFilmGrainEffect.js.map +1 -0
  61. package/dist/wgpuFxaaEffect.d.ts +4 -0
  62. package/dist/wgpuFxaaEffect.d.ts.map +1 -0
  63. package/dist/wgpuFxaaEffect.js +65 -0
  64. package/dist/wgpuFxaaEffect.js.map +1 -0
  65. package/dist/wgpuGlitchEffect.d.ts +4 -0
  66. package/dist/wgpuGlitchEffect.d.ts.map +1 -0
  67. package/dist/wgpuGlitchEffect.js +60 -0
  68. package/dist/wgpuGlitchEffect.js.map +1 -0
  69. package/dist/wgpuGodRaysEffect.d.ts +4 -0
  70. package/dist/wgpuGodRaysEffect.d.ts.map +1 -0
  71. package/dist/wgpuGodRaysEffect.js +67 -0
  72. package/dist/wgpuGodRaysEffect.js.map +1 -0
  73. package/dist/wgpuGrayscaleEffect.d.ts +4 -0
  74. package/dist/wgpuGrayscaleEffect.d.ts.map +1 -0
  75. package/dist/wgpuGrayscaleEffect.js +27 -0
  76. package/dist/wgpuGrayscaleEffect.js.map +1 -0
  77. package/dist/wgpuHalftoneEffect.d.ts +4 -0
  78. package/dist/wgpuHalftoneEffect.d.ts.map +1 -0
  79. package/dist/wgpuHalftoneEffect.js +45 -0
  80. package/dist/wgpuHalftoneEffect.js.map +1 -0
  81. package/dist/wgpuHueSaturationEffect.d.ts +4 -0
  82. package/dist/wgpuHueSaturationEffect.d.ts.map +1 -0
  83. package/dist/wgpuHueSaturationEffect.js +75 -0
  84. package/dist/wgpuHueSaturationEffect.js.map +1 -0
  85. package/dist/wgpuInvertEffect.d.ts +4 -0
  86. package/dist/wgpuInvertEffect.d.ts.map +1 -0
  87. package/dist/wgpuInvertEffect.js +26 -0
  88. package/dist/wgpuInvertEffect.js.map +1 -0
  89. package/dist/wgpuKuwaharaEffect.d.ts +4 -0
  90. package/dist/wgpuKuwaharaEffect.d.ts.map +1 -0
  91. package/dist/wgpuKuwaharaEffect.js +69 -0
  92. package/dist/wgpuKuwaharaEffect.js.map +1 -0
  93. package/dist/wgpuLensDirtEffect.d.ts +4 -0
  94. package/dist/wgpuLensDirtEffect.d.ts.map +1 -0
  95. package/dist/wgpuLensDirtEffect.js +51 -0
  96. package/dist/wgpuLensDirtEffect.js.map +1 -0
  97. package/dist/wgpuLensDistortionEffect.d.ts +4 -0
  98. package/dist/wgpuLensDistortionEffect.d.ts.map +1 -0
  99. package/dist/wgpuLensDistortionEffect.js +36 -0
  100. package/dist/wgpuLensDistortionEffect.js.map +1 -0
  101. package/dist/wgpuLensFlareEffect.d.ts +4 -0
  102. package/dist/wgpuLensFlareEffect.d.ts.map +1 -0
  103. package/dist/wgpuLensFlareEffect.js +61 -0
  104. package/dist/wgpuLensFlareEffect.js.map +1 -0
  105. package/dist/wgpuLiftGammaGainEffect.d.ts +4 -0
  106. package/dist/wgpuLiftGammaGainEffect.d.ts.map +1 -0
  107. package/dist/wgpuLiftGammaGainEffect.js +51 -0
  108. package/dist/wgpuLiftGammaGainEffect.js.map +1 -0
  109. package/dist/wgpuLookupTableGradeEffect.d.ts +4 -0
  110. package/dist/wgpuLookupTableGradeEffect.d.ts.map +1 -0
  111. package/dist/wgpuLookupTableGradeEffect.js +30 -0
  112. package/dist/wgpuLookupTableGradeEffect.js.map +1 -0
  113. package/dist/wgpuMotionBlurEffect.d.ts +4 -0
  114. package/dist/wgpuMotionBlurEffect.d.ts.map +1 -0
  115. package/dist/wgpuMotionBlurEffect.js +97 -0
  116. package/dist/wgpuMotionBlurEffect.js.map +1 -0
  117. package/dist/wgpuOutlineEffect.d.ts +4 -0
  118. package/dist/wgpuOutlineEffect.d.ts.map +1 -0
  119. package/dist/wgpuOutlineEffect.js +64 -0
  120. package/dist/wgpuOutlineEffect.js.map +1 -0
  121. package/dist/wgpuPixelateEffect.d.ts +4 -0
  122. package/dist/wgpuPixelateEffect.d.ts.map +1 -0
  123. package/dist/wgpuPixelateEffect.js +34 -0
  124. package/dist/wgpuPixelateEffect.js.map +1 -0
  125. package/dist/wgpuPosterizeEffect.d.ts +4 -0
  126. package/dist/wgpuPosterizeEffect.d.ts.map +1 -0
  127. package/dist/wgpuPosterizeEffect.js +27 -0
  128. package/dist/wgpuPosterizeEffect.js.map +1 -0
  129. package/dist/wgpuRadialBlurEffect.d.ts +4 -0
  130. package/dist/wgpuRadialBlurEffect.d.ts.map +1 -0
  131. package/dist/wgpuRadialBlurEffect.js +50 -0
  132. package/dist/wgpuRadialBlurEffect.js.map +1 -0
  133. package/dist/wgpuRenderEffectPipeline.d.ts +7 -0
  134. package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -0
  135. package/dist/wgpuRenderEffectPipeline.js +106 -0
  136. package/dist/wgpuRenderEffectPipeline.js.map +1 -0
  137. package/dist/wgpuRenderEffectRegistrants.d.ts +9 -0
  138. package/dist/wgpuRenderEffectRegistrants.d.ts.map +1 -0
  139. package/dist/wgpuRenderEffectRegistrants.js +129 -0
  140. package/dist/wgpuRenderEffectRegistrants.js.map +1 -0
  141. package/dist/wgpuRenderEffectRegistry.d.ts +5 -0
  142. package/dist/wgpuRenderEffectRegistry.d.ts.map +1 -0
  143. package/dist/wgpuRenderEffectRegistry.js +25 -0
  144. package/dist/wgpuRenderEffectRegistry.js.map +1 -0
  145. package/dist/wgpuScanlinesEffect.d.ts +4 -0
  146. package/dist/wgpuScanlinesEffect.d.ts.map +1 -0
  147. package/dist/wgpuScanlinesEffect.js +32 -0
  148. package/dist/wgpuScanlinesEffect.js.map +1 -0
  149. package/dist/wgpuScreenSpaceFogEffect.d.ts +4 -0
  150. package/dist/wgpuScreenSpaceFogEffect.d.ts.map +1 -0
  151. package/dist/wgpuScreenSpaceFogEffect.js +47 -0
  152. package/dist/wgpuScreenSpaceFogEffect.js.map +1 -0
  153. package/dist/wgpuSepiaEffect.d.ts +4 -0
  154. package/dist/wgpuSepiaEffect.d.ts.map +1 -0
  155. package/dist/wgpuSepiaEffect.js +31 -0
  156. package/dist/wgpuSepiaEffect.js.map +1 -0
  157. package/dist/wgpuSharpenEffect.d.ts +4 -0
  158. package/dist/wgpuSharpenEffect.d.ts.map +1 -0
  159. package/dist/wgpuSharpenEffect.js +40 -0
  160. package/dist/wgpuSharpenEffect.js.map +1 -0
  161. package/dist/wgpuSketchEffect.d.ts +4 -0
  162. package/dist/wgpuSketchEffect.d.ts.map +1 -0
  163. package/dist/wgpuSketchEffect.js +51 -0
  164. package/dist/wgpuSketchEffect.js.map +1 -0
  165. package/dist/wgpuSmaaEffect.d.ts +4 -0
  166. package/dist/wgpuSmaaEffect.d.ts.map +1 -0
  167. package/dist/wgpuSmaaEffect.js +52 -0
  168. package/dist/wgpuSmaaEffect.js.map +1 -0
  169. package/dist/wgpuSsaoEffect.d.ts +4 -0
  170. package/dist/wgpuSsaoEffect.d.ts.map +1 -0
  171. package/dist/wgpuSsaoEffect.js +51 -0
  172. package/dist/wgpuSsaoEffect.js.map +1 -0
  173. package/dist/wgpuSsrEffect.d.ts +4 -0
  174. package/dist/wgpuSsrEffect.d.ts.map +1 -0
  175. package/dist/wgpuSsrEffect.js +28 -0
  176. package/dist/wgpuSsrEffect.js.map +1 -0
  177. package/dist/wgpuTaaEffect.d.ts +4 -0
  178. package/dist/wgpuTaaEffect.d.ts.map +1 -0
  179. package/dist/wgpuTaaEffect.js +27 -0
  180. package/dist/wgpuTaaEffect.js.map +1 -0
  181. package/dist/wgpuTiltShiftEffect.d.ts +4 -0
  182. package/dist/wgpuTiltShiftEffect.d.ts.map +1 -0
  183. package/dist/wgpuTiltShiftEffect.js +51 -0
  184. package/dist/wgpuTiltShiftEffect.js.map +1 -0
  185. package/dist/wgpuToneMapEffect.d.ts +4 -0
  186. package/dist/wgpuToneMapEffect.d.ts.map +1 -0
  187. package/dist/wgpuToneMapEffect.js +57 -0
  188. package/dist/wgpuToneMapEffect.js.map +1 -0
  189. package/dist/wgpuVignetteEffect.d.ts +4 -0
  190. package/dist/wgpuVignetteEffect.d.ts.map +1 -0
  191. package/dist/wgpuVignetteEffect.js +54 -0
  192. package/dist/wgpuVignetteEffect.js.map +1 -0
  193. package/dist/wgpuWhiteBalanceEffect.d.ts +4 -0
  194. package/dist/wgpuWhiteBalanceEffect.d.ts.map +1 -0
  195. package/dist/wgpuWhiteBalanceEffect.js +32 -0
  196. package/dist/wgpuWhiteBalanceEffect.js.map +1 -0
  197. package/package.json +42 -0
  198. package/src/wgpuBloomEffect.test.ts +13 -0
  199. package/src/wgpuBokehDepthOfFieldEffect.test.ts +16 -0
  200. package/src/wgpuBrightnessContrastEffect.test.ts +16 -0
  201. package/src/wgpuCameraMotionBlurEffect.test.ts +16 -0
  202. package/src/wgpuChannelMixerEffect.test.ts +13 -0
  203. package/src/wgpuChromaticAberrationEffect.test.ts +16 -0
  204. package/src/wgpuColorGradeEffect.test.ts +13 -0
  205. package/src/wgpuCrtEffect.test.ts +13 -0
  206. package/src/wgpuDirectionalBlurEffect.test.ts +13 -0
  207. package/src/wgpuDisplacementEffect.test.ts +13 -0
  208. package/src/wgpuDitherEffect.test.ts +13 -0
  209. package/src/wgpuEffectProgramCache.test.ts +7 -0
  210. package/src/wgpuExposureEffect.test.ts +13 -0
  211. package/src/wgpuFilmGrainEffect.test.ts +13 -0
  212. package/src/wgpuFxaaEffect.test.ts +13 -0
  213. package/src/wgpuGlitchEffect.test.ts +13 -0
  214. package/src/wgpuGodRaysEffect.test.ts +13 -0
  215. package/src/wgpuGrayscaleEffect.test.ts +13 -0
  216. package/src/wgpuHalftoneEffect.test.ts +13 -0
  217. package/src/wgpuHueSaturationEffect.test.ts +13 -0
  218. package/src/wgpuInvertEffect.test.ts +13 -0
  219. package/src/wgpuKuwaharaEffect.test.ts +13 -0
  220. package/src/wgpuLensDirtEffect.test.ts +13 -0
  221. package/src/wgpuLensDistortionEffect.test.ts +13 -0
  222. package/src/wgpuLensFlareEffect.test.ts +13 -0
  223. package/src/wgpuLiftGammaGainEffect.test.ts +13 -0
  224. package/src/wgpuLookupTableGradeEffect.test.ts +16 -0
  225. package/src/wgpuMotionBlurEffect.test.ts +13 -0
  226. package/src/wgpuOutlineEffect.test.ts +13 -0
  227. package/src/wgpuPixelateEffect.test.ts +13 -0
  228. package/src/wgpuPosterizeEffect.test.ts +13 -0
  229. package/src/wgpuRadialBlurEffect.test.ts +13 -0
  230. package/src/wgpuRenderEffectPipeline.test.ts +45 -0
  231. package/src/wgpuRenderEffectRegistrants.test.ts +122 -0
  232. package/src/wgpuRenderEffectRegistry.test.ts +40 -0
  233. package/src/wgpuScanlinesEffect.test.ts +13 -0
  234. package/src/wgpuScreenSpaceFogEffect.test.ts +13 -0
  235. package/src/wgpuSepiaEffect.test.ts +13 -0
  236. package/src/wgpuSharpenEffect.test.ts +13 -0
  237. package/src/wgpuSketchEffect.test.ts +13 -0
  238. package/src/wgpuSmaaEffect.test.ts +13 -0
  239. package/src/wgpuSsaoEffect.test.ts +13 -0
  240. package/src/wgpuSsrEffect.test.ts +13 -0
  241. package/src/wgpuTaaEffect.test.ts +13 -0
  242. package/src/wgpuTiltShiftEffect.test.ts +13 -0
  243. package/src/wgpuToneMapEffect.test.ts +13 -0
  244. package/src/wgpuVignetteEffect.test.ts +13 -0
  245. package/src/wgpuWhiteBalanceEffect.test.ts +13 -0
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { DirectionalBlurEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyDirectionalBlurEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<DirectionalBlurEffect>): void;
3
+ export declare const defaultWgpuDirectionalBlurEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuDirectionalBlurEffect.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,52 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Directional blur: accumulate samples stepped along `angle` over `length` texels, normalized by the
4
+ // sample count. Single-pass reference recipe, the Wgpu mirror of effects-gl's
5
+ // applyDirectionalBlurEffectToGl. u_resolution converts the texel length into UV space.
6
+ export function applyDirectionalBlurEffectToWgpu(state, source, dest, effect) {
7
+ const angle = effect.angle ?? 0;
8
+ const length = effect.length ?? 8;
9
+ const samples = effect.samples ?? 16;
10
+ const pipeline = getWgpuEffectPipeline(state, 'motion.directionalBlur', DIRECTIONAL_BLUR_FRAGMENT_WGSL, 'replace');
11
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
12
+ f32[0] = angle;
13
+ f32[1] = length;
14
+ f32[2] = samples;
15
+ f32[4] = source.width;
16
+ f32[5] = source.height;
17
+ });
18
+ }
19
+ export const defaultWgpuDirectionalBlurEffectRunner = (ctx, effect) => {
20
+ applyDirectionalBlurEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
21
+ };
22
+ // Slot layout: [0]=angle, [1]=length, [2]=samples, [3]=pad, [4]=resolution.x, [5]=resolution.y.
23
+ const DIRECTIONAL_BLUR_FRAGMENT_WGSL = /* wgsl */ `
24
+ struct Uniforms {
25
+ u_angle : f32,
26
+ u_length : f32,
27
+ u_samples : f32,
28
+ _pad0 : f32,
29
+ u_resolution : vec2f,
30
+ }
31
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
32
+ @group(1) @binding(0) var tex : texture_2d<f32>;
33
+ @group(1) @binding(1) var smp : sampler;
34
+
35
+ const SAMPLES : i32 = 16;
36
+
37
+ @fragment
38
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
39
+ let dir = vec2f(cos(uni.u_angle), sin(uni.u_angle)) * (uni.u_length / uni.u_resolution);
40
+ let count = min(uni.u_samples, 16.0);
41
+ var sum = vec4f(0.0);
42
+ var taken = 0.0;
43
+ for (var i = 0; i < SAMPLES; i = i + 1) {
44
+ if (f32(i) >= count) { break; }
45
+ let t = select(0.0, (f32(i) / (count - 1.0)) - 0.5, count > 1.0);
46
+ let p = uv + dir * t;
47
+ sum = sum + textureSampleLevel(tex, smp, p, 0.0);
48
+ taken = taken + 1.0;
49
+ }
50
+ return sum / max(taken, 1.0);
51
+ }`;
52
+ //# sourceMappingURL=wgpuDirectionalBlurEffect.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { DisplacementEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyDisplacementEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<DisplacementEffect>): void;
3
+ export declare const defaultWgpuDisplacementEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuDisplacementEffect.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Displacement / heat-haze: warp the sample uv by an animated sine field for a refractive wobble.
4
+ export function applyDisplacementEffectToWgpu(state, source, dest, effect) {
5
+ const intensity = effect.intensity ?? 8;
6
+ const frequency = effect.frequency ?? 12;
7
+ const seed = effect.seed ?? 0;
8
+ const pipeline = getWgpuEffectPipeline(state, 'lens.displacement', DISPLACEMENT_FRAGMENT_WGSL, 'replace');
9
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
10
+ f32[0] = intensity;
11
+ f32[1] = frequency;
12
+ f32[2] = seed;
13
+ // u_resolution (vec2f) aligns to slot [4].
14
+ f32[4] = source.width;
15
+ f32[5] = source.height;
16
+ });
17
+ }
18
+ export const defaultWgpuDisplacementEffectRunner = (ctx, effect) => {
19
+ applyDisplacementEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
20
+ };
21
+ // Slot layout: [0]=amount, [1]=scale.
22
+ // Slot layout: [0]=intensity, [1]=frequency, [2]=seed, [4..5]=resolution.
23
+ const DISPLACEMENT_FRAGMENT_WGSL = /* wgsl */ `
24
+ struct Uniforms {
25
+ u_intensity : f32,
26
+ u_frequency : f32,
27
+ u_seed : f32,
28
+ u_resolution : vec2f,
29
+ }
30
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
31
+ @group(1) @binding(0) var tex : texture_2d<f32>;
32
+ @group(1) @binding(1) var smp : sampler;
33
+
34
+ @fragment
35
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
36
+ let f = uni.u_frequency;
37
+ let warp = vec2f(
38
+ sin(uv.y * f + uni.u_seed) + sin(uv.y * f * 2.3 + uni.u_seed * 1.7) * 0.5,
39
+ cos(uv.x * f * 0.8 + uni.u_seed * 1.3)
40
+ );
41
+ let displaced = uv + warp * (uni.u_intensity / uni.u_resolution);
42
+ return textureSampleLevel(tex, smp, displaced, 0.0);
43
+ }`;
44
+ //# sourceMappingURL=wgpuDisplacementEffect.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { DitherEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyDitherEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<DitherEffect>): void;
3
+ export declare const defaultWgpuDitherEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuDitherEffect.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,45 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Dither: quantize each channel to `levels` steps with a 4x4 ordered Bayer threshold for a retro
4
+ // banded-but-textured look.
5
+ export function applyDitherEffectToWgpu(state, source, dest, effect) {
6
+ const levels = effect.levels ?? 4;
7
+ const pipeline = getWgpuEffectPipeline(state, 'stylization.dither', DITHER_FRAGMENT_WGSL, 'replace');
8
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
9
+ f32[0] = Math.max(2, levels);
10
+ // u_resolution (vec2f) aligns to slot [2].
11
+ f32[2] = source.width;
12
+ f32[3] = source.height;
13
+ });
14
+ }
15
+ export const defaultWgpuDitherEffectRunner = (ctx, effect) => {
16
+ applyDitherEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
17
+ };
18
+ // Slot layout: [0]=levels, [1]=pad, [2..3]=resolution.
19
+ const DITHER_FRAGMENT_WGSL = /* wgsl */ `
20
+ struct Uniforms {
21
+ u_levels : f32,
22
+ _pad0 : f32,
23
+ u_resolution : vec2f,
24
+ }
25
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
26
+ @group(1) @binding(0) var tex : texture_2d<f32>;
27
+ @group(1) @binding(1) var smp : sampler;
28
+
29
+ fn bayer(p : vec2i) -> f32 {
30
+ let x = p.x & 3;
31
+ let y = p.y & 3;
32
+ var m = array<i32, 16>(0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5);
33
+ return f32(m[y * 4 + x]) / 16.0;
34
+ }
35
+
36
+ @fragment
37
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
38
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
39
+ let px = vec2i(uv * uni.u_resolution);
40
+ let t = bayer(px) - 0.5;
41
+ let steps = uni.u_levels - 1.0;
42
+ let q = floor(c.rgb * steps + 0.5 + t) / steps;
43
+ return vec4f(clamp(q, vec3f(0.0), vec3f(1.0)), c.a);
44
+ }`;
45
+ //# sourceMappingURL=wgpuDitherEffect.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuFilterPipeline } from '@flighthq/filters-wgpu';
2
+ import type { WgpuRenderState } from '@flighthq/types';
3
+ export declare function getWgpuEffectPipeline(state: WgpuRenderState, key: string, fragmentWGSL: string, blend?: 'premul' | 'replace'): WgpuFilterPipeline;
4
+ //# sourceMappingURL=wgpuEffectProgramCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectProgramCache.d.ts","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAavD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,QAAQ,GAAG,SAAqB,GACtC,kBAAkB,CAWpB"}
@@ -0,0 +1,26 @@
1
+ import { createWgpuFilterPipeline } from '@flighthq/filters-wgpu';
2
+ // Per-state cache of compiled effect filter pipelines, keyed by a stable string. Effect recipes call
3
+ // getWgpuEffectPipeline with their own key + fragment WGSL so each pipeline compiles once per state
4
+ // and is reused every frame. The WGSL is the fragment half only; createWgpuFilterPipeline prepends
5
+ // the shared fullscreen-quad vertex (FILTER_VERTEX_WGSL). Keeps compiled pipelines off the render-state
6
+ // runtime type. Mirrors effects-gl's getGlEffectProgram.
7
+ //
8
+ // Uniform-slot convention every recipe follows: the fragment declares
9
+ // struct Uniforms { ... } @group(0) @binding(0) var<uniform> uni : Uniforms;
10
+ // @group(1) @binding(0) var tex : texture_2d<f32>; @group(1) @binding(1) var smp : sampler;
11
+ // and packs its scalars into the f32/i32 slot written by drawWgpuFilterPass's setUniforms callback.
12
+ export function getWgpuEffectPipeline(state, key, fragmentWGSL, blend = 'replace') {
13
+ let cache = _pipelines.get(state);
14
+ if (cache === undefined) {
15
+ cache = new Map();
16
+ _pipelines.set(state, cache);
17
+ }
18
+ const existing = cache.get(key);
19
+ if (existing !== undefined)
20
+ return existing;
21
+ const compiled = createWgpuFilterPipeline(state, fragmentWGSL, blend);
22
+ cache.set(key, compiled);
23
+ return compiled;
24
+ }
25
+ const _pipelines = new WeakMap();
26
+ //# sourceMappingURL=wgpuEffectProgramCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectProgramCache.js","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,qGAAqG;AACrG,oGAAoG;AACpG,mGAAmG;AACnG,wGAAwG;AACxG,yDAAyD;AACzD,EAAE;AACF,sEAAsE;AACtE,+EAA+E;AAC/E,8FAA8F;AAC9F,oGAAoG;AAEpG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,GAAW,EACX,YAAoB,EACpB,QAA8B,SAAS;IAEvC,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,OAAO,EAAoD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ExposureEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyExposureEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<ExposureEffect>): void;
3
+ export declare const defaultWgpuExposureEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuExposureEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuExposureEffect.d.ts","sourceRoot":"","sources":["../src/wgpuExposureEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAMjH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAON;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Exposure: scale linear color by 2^stops. Single-pass reference recipe, the Wgpu mirror of
4
+ // effects-gl's applyExposureEffectToGl. The stops are converted to a linear multiplier in JS.
5
+ export function applyExposureEffectToWgpu(state, source, dest, effect) {
6
+ const exposure = effect.exposure ?? 0;
7
+ const multiplier = Math.pow(2, exposure);
8
+ const pipeline = getWgpuEffectPipeline(state, 'exposure', EXPOSURE_FRAGMENT_WGSL, 'replace');
9
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
10
+ f32[0] = multiplier;
11
+ });
12
+ }
13
+ export const defaultWgpuExposureEffectRunner = (ctx, effect) => {
14
+ applyExposureEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ // Slot [0]=multiplier (2^stops, precomputed in JS); the scalar struct pads to a 16-byte boundary.
17
+ const EXPOSURE_FRAGMENT_WGSL = /* wgsl */ `
18
+ struct Uniforms { u_exposure : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
19
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
20
+ @group(1) @binding(0) var tex : texture_2d<f32>;
21
+ @group(1) @binding(1) var smp : sampler;
22
+
23
+ @fragment
24
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
25
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
26
+ return vec4f(c.rgb * uni.u_exposure, c.a);
27
+ }`;
28
+ //# sourceMappingURL=wgpuExposureEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuExposureEffect.js","sourceRoot":"","sources":["../src/wgpuExposureEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,4FAA4F;AAC5F,8FAA8F;AAC9F,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IAC7F,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,kGAAkG;AAClG,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;EAUxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FilmGrainEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyFilmGrainEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<FilmGrainEffect>): void;
3
+ export declare const defaultWgpuFilmGrainEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuFilmGrainEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuFilmGrainEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAMlH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAUN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Film grain: add per-pixel hash noise scaled by intensity, with grain cell size and a seed so the
4
+ // noise can be animated frame to frame.
5
+ export function applyFilmGrainEffectToWgpu(state, source, dest, effect) {
6
+ const intensity = effect.intensity ?? 0.1;
7
+ const size = effect.size ?? 1;
8
+ const seed = effect.seed ?? 0;
9
+ const pipeline = getWgpuEffectPipeline(state, 'stylization.filmGrain', FILM_GRAIN_FRAGMENT_WGSL, 'replace');
10
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
11
+ f32[0] = intensity;
12
+ f32[1] = Math.max(0.0001, size);
13
+ f32[2] = seed;
14
+ });
15
+ }
16
+ export const defaultWgpuFilmGrainEffectRunner = (ctx, effect) => {
17
+ applyFilmGrainEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
18
+ };
19
+ // Slot layout: [0]=intensity, [1]=size, [2]=seed.
20
+ const FILM_GRAIN_FRAGMENT_WGSL = /* wgsl */ `
21
+ struct Uniforms {
22
+ u_intensity : f32,
23
+ u_size : f32,
24
+ u_seed : f32,
25
+ }
26
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
27
+ @group(1) @binding(0) var tex : texture_2d<f32>;
28
+ @group(1) @binding(1) var smp : sampler;
29
+
30
+ fn hash(pIn : vec2f) -> f32 {
31
+ let p = floor(pIn / uni.u_size);
32
+ return fract(sin(dot(p, vec2f(127.1, 311.7)) + uni.u_seed) * 43758.5453123);
33
+ }
34
+
35
+ @fragment
36
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
37
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
38
+ let n = hash(uv * 1024.0) - 0.5;
39
+ return vec4f(c.rgb + n * uni.u_intensity, c.a);
40
+ }`;
41
+ //# sourceMappingURL=wgpuFilmGrainEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuFilmGrainEffect.js","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,mGAAmG;AACnG,wCAAwC;AACxC,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAC5G,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,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB1C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FxaaEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyFxaaEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<FxaaEffect>): void;
3
+ export declare const defaultWgpuFxaaEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuFxaaEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuFxaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAM7G,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAUN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // FXAA: luminance edge detection + directional blend along the detected edge. Single-pass reference
4
+ // recipe. Reads `tex`; u_resolution gives the texel size; u_edgeThreshold gates edge detection.
5
+ export function applyFxaaEffectToWgpu(state, source, dest, effect) {
6
+ const edgeThreshold = effect.edgeThreshold ?? 0.0312;
7
+ const width = source.width;
8
+ const height = source.height;
9
+ const pipeline = getWgpuEffectPipeline(state, 'antialiasing.fxaa', FXAA_FRAGMENT_WGSL, 'replace');
10
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
11
+ f32[0] = width;
12
+ f32[1] = height;
13
+ f32[2] = edgeThreshold;
14
+ });
15
+ }
16
+ export const defaultWgpuFxaaEffectRunner = (ctx, effect) => {
17
+ applyFxaaEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
18
+ };
19
+ // Slots [0..1]=resolution (vec2f), [2]=edgeThreshold; the trailing scalar fits in the same 16-byte block.
20
+ const FXAA_FRAGMENT_WGSL = /* wgsl */ `
21
+ struct Uniforms { u_resolution : vec2f, u_edgeThreshold : f32, _pad0 : f32, }
22
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
23
+ @group(1) @binding(0) var tex : texture_2d<f32>;
24
+ @group(1) @binding(1) var smp : sampler;
25
+
26
+ fn luma(c : vec3f) -> f32 {
27
+ return dot(c, vec3f(0.299, 0.587, 0.114));
28
+ }
29
+
30
+ @fragment
31
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
32
+ let texel = 1.0 / uni.u_resolution;
33
+ let rgbM = textureSampleLevel(tex, smp, uv, 0.0).rgb;
34
+ let rgbNW = textureSampleLevel(tex, smp, uv + vec2f(-1.0, -1.0) * texel, 0.0).rgb;
35
+ let rgbNE = textureSampleLevel(tex, smp, uv + vec2f(1.0, -1.0) * texel, 0.0).rgb;
36
+ let rgbSW = textureSampleLevel(tex, smp, uv + vec2f(-1.0, 1.0) * texel, 0.0).rgb;
37
+ let rgbSE = textureSampleLevel(tex, smp, uv + vec2f(1.0, 1.0) * texel, 0.0).rgb;
38
+ let lumaM = luma(rgbM);
39
+ let lumaNW = luma(rgbNW);
40
+ let lumaNE = luma(rgbNE);
41
+ let lumaSW = luma(rgbSW);
42
+ let lumaSE = luma(rgbSE);
43
+ let lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
44
+ let lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
45
+ let range = lumaMax - lumaMin;
46
+ if (range < max(uni.u_edgeThreshold, lumaMax * 0.125)) {
47
+ return vec4f(rgbM, textureSampleLevel(tex, smp, uv, 0.0).a);
48
+ }
49
+ var dir : vec2f;
50
+ dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
51
+ dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));
52
+ let dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * 0.03125, 0.0078125);
53
+ let rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
54
+ dir = clamp(dir * rcpDirMin, vec2f(-8.0), vec2f(8.0)) * texel;
55
+ let rgbA = 0.5 * (
56
+ textureSampleLevel(tex, smp, uv + dir * (1.0 / 3.0 - 0.5), 0.0).rgb +
57
+ textureSampleLevel(tex, smp, uv + dir * (2.0 / 3.0 - 0.5), 0.0).rgb);
58
+ let rgbB = rgbA * 0.5 + 0.25 * (
59
+ textureSampleLevel(tex, smp, uv + dir * -0.5, 0.0).rgb +
60
+ textureSampleLevel(tex, smp, uv + dir * 0.5, 0.0).rgb);
61
+ let lumaB = luma(rgbB);
62
+ let result = select(rgbB, rgbA, lumaB < lumaMin || lumaB > lumaMax);
63
+ return vec4f(result, textureSampleLevel(tex, smp, uv, 0.0).a);
64
+ }`;
65
+ //# sourceMappingURL=wgpuFxaaEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuFxaaEffect.js","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,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,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,0GAA0G;AAC1G,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlitchEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyGlitchEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<GlitchEffect>): void;
3
+ export declare const defaultWgpuGlitchEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuGlitchEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGlitchEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGlitchEffect.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,CAeN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Glitch: split the frame into horizontal blocks, displace each by a per-block hash (data-mosh tear),
4
+ // separate the RGB channels, and corrupt the occasional block to white. `seed` animates it.
5
+ export function applyGlitchEffectToWgpu(state, source, dest, effect) {
6
+ const intensity = effect.intensity ?? 0.5;
7
+ const blockSize = effect.blockSize ?? 24;
8
+ const colorShift = effect.colorShift ?? 8;
9
+ const seed = effect.seed ?? 0;
10
+ const pipeline = getWgpuEffectPipeline(state, 'stylization.glitch', GLITCH_FRAGMENT_WGSL, 'replace');
11
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
12
+ f32[0] = intensity;
13
+ f32[1] = blockSize;
14
+ f32[2] = colorShift;
15
+ f32[3] = seed;
16
+ // u_resolution (vec2f) aligns to slot [4].
17
+ f32[4] = source.width;
18
+ f32[5] = source.height;
19
+ });
20
+ }
21
+ export const defaultWgpuGlitchEffectRunner = (ctx, effect) => {
22
+ applyGlitchEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
23
+ };
24
+ // Slot layout: [0]=intensity, [1]=blockSize, [2]=colorShift, [3]=seed, [4..5]=resolution.
25
+ const GLITCH_FRAGMENT_WGSL = /* wgsl */ `
26
+ struct Uniforms {
27
+ u_intensity : f32,
28
+ u_blockSize : f32,
29
+ u_colorShift : f32,
30
+ u_seed : f32,
31
+ u_resolution : vec2f,
32
+ }
33
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
34
+ @group(1) @binding(0) var tex : texture_2d<f32>;
35
+ @group(1) @binding(1) var smp : sampler;
36
+
37
+ fn glitchHash(n : f32) -> f32 { return fract(sin(n) * 43758.5453123); }
38
+
39
+ @fragment
40
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
41
+ let blockSize = max(2.0, uni.u_blockSize);
42
+ let block = floor(uv.y * uni.u_resolution.y / blockSize);
43
+ let r = glitchHash(block + uni.u_seed * 7.0);
44
+ // Higher intensity activates more blocks; a torn block tears horizontally.
45
+ let tear = step(1.0 - uni.u_intensity * 0.6, r);
46
+ let shiftPx = (glitchHash(block * 1.7 + uni.u_seed) - 0.5) * 2.0 * tear * uni.u_intensity * 40.0;
47
+ let baseUv = vec2f(uv.x + shiftPx / uni.u_resolution.x, uv.y);
48
+ // RGB channel separation, wider on torn blocks.
49
+ let cs = (uni.u_colorShift * (0.4 + tear)) / uni.u_resolution.x;
50
+ let rC = textureSampleLevel(tex, smp, vec2f(baseUv.x + cs, baseUv.y), 0.0).r;
51
+ let gC = textureSampleLevel(tex, smp, baseUv, 0.0).g;
52
+ let bC = textureSampleLevel(tex, smp, vec2f(baseUv.x - cs, baseUv.y), 0.0).b;
53
+ let a = textureSampleLevel(tex, smp, baseUv, 0.0).a;
54
+ var col = vec3f(rC, gC, bC);
55
+ // Occasional bright block corruption.
56
+ let corrupt = step(0.985 - uni.u_intensity * 0.04, glitchHash(block * 3.3 + uni.u_seed * 2.0));
57
+ col = mix(col, vec3f(1.0), corrupt * 0.6);
58
+ return vec4f(col, a);
59
+ }`;
60
+ //# sourceMappingURL=wgpuGlitchEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGlitchEffect.js","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,sGAAsG;AACtG,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,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,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,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,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,0FAA0F;AAC1F,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCtC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GodRaysEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyGodRaysEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<GodRaysEffect>): void;
3
+ export declare const defaultWgpuGodRaysEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuGodRaysEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGodRaysEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAShH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAsBN;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAE5C,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // God rays: radial light scattering from a screen-space light position (centerX, centerY). Marches
4
+ // SAMPLES steps along the ray from each fragment toward the light, accumulating color with per-step
5
+ // decay and weight, then scales by exposure. A true single-pass recipe — no depth needed. The sample
6
+ // count is baked into the WGSL (loop bound must be const) and keyed into the pipeline cache, so each
7
+ // distinct sample count compiles once.
8
+ export function applyGodRaysEffectToWgpu(state, source, dest, effect) {
9
+ const centerX = effect.centerX ?? 0.5;
10
+ const centerY = effect.centerY ?? 0.5;
11
+ const density = effect.density ?? 0.96;
12
+ const decay = effect.decay ?? 0.93;
13
+ const weight = effect.weight ?? 0.4;
14
+ const exposure = effect.exposure ?? 0.6;
15
+ const samples = Math.max(1, Math.round(effect.samples ?? 64));
16
+ const pipeline = getWgpuEffectPipeline(state, `atmospheric.godRays.${samples}`, buildGodRaysFragment(samples), 'replace');
17
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
18
+ f32[0] = centerX;
19
+ f32[1] = centerY;
20
+ f32[2] = density;
21
+ f32[3] = decay;
22
+ f32[4] = weight;
23
+ f32[5] = exposure;
24
+ });
25
+ }
26
+ export const defaultWgpuGodRaysEffectRunner = (ctx, effect) => {
27
+ applyGodRaysEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
28
+ };
29
+ function buildGodRaysFragment(samples) {
30
+ return GOD_RAYS_FRAGMENT_HEAD + samples.toString() + GOD_RAYS_FRAGMENT_TAIL;
31
+ }
32
+ // Slot layout: [0]=centerX, [1]=centerY, [2]=density, [3]=decay, [4]=weight, [5]=exposure. All scalars
33
+ // pack into one vec4-aligned run, so no padding gaps are needed.
34
+ const GOD_RAYS_FRAGMENT_HEAD = /* wgsl */ `
35
+ struct Uniforms {
36
+ u_centerX : f32,
37
+ u_centerY : f32,
38
+ u_density : f32,
39
+ u_decay : f32,
40
+ u_weight : f32,
41
+ u_exposure : f32,
42
+ }
43
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
44
+ @group(1) @binding(0) var tex : texture_2d<f32>;
45
+ @group(1) @binding(1) var smp : sampler;
46
+
47
+ const SAMPLES : i32 = `;
48
+ const GOD_RAYS_FRAGMENT_TAIL = `;
49
+
50
+ @fragment
51
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
52
+ let light = vec2f(uni.u_centerX, uni.u_centerY);
53
+ let delta = (uv - light) * (uni.u_density / f32(SAMPLES));
54
+ var coord = uv;
55
+ let base = textureSampleLevel(tex, smp, uv, 0.0);
56
+ var accum = base.rgb;
57
+ var illumination = 1.0;
58
+ for (var i = 0; i < SAMPLES; i = i + 1) {
59
+ coord = coord - delta;
60
+ var s = textureSampleLevel(tex, smp, coord, 0.0).rgb;
61
+ s = s * (illumination * uni.u_weight);
62
+ accum = accum + s;
63
+ illumination = illumination * uni.u_decay;
64
+ }
65
+ return vec4f(base.rgb + accum * uni.u_exposure, base.a);
66
+ }`;
67
+ //# sourceMappingURL=wgpuGodRaysEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGodRaysEffect.js","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,mGAAmG;AACnG,oGAAoG;AACpG,qGAAqG;AACrG,qGAAqG;AACrG,uCAAuC;AACvC,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,qBAAqB,CACpC,KAAK,EACL,uBAAuB,OAAO,EAAE,EAChC,oBAAoB,CAAC,OAAO,CAAC,EAC7B,SAAS,CACV,CAAC;IACF,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,sBAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,sBAAsB,CAAC;AAC9E,CAAC;AAED,uGAAuG;AACvG,iEAAiE;AACjE,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;uBAanB,CAAC;AAExB,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;EAkB7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GrayscaleEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function applyGrayscaleEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<GrayscaleEffect>): void;
3
+ export declare const defaultWgpuGrayscaleEffectRunner: WgpuRenderEffectRunner;
4
+ //# sourceMappingURL=wgpuGrayscaleEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGrayscaleEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGrayscaleEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKlH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAMN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
2
+ import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ // Grayscale: mix toward luminance by intensity.
4
+ export function applyGrayscaleEffectToWgpu(state, source, dest, effect) {
5
+ const intensity = effect.intensity ?? 1;
6
+ const pipeline = getWgpuEffectPipeline(state, 'colorGrade.grayscale', GRAYSCALE_FRAGMENT_WGSL, 'replace');
7
+ drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
8
+ f32[0] = intensity;
9
+ });
10
+ }
11
+ export const defaultWgpuGrayscaleEffectRunner = (ctx, effect) => {
12
+ applyGrayscaleEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
13
+ };
14
+ // Slot layout: [0]=intensity.
15
+ const GRAYSCALE_FRAGMENT_WGSL = /* wgsl */ `
16
+ struct Uniforms { u_intensity : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
17
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
18
+ @group(1) @binding(0) var tex : texture_2d<f32>;
19
+ @group(1) @binding(1) var smp : sampler;
20
+
21
+ @fragment
22
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
23
+ let c = textureSampleLevel(tex, smp, uv, 0.0);
24
+ let l = dot(c.rgb, vec3f(0.2126, 0.7152, 0.0722));
25
+ return vec4f(mix(c.rgb, vec3f(l), uni.u_intensity), c.a);
26
+ }`;
27
+ //# sourceMappingURL=wgpuGrayscaleEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuGrayscaleEffect.js","sourceRoot":"","sources":["../src/wgpuGrayscaleEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,gDAAgD;AAChD,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,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;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,8BAA8B;AAC9B,MAAM,uBAAuB,GAAG,UAAU,CAAC;;;;;;;;;;;EAWzC,CAAC"}