@nodetool-ai/gpu 0.8.1

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 (359) hide show
  1. package/README.md +52 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/blend/blendModes.d.ts +67 -0
  4. package/dist/blend/blendModes.d.ts.map +1 -0
  5. package/dist/blend/blendModes.js +80 -0
  6. package/dist/blend/blendModes.js.map +1 -0
  7. package/dist/blend/index.d.ts +10 -0
  8. package/dist/blend/index.d.ts.map +1 -0
  9. package/dist/blend/index.js +10 -0
  10. package/dist/blend/index.js.map +1 -0
  11. package/dist/blend/wgsl.d.ts +16 -0
  12. package/dist/blend/wgsl.d.ts.map +1 -0
  13. package/dist/blend/wgsl.js +85 -0
  14. package/dist/blend/wgsl.js.map +1 -0
  15. package/dist/compositor/compositor.d.ts +112 -0
  16. package/dist/compositor/compositor.d.ts.map +1 -0
  17. package/dist/compositor/compositor.js +353 -0
  18. package/dist/compositor/compositor.js.map +1 -0
  19. package/dist/compositor/headless.d.ts +47 -0
  20. package/dist/compositor/headless.d.ts.map +1 -0
  21. package/dist/compositor/headless.js +158 -0
  22. package/dist/compositor/headless.js.map +1 -0
  23. package/dist/compositor/index.d.ts +8 -0
  24. package/dist/compositor/index.d.ts.map +1 -0
  25. package/dist/compositor/index.js +8 -0
  26. package/dist/compositor/index.js.map +1 -0
  27. package/dist/compositor/shaders.d.ts +24 -0
  28. package/dist/compositor/shaders.d.ts.map +1 -0
  29. package/dist/compositor/shaders.js +241 -0
  30. package/dist/compositor/shaders.js.map +1 -0
  31. package/dist/compositor/transform.d.ts +49 -0
  32. package/dist/compositor/transform.d.ts.map +1 -0
  33. package/dist/compositor/transform.js +74 -0
  34. package/dist/compositor/transform.js.map +1 -0
  35. package/dist/context.d.ts +108 -0
  36. package/dist/context.d.ts.map +1 -0
  37. package/dist/context.js +205 -0
  38. package/dist/context.js.map +1 -0
  39. package/dist/debug/premulValidator.d.ts +85 -0
  40. package/dist/debug/premulValidator.d.ts.map +1 -0
  41. package/dist/debug/premulValidator.js +239 -0
  42. package/dist/debug/premulValidator.js.map +1 -0
  43. package/dist/executor.d.ts +74 -0
  44. package/dist/executor.d.ts.map +1 -0
  45. package/dist/executor.js +413 -0
  46. package/dist/executor.js.map +1 -0
  47. package/dist/fullscreenQuad.d.ts +11 -0
  48. package/dist/fullscreenQuad.d.ts.map +1 -0
  49. package/dist/fullscreenQuad.js +31 -0
  50. package/dist/fullscreenQuad.js.map +1 -0
  51. package/dist/index.d.ts +16 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +16 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/module.d.ts +162 -0
  56. package/dist/module.d.ts.map +1 -0
  57. package/dist/module.js +100 -0
  58. package/dist/module.js.map +1 -0
  59. package/dist/node.d.ts +38 -0
  60. package/dist/node.d.ts.map +1 -0
  61. package/dist/node.js +140 -0
  62. package/dist/node.js.map +1 -0
  63. package/dist/pool.d.ts +30 -0
  64. package/dist/pool.d.ts.map +1 -0
  65. package/dist/pool.js +33 -0
  66. package/dist/pool.js.map +1 -0
  67. package/dist/recipe.d.ts +148 -0
  68. package/dist/recipe.d.ts.map +1 -0
  69. package/dist/recipe.js +181 -0
  70. package/dist/recipe.js.map +1 -0
  71. package/dist/registry.d.ts +49 -0
  72. package/dist/registry.d.ts.map +1 -0
  73. package/dist/registry.js +100 -0
  74. package/dist/registry.js.map +1 -0
  75. package/dist/shaders/_canary/passthrough/v1/module.d.ts +13 -0
  76. package/dist/shaders/_canary/passthrough/v1/module.d.ts.map +1 -0
  77. package/dist/shaders/_canary/passthrough/v1/module.js +71 -0
  78. package/dist/shaders/_canary/passthrough/v1/module.js.map +1 -0
  79. package/dist/shaders/alpha/premulToStraight/v1/module.d.ts +16 -0
  80. package/dist/shaders/alpha/premulToStraight/v1/module.d.ts.map +1 -0
  81. package/dist/shaders/alpha/premulToStraight/v1/module.js +62 -0
  82. package/dist/shaders/alpha/premulToStraight/v1/module.js.map +1 -0
  83. package/dist/shaders/alpha/straightToPremul/v1/module.d.ts +19 -0
  84. package/dist/shaders/alpha/straightToPremul/v1/module.d.ts.map +1 -0
  85. package/dist/shaders/alpha/straightToPremul/v1/module.js +61 -0
  86. package/dist/shaders/alpha/straightToPremul/v1/module.js.map +1 -0
  87. package/dist/shaders/color/brightnessContrast/v1/module.d.ts +17 -0
  88. package/dist/shaders/color/brightnessContrast/v1/module.d.ts.map +1 -0
  89. package/dist/shaders/color/brightnessContrast/v1/module.js +84 -0
  90. package/dist/shaders/color/brightnessContrast/v1/module.js.map +1 -0
  91. package/dist/shaders/color/cdl/v1/module.d.ts +35 -0
  92. package/dist/shaders/color/cdl/v1/module.d.ts.map +1 -0
  93. package/dist/shaders/color/cdl/v1/module.js +106 -0
  94. package/dist/shaders/color/cdl/v1/module.js.map +1 -0
  95. package/dist/shaders/color/channelMerge/v1/module.d.ts +22 -0
  96. package/dist/shaders/color/channelMerge/v1/module.d.ts.map +1 -0
  97. package/dist/shaders/color/channelMerge/v1/module.js +101 -0
  98. package/dist/shaders/color/channelMerge/v1/module.js.map +1 -0
  99. package/dist/shaders/color/channelShuffle/v1/module.d.ts +29 -0
  100. package/dist/shaders/color/channelShuffle/v1/module.d.ts.map +1 -0
  101. package/dist/shaders/color/channelShuffle/v1/module.js +94 -0
  102. package/dist/shaders/color/channelShuffle/v1/module.js.map +1 -0
  103. package/dist/shaders/color/channelSplit/v1/module.d.ts +18 -0
  104. package/dist/shaders/color/channelSplit/v1/module.d.ts.map +1 -0
  105. package/dist/shaders/color/channelSplit/v1/module.js +90 -0
  106. package/dist/shaders/color/channelSplit/v1/module.js.map +1 -0
  107. package/dist/shaders/color/colorBalance/v1/module.d.ts +18 -0
  108. package/dist/shaders/color/colorBalance/v1/module.d.ts.map +1 -0
  109. package/dist/shaders/color/colorBalance/v1/module.js +86 -0
  110. package/dist/shaders/color/colorBalance/v1/module.js.map +1 -0
  111. package/dist/shaders/color/cubeLut/v1/module.d.ts +14 -0
  112. package/dist/shaders/color/cubeLut/v1/module.d.ts.map +1 -0
  113. package/dist/shaders/color/cubeLut/v1/module.js +78 -0
  114. package/dist/shaders/color/cubeLut/v1/module.js.map +1 -0
  115. package/dist/shaders/color/curves/v1/module.d.ts +31 -0
  116. package/dist/shaders/color/curves/v1/module.d.ts.map +1 -0
  117. package/dist/shaders/color/curves/v1/module.js +102 -0
  118. package/dist/shaders/color/curves/v1/module.js.map +1 -0
  119. package/dist/shaders/color/exposure/v1/module.d.ts +15 -0
  120. package/dist/shaders/color/exposure/v1/module.d.ts.map +1 -0
  121. package/dist/shaders/color/exposure/v1/module.js +78 -0
  122. package/dist/shaders/color/exposure/v1/module.js.map +1 -0
  123. package/dist/shaders/color/exposureTone/v1/module.d.ts +28 -0
  124. package/dist/shaders/color/exposureTone/v1/module.d.ts.map +1 -0
  125. package/dist/shaders/color/exposureTone/v1/module.js +107 -0
  126. package/dist/shaders/color/exposureTone/v1/module.js.map +1 -0
  127. package/dist/shaders/color/filmLook/v1/module.d.ts +28 -0
  128. package/dist/shaders/color/filmLook/v1/module.d.ts.map +1 -0
  129. package/dist/shaders/color/filmLook/v1/module.js +103 -0
  130. package/dist/shaders/color/filmLook/v1/module.js.map +1 -0
  131. package/dist/shaders/color/grade/v1/module.d.ts +35 -0
  132. package/dist/shaders/color/grade/v1/module.d.ts.map +1 -0
  133. package/dist/shaders/color/grade/v1/module.js +182 -0
  134. package/dist/shaders/color/grade/v1/module.js.map +1 -0
  135. package/dist/shaders/color/grayscale/v1/module.d.ts +14 -0
  136. package/dist/shaders/color/grayscale/v1/module.d.ts.map +1 -0
  137. package/dist/shaders/color/grayscale/v1/module.js +79 -0
  138. package/dist/shaders/color/grayscale/v1/module.js.map +1 -0
  139. package/dist/shaders/color/hsb/v1/module.d.ts +20 -0
  140. package/dist/shaders/color/hsb/v1/module.d.ts.map +1 -0
  141. package/dist/shaders/color/hsb/v1/module.js +131 -0
  142. package/dist/shaders/color/hsb/v1/module.js.map +1 -0
  143. package/dist/shaders/color/hslAdjust/v1/module.d.ts +30 -0
  144. package/dist/shaders/color/hslAdjust/v1/module.d.ts.map +1 -0
  145. package/dist/shaders/color/hslAdjust/v1/module.js +170 -0
  146. package/dist/shaders/color/hslAdjust/v1/module.js.map +1 -0
  147. package/dist/shaders/color/invert/v1/module.d.ts +15 -0
  148. package/dist/shaders/color/invert/v1/module.d.ts.map +1 -0
  149. package/dist/shaders/color/invert/v1/module.js +85 -0
  150. package/dist/shaders/color/invert/v1/module.js.map +1 -0
  151. package/dist/shaders/color/levels/v1/module.d.ts +33 -0
  152. package/dist/shaders/color/levels/v1/module.d.ts.map +1 -0
  153. package/dist/shaders/color/levels/v1/module.js +116 -0
  154. package/dist/shaders/color/levels/v1/module.js.map +1 -0
  155. package/dist/shaders/color/liftGammaGain/v1/module.d.ts +40 -0
  156. package/dist/shaders/color/liftGammaGain/v1/module.d.ts.map +1 -0
  157. package/dist/shaders/color/liftGammaGain/v1/module.js +114 -0
  158. package/dist/shaders/color/liftGammaGain/v1/module.js.map +1 -0
  159. package/dist/shaders/color/posterize/v1/module.d.ts +16 -0
  160. package/dist/shaders/color/posterize/v1/module.d.ts.map +1 -0
  161. package/dist/shaders/color/posterize/v1/module.js +80 -0
  162. package/dist/shaders/color/posterize/v1/module.js.map +1 -0
  163. package/dist/shaders/color/solarize/v1/module.d.ts +15 -0
  164. package/dist/shaders/color/solarize/v1/module.d.ts.map +1 -0
  165. package/dist/shaders/color/solarize/v1/module.js +83 -0
  166. package/dist/shaders/color/solarize/v1/module.js.map +1 -0
  167. package/dist/shaders/color/splitToning/v1/module.d.ts +26 -0
  168. package/dist/shaders/color/splitToning/v1/module.d.ts.map +1 -0
  169. package/dist/shaders/color/splitToning/v1/module.js +95 -0
  170. package/dist/shaders/color/splitToning/v1/module.js.map +1 -0
  171. package/dist/shaders/filters/blur/gaussian/v1/module.d.ts +23 -0
  172. package/dist/shaders/filters/blur/gaussian/v1/module.d.ts.map +1 -0
  173. package/dist/shaders/filters/blur/gaussian/v1/module.js +110 -0
  174. package/dist/shaders/filters/blur/gaussian/v1/module.js.map +1 -0
  175. package/dist/shaders/filters/blur/separable/v1/module.d.ts +18 -0
  176. package/dist/shaders/filters/blur/separable/v1/module.d.ts.map +1 -0
  177. package/dist/shaders/filters/blur/separable/v1/module.js +64 -0
  178. package/dist/shaders/filters/blur/separable/v1/module.js.map +1 -0
  179. package/dist/shaders/filters/convolve3x3/v1/module.d.ts +23 -0
  180. package/dist/shaders/filters/convolve3x3/v1/module.d.ts.map +1 -0
  181. package/dist/shaders/filters/convolve3x3/v1/module.js +128 -0
  182. package/dist/shaders/filters/convolve3x3/v1/module.js.map +1 -0
  183. package/dist/shaders/filters/glow/v1/module.d.ts +26 -0
  184. package/dist/shaders/filters/glow/v1/module.d.ts.map +1 -0
  185. package/dist/shaders/filters/glow/v1/module.js +102 -0
  186. package/dist/shaders/filters/glow/v1/module.js.map +1 -0
  187. package/dist/shaders/filters/grain/v1/module.d.ts +38 -0
  188. package/dist/shaders/filters/grain/v1/module.d.ts.map +1 -0
  189. package/dist/shaders/filters/grain/v1/module.js +110 -0
  190. package/dist/shaders/filters/grain/v1/module.js.map +1 -0
  191. package/dist/shaders/filters/pixelate/v1/module.d.ts +14 -0
  192. package/dist/shaders/filters/pixelate/v1/module.d.ts.map +1 -0
  193. package/dist/shaders/filters/pixelate/v1/module.js +76 -0
  194. package/dist/shaders/filters/pixelate/v1/module.js.map +1 -0
  195. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts +17 -0
  196. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts.map +1 -0
  197. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js +93 -0
  198. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js.map +1 -0
  199. package/dist/shaders/filters/threshold/v1/module.d.ts +17 -0
  200. package/dist/shaders/filters/threshold/v1/module.d.ts.map +1 -0
  201. package/dist/shaders/filters/threshold/v1/module.js +71 -0
  202. package/dist/shaders/filters/threshold/v1/module.js.map +1 -0
  203. package/dist/shaders/filters/vignette/v1/module.d.ts +18 -0
  204. package/dist/shaders/filters/vignette/v1/module.d.ts.map +1 -0
  205. package/dist/shaders/filters/vignette/v1/module.js +78 -0
  206. package/dist/shaders/filters/vignette/v1/module.js.map +1 -0
  207. package/dist/shaders/filters/visualFx/v1/module.d.ts +24 -0
  208. package/dist/shaders/filters/visualFx/v1/module.d.ts.map +1 -0
  209. package/dist/shaders/filters/visualFx/v1/module.js +210 -0
  210. package/dist/shaders/filters/visualFx/v1/module.js.map +1 -0
  211. package/dist/shaders/index.d.ts +86 -0
  212. package/dist/shaders/index.d.ts.map +1 -0
  213. package/dist/shaders/index.js +161 -0
  214. package/dist/shaders/index.js.map +1 -0
  215. package/dist/shaders/keyer/chromaKey/v1/module.d.ts +25 -0
  216. package/dist/shaders/keyer/chromaKey/v1/module.d.ts.map +1 -0
  217. package/dist/shaders/keyer/chromaKey/v1/module.js +111 -0
  218. package/dist/shaders/keyer/chromaKey/v1/module.js.map +1 -0
  219. package/dist/shaders/keyer/lumaKey/v1/module.d.ts +22 -0
  220. package/dist/shaders/keyer/lumaKey/v1/module.d.ts.map +1 -0
  221. package/dist/shaders/keyer/lumaKey/v1/module.js +89 -0
  222. package/dist/shaders/keyer/lumaKey/v1/module.js.map +1 -0
  223. package/dist/shaders/mask/apply/v1/module.d.ts +16 -0
  224. package/dist/shaders/mask/apply/v1/module.d.ts.map +1 -0
  225. package/dist/shaders/mask/apply/v1/module.js +79 -0
  226. package/dist/shaders/mask/apply/v1/module.js.map +1 -0
  227. package/dist/shaders/mask/fromImage/v1/module.d.ts +18 -0
  228. package/dist/shaders/mask/fromImage/v1/module.d.ts.map +1 -0
  229. package/dist/shaders/mask/fromImage/v1/module.js +99 -0
  230. package/dist/shaders/mask/fromImage/v1/module.js.map +1 -0
  231. package/dist/shaders/mask/invert/v1/module.d.ts +12 -0
  232. package/dist/shaders/mask/invert/v1/module.d.ts.map +1 -0
  233. package/dist/shaders/mask/invert/v1/module.js +57 -0
  234. package/dist/shaders/mask/invert/v1/module.js.map +1 -0
  235. package/dist/shaders/mixer/add/v1/module.d.ts +17 -0
  236. package/dist/shaders/mixer/add/v1/module.d.ts.map +1 -0
  237. package/dist/shaders/mixer/add/v1/module.js +73 -0
  238. package/dist/shaders/mixer/add/v1/module.js.map +1 -0
  239. package/dist/shaders/mixer/colorOverlay/v1/module.d.ts +26 -0
  240. package/dist/shaders/mixer/colorOverlay/v1/module.d.ts.map +1 -0
  241. package/dist/shaders/mixer/colorOverlay/v1/module.js +81 -0
  242. package/dist/shaders/mixer/colorOverlay/v1/module.js.map +1 -0
  243. package/dist/shaders/mixer/dropShadow/v1/module.d.ts +28 -0
  244. package/dist/shaders/mixer/dropShadow/v1/module.d.ts.map +1 -0
  245. package/dist/shaders/mixer/dropShadow/v1/module.js +104 -0
  246. package/dist/shaders/mixer/dropShadow/v1/module.js.map +1 -0
  247. package/dist/shaders/mixer/outline/v1/module.d.ts +27 -0
  248. package/dist/shaders/mixer/outline/v1/module.d.ts.map +1 -0
  249. package/dist/shaders/mixer/outline/v1/module.js +105 -0
  250. package/dist/shaders/mixer/outline/v1/module.js.map +1 -0
  251. package/dist/shaders/mixer/over/v1/module.d.ts +16 -0
  252. package/dist/shaders/mixer/over/v1/module.d.ts.map +1 -0
  253. package/dist/shaders/mixer/over/v1/module.js +71 -0
  254. package/dist/shaders/mixer/over/v1/module.js.map +1 -0
  255. package/dist/shaders/mixer/shadowCompose/v1/module.d.ts +26 -0
  256. package/dist/shaders/mixer/shadowCompose/v1/module.d.ts.map +1 -0
  257. package/dist/shaders/mixer/shadowCompose/v1/module.js +95 -0
  258. package/dist/shaders/mixer/shadowCompose/v1/module.js.map +1 -0
  259. package/dist/shaders/sources/angularGradient/v1/module.d.ts +18 -0
  260. package/dist/shaders/sources/angularGradient/v1/module.d.ts.map +1 -0
  261. package/dist/shaders/sources/angularGradient/v1/module.js +67 -0
  262. package/dist/shaders/sources/angularGradient/v1/module.js.map +1 -0
  263. package/dist/shaders/sources/checkerboard/v1/module.d.ts +19 -0
  264. package/dist/shaders/sources/checkerboard/v1/module.d.ts.map +1 -0
  265. package/dist/shaders/sources/checkerboard/v1/module.js +70 -0
  266. package/dist/shaders/sources/checkerboard/v1/module.js.map +1 -0
  267. package/dist/shaders/sources/diamondGradient/v1/module.d.ts +18 -0
  268. package/dist/shaders/sources/diamondGradient/v1/module.d.ts.map +1 -0
  269. package/dist/shaders/sources/diamondGradient/v1/module.js +61 -0
  270. package/dist/shaders/sources/diamondGradient/v1/module.js.map +1 -0
  271. package/dist/shaders/sources/gaussianNoise/v1/module.d.ts +21 -0
  272. package/dist/shaders/sources/gaussianNoise/v1/module.d.ts.map +1 -0
  273. package/dist/shaders/sources/gaussianNoise/v1/module.js +72 -0
  274. package/dist/shaders/sources/gaussianNoise/v1/module.js.map +1 -0
  275. package/dist/shaders/sources/linearGradient/v1/module.d.ts +21 -0
  276. package/dist/shaders/sources/linearGradient/v1/module.d.ts.map +1 -0
  277. package/dist/shaders/sources/linearGradient/v1/module.js +72 -0
  278. package/dist/shaders/sources/linearGradient/v1/module.js.map +1 -0
  279. package/dist/shaders/sources/radialGradient/v1/module.d.ts +18 -0
  280. package/dist/shaders/sources/radialGradient/v1/module.d.ts.map +1 -0
  281. package/dist/shaders/sources/radialGradient/v1/module.js +60 -0
  282. package/dist/shaders/sources/radialGradient/v1/module.js.map +1 -0
  283. package/dist/shaders/sources/solid/v1/module.d.ts +17 -0
  284. package/dist/shaders/sources/solid/v1/module.d.ts.map +1 -0
  285. package/dist/shaders/sources/solid/v1/module.js +49 -0
  286. package/dist/shaders/sources/solid/v1/module.js.map +1 -0
  287. package/dist/shaders/transform/affine/v1/module.d.ts +36 -0
  288. package/dist/shaders/transform/affine/v1/module.d.ts.map +1 -0
  289. package/dist/shaders/transform/affine/v1/module.js +94 -0
  290. package/dist/shaders/transform/affine/v1/module.js.map +1 -0
  291. package/dist/shaders/transform/cornerPin/v1/module.d.ts +40 -0
  292. package/dist/shaders/transform/cornerPin/v1/module.d.ts.map +1 -0
  293. package/dist/shaders/transform/cornerPin/v1/module.js +109 -0
  294. package/dist/shaders/transform/cornerPin/v1/module.js.map +1 -0
  295. package/dist/shaders/transform/crop/v1/module.d.ts +26 -0
  296. package/dist/shaders/transform/crop/v1/module.d.ts.map +1 -0
  297. package/dist/shaders/transform/crop/v1/module.js +82 -0
  298. package/dist/shaders/transform/crop/v1/module.js.map +1 -0
  299. package/dist/shaders/transform/displace/v1/module.d.ts +23 -0
  300. package/dist/shaders/transform/displace/v1/module.d.ts.map +1 -0
  301. package/dist/shaders/transform/displace/v1/module.js +95 -0
  302. package/dist/shaders/transform/displace/v1/module.js.map +1 -0
  303. package/dist/shaders/transform/mirror/v1/module.d.ts +14 -0
  304. package/dist/shaders/transform/mirror/v1/module.d.ts.map +1 -0
  305. package/dist/shaders/transform/mirror/v1/module.js +73 -0
  306. package/dist/shaders/transform/mirror/v1/module.js.map +1 -0
  307. package/dist/shaders/transform/offset/v1/module.d.ts +21 -0
  308. package/dist/shaders/transform/offset/v1/module.d.ts.map +1 -0
  309. package/dist/shaders/transform/offset/v1/module.js +88 -0
  310. package/dist/shaders/transform/offset/v1/module.js.map +1 -0
  311. package/dist/shaders/transform/pad/v1/module.d.ts +26 -0
  312. package/dist/shaders/transform/pad/v1/module.d.ts.map +1 -0
  313. package/dist/shaders/transform/pad/v1/module.js +95 -0
  314. package/dist/shaders/transform/pad/v1/module.js.map +1 -0
  315. package/dist/shaders/transform/polarRemap/v1/module.d.ts +20 -0
  316. package/dist/shaders/transform/polarRemap/v1/module.d.ts.map +1 -0
  317. package/dist/shaders/transform/polarRemap/v1/module.js +95 -0
  318. package/dist/shaders/transform/polarRemap/v1/module.js.map +1 -0
  319. package/dist/shaders/transform/resize/v1/module.d.ts +20 -0
  320. package/dist/shaders/transform/resize/v1/module.d.ts.map +1 -0
  321. package/dist/shaders/transform/resize/v1/module.js +116 -0
  322. package/dist/shaders/transform/resize/v1/module.js.map +1 -0
  323. package/dist/shaders/transform/rotate90/v1/module.d.ts +25 -0
  324. package/dist/shaders/transform/rotate90/v1/module.d.ts.map +1 -0
  325. package/dist/shaders/transform/rotate90/v1/module.js +90 -0
  326. package/dist/shaders/transform/rotate90/v1/module.js.map +1 -0
  327. package/dist/shaders/transform/spherize/v1/module.d.ts +21 -0
  328. package/dist/shaders/transform/spherize/v1/module.d.ts.map +1 -0
  329. package/dist/shaders/transform/spherize/v1/module.js +94 -0
  330. package/dist/shaders/transform/spherize/v1/module.js.map +1 -0
  331. package/dist/shaders/transform/tile/v1/module.d.ts +22 -0
  332. package/dist/shaders/transform/tile/v1/module.d.ts.map +1 -0
  333. package/dist/shaders/transform/tile/v1/module.js +89 -0
  334. package/dist/shaders/transform/tile/v1/module.js.map +1 -0
  335. package/dist/shared/lumaWgsl.d.ts +14 -0
  336. package/dist/shared/lumaWgsl.d.ts.map +1 -0
  337. package/dist/shared/lumaWgsl.js +18 -0
  338. package/dist/shared/lumaWgsl.js.map +1 -0
  339. package/dist/shared/premulWgsl.d.ts +46 -0
  340. package/dist/shared/premulWgsl.d.ts.map +1 -0
  341. package/dist/shared/premulWgsl.js +90 -0
  342. package/dist/shared/premulWgsl.js.map +1 -0
  343. package/dist/texture.d.ts +54 -0
  344. package/dist/texture.d.ts.map +1 -0
  345. package/dist/texture.js +70 -0
  346. package/dist/texture.js.map +1 -0
  347. package/dist/types.d.ts +103 -0
  348. package/dist/types.d.ts.map +1 -0
  349. package/dist/types.js +8 -0
  350. package/dist/types.js.map +1 -0
  351. package/dist/validate/wgslLinearity.d.ts +86 -0
  352. package/dist/validate/wgslLinearity.d.ts.map +1 -0
  353. package/dist/validate/wgslLinearity.js +298 -0
  354. package/dist/validate/wgslLinearity.js.map +1 -0
  355. package/dist/webgpu/index.d.ts +11 -0
  356. package/dist/webgpu/index.d.ts.map +1 -0
  357. package/dist/webgpu/index.js +11 -0
  358. package/dist/webgpu/index.js.map +1 -0
  359. package/package.json +85 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * `filters.blur.gaussian@1` — separable Gaussian blur (one axis per dispatch).
3
+ *
4
+ * Migrated verbatim from the timeline preview's `blurComputeShader`. The host
5
+ * runs it twice — horizontal (`direction = (1,0)`) then vertical
6
+ * (`direction = (0,1)`) — sharing the same module. The hand-packed uniform is
7
+ * replaced by the TypeGPU `BlurParams` schema; the kernel math is unchanged.
8
+ *
9
+ * RoD is `same-as:source` for now; a real expand-by-radius declaration lands
10
+ * when a consumer needs region propagation (Phase 3+).
11
+ */
12
+ import tgpu from "typegpu";
13
+ import * as d from "typegpu/data";
14
+ import { defineModule } from "../../../../../module.js";
15
+ export const BlurParams = d.struct({
16
+ radius: d.f32,
17
+ sigma: d.f32,
18
+ direction: d.vec2f
19
+ });
20
+ const layout = tgpu.bindGroupLayout({
21
+ source: { texture: "float" },
22
+ outputTexture: { storageTexture: "rgba8unorm" },
23
+ params: { uniform: BlurParams }
24
+ });
25
+ export const blurGaussianV1 = defineModule({
26
+ id: "filters.blur.gaussian",
27
+ version: 1,
28
+ // Promoted in Phase 3: separable gaussian blur with a stable
29
+ // (radius, sigma, direction) schema; consumed by Phase 2 timeline +
30
+ // Phase 3 `filters.glow` recipe.
31
+ surface: "published",
32
+ category: "filters",
33
+ linearity: "linear-in-rgb",
34
+ kind: "compute",
35
+ params: BlurParams,
36
+ paramDefaults: { radius: 0, sigma: 0, direction: d.vec2f(1, 0) },
37
+ paramUi: {
38
+ radius: { min: 0, max: 256, step: 0.5, label: "Radius", notes: "pixels" },
39
+ sigma: { min: 0, max: 96, step: 0.1, label: "Sigma" },
40
+ direction: { label: "Direction", notes: "(1,0) horizontal, (0,1) vertical" }
41
+ },
42
+ layout,
43
+ workgroupSize: [16, 16, 1],
44
+ wgsl: /* wgsl */ `
45
+ fn gaussianWeight(offset: f32, sigma: f32) -> f32 {
46
+ let s2 = sigma * sigma;
47
+ return exp(-(offset * offset) / (2.0 * s2)) / (sqrt(2.0 * 3.14159265) * sigma);
48
+ }
49
+
50
+ @compute @workgroup_size(16, 16, 1)
51
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
52
+ let dims = textureDimensions(layout.$.source);
53
+ if (gid.x >= dims.x || gid.y >= dims.y) { return; }
54
+ let coords = vec2<i32>(i32(gid.x), i32(gid.y));
55
+ let blur = layout.$.params;
56
+
57
+ if (blur.radius < 0.5) {
58
+ textureStore(layout.$.outputTexture, coords, textureLoad(layout.$.source, coords, 0));
59
+ return;
60
+ }
61
+
62
+ let kernelRadius = i32(min(blur.radius, 20.0));
63
+ // Keep the 41-tap budget, but spread those taps across a wide blur's full
64
+ // support. Sampling only the central 20 pixels left large glows hard-edged.
65
+ let sampleStep = max(1.0, blur.radius / 20.0);
66
+ // Honor an explicit positive sigma. Only fall back to radius/3 when the
67
+ // caller leaves sigma unset (<= 0); the previous max(sigma, radius/3)
68
+ // silently raised any explicit sigma smaller than radius/3.
69
+ let sigma = select(blur.sigma, blur.radius / 3.0, blur.sigma <= 0.0);
70
+
71
+ var colorSum = vec4<f32>(0.0);
72
+ var weightSum: f32 = 0.0;
73
+ for (var i = -kernelRadius; i <= kernelRadius; i = i + 1) {
74
+ let distance = f32(i) * sampleStep;
75
+ let offset = vec2<i32>(
76
+ i32(round(blur.direction.x * distance)),
77
+ i32(round(blur.direction.y * distance))
78
+ );
79
+ let s = vec2<i32>(
80
+ clamp(coords.x + offset.x, 0, i32(dims.x) - 1),
81
+ clamp(coords.y + offset.y, 0, i32(dims.y) - 1)
82
+ );
83
+ let w = gaussianWeight(distance, sigma);
84
+ colorSum = colorSum + textureLoad(layout.$.source, s, 0) * w;
85
+ weightSum = weightSum + w;
86
+ }
87
+ textureStore(layout.$.outputTexture, coords, colorSum / weightSum);
88
+ }
89
+ `,
90
+ io: {
91
+ inputs: {
92
+ source: {
93
+ // Aligned with the `filters.blur.gaussianSeparable` and `filters.glow`
94
+ // recipes that route through this module; the blur math itself is
95
+ // colour-space agnostic (a normalized weighted sum).
96
+ colorSpace: "linear",
97
+ alpha: "premultiplied",
98
+ bindingKinds: ["texture_2d"]
99
+ }
100
+ },
101
+ output: {
102
+ colorSpace: "linear",
103
+ alpha: "premultiplied",
104
+ format: "rgba8unorm",
105
+ dimensions: "same-as:source"
106
+ },
107
+ rod: "same-as:source"
108
+ }
109
+ });
110
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../../src/shaders/filters/blur/gaussian/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,GAAG;IACb,KAAK,EAAE,CAAC,CAAC,GAAG;IACZ,SAAS,EAAE,CAAC,CAAC,KAAK;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;IAClC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5B,aAAa,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;IAC/C,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;IACzC,EAAE,EAAE,uBAAuB;IAC3B,OAAO,EAAE,CAAC;IACV,6DAA6D;IAC7D,oEAAoE;IACpE,iCAAiC;IACjC,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,UAAU;IAClB,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAChE,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACzE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QACrD,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kCAAkC,EAAE;KAC7E;IACD,MAAM;IACN,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ClB;IACC,EAAE,EAAE;QACF,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,uEAAuE;gBACvE,kEAAkE;gBAClE,qDAAqD;gBACrD,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;SACF;QACD,MAAM,EAAE;YACN,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `filters.blur.gaussianSeparable@1` — two-pass separable gaussian blur.
3
+ *
4
+ * `filters.blur.gaussian` (H) → `filters.blur.gaussian` (V). The single-pass
5
+ * `filters.blur.gaussian@1` module blurs along one axis only; this recipe
6
+ * makes the standard separable kernel available as a single op so workflow
7
+ * nodes don't have to wire two passes by hand.
8
+ */
9
+ import * as d from "typegpu/data";
10
+ export declare const BlurSeparableParams: d.WgslStruct<{
11
+ radius: d.F32;
12
+ sigma: d.F32;
13
+ }>;
14
+ export declare const filtersBlurSeparableV1: import("../../../../../recipe.js").RecipeModule<{
15
+ radius: number;
16
+ sigma: number;
17
+ }>;
18
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/shaders/filters/blur/separable/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,mBAAmB;;;EAG9B,CAAC;AAMH,eAAO,MAAM,sBAAsB;;;EA6CjC,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `filters.blur.gaussianSeparable@1` — two-pass separable gaussian blur.
3
+ *
4
+ * `filters.blur.gaussian` (H) → `filters.blur.gaussian` (V). The single-pass
5
+ * `filters.blur.gaussian@1` module blurs along one axis only; this recipe
6
+ * makes the standard separable kernel available as a single op so workflow
7
+ * nodes don't have to wire two passes by hand.
8
+ */
9
+ import * as d from "typegpu/data";
10
+ import { defineRecipe } from "../../../../../recipe.js";
11
+ export const BlurSeparableParams = d.struct({
12
+ radius: d.f32,
13
+ sigma: d.f32
14
+ });
15
+ // Inlined GPUTextureUsage flags (see filters.glow for the rationale):
16
+ // COPY_SRC = 0x01, TEXTURE_BINDING = 0x04, STORAGE_BINDING = 0x08
17
+ const INTERMEDIATE_BLUR_USAGE = 0x08 | 0x04 | 0x01;
18
+ export const filtersBlurSeparableV1 = defineRecipe({
19
+ id: "filters.blur.gaussianSeparable",
20
+ version: 1,
21
+ surface: "internal",
22
+ category: "filters",
23
+ paramDefaults: { radius: 4, sigma: 0 },
24
+ paramUi: {
25
+ radius: { min: 0, max: 256, step: 0.5, label: "Radius", notes: "blur radius, px" },
26
+ sigma: { min: 0, max: 96, step: 0.1, label: "Sigma", notes: "0 = derived from radius" }
27
+ },
28
+ io: {
29
+ inputs: {
30
+ source: {
31
+ colorSpace: "linear",
32
+ alpha: "premultiplied",
33
+ bindingKinds: ["texture_2d"]
34
+ }
35
+ },
36
+ output: {
37
+ colorSpace: "linear",
38
+ alpha: "premultiplied",
39
+ format: "rgba8unorm",
40
+ dimensions: "same-as:source"
41
+ },
42
+ rod: "expand:radius"
43
+ },
44
+ recipe: {
45
+ intermediates: {
46
+ blurH: { format: "rgba8unorm", usage: INTERMEDIATE_BLUR_USAGE }
47
+ },
48
+ passes: [
49
+ {
50
+ op: { id: "filters.blur.gaussian", version: 1 },
51
+ in: { source: "source" },
52
+ out: { kind: "intermediate", name: "blurH" },
53
+ params: { radius: "$.radius", sigma: "$.sigma", direction: d.vec2f(1, 0) }
54
+ },
55
+ {
56
+ op: { id: "filters.blur.gaussian", version: 1 },
57
+ in: { source: { kind: "intermediate", name: "blurH" } },
58
+ out: "output",
59
+ params: { radius: "$.radius", sigma: "$.sigma", direction: d.vec2f(0, 1) }
60
+ }
61
+ ]
62
+ }
63
+ });
64
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../../src/shaders/filters/blur/separable/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,GAAG;IACb,KAAK,EAAE,CAAC,CAAC,GAAG;CACb,CAAC,CAAC;AAEH,sEAAsE;AACtE,oEAAoE;AACpE,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;IACjD,EAAE,EAAE,gCAAgC;IACpC,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,SAAS;IACnB,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IACtC,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAClF,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE;KACxF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;SACF;QACD,MAAM,EAAE;YACN,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE,eAAe;KACrB;IACD,MAAM,EAAE;QACN,aAAa,EAAE;YACb,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAChE;QACD,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC/C,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;gBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC5C,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;aAC3E;YACD;gBACE,EAAE,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC/C,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;gBACvD,GAAG,EAAE,QAAQ;gBACb,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;aAC3E;SACF;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `filters.convolve3x3@1` — generic 3×3 convolution.
3
+ *
4
+ * Nine weights laid out row-major (top-left, top, top-right, …), an explicit
5
+ * `divisor` (auto-derived when set to 0 from the sum of weights), and a
6
+ * channel offset added after division. Covers PIL's edge/sharpen/smooth/
7
+ * emboss family without a bespoke shader per kernel.
8
+ *
9
+ * Fragment, mask-slot honoured. Alpha is preserved (the kernel applies to
10
+ * RGB only) so the same shader works for both opaque and translucent inputs.
11
+ */
12
+ import * as d from "typegpu/data";
13
+ export declare const Convolve3x3Params: d.WgslStruct<{
14
+ row0: d.Vec4f;
15
+ row1: d.Vec4f;
16
+ row2: d.Vec4f;
17
+ }>;
18
+ export declare const filtersConvolve3x3V1: import("../../../../module.js").ShaderModule<d.WgslStruct<{
19
+ row0: d.Vec4f;
20
+ row1: d.Vec4f;
21
+ row2: d.Vec4f;
22
+ }>>;
23
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/shaders/filters/convolve3x3/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,iBAAiB;;;;EAW5B,CAAC;AAgBH,eAAO,MAAM,oBAAoB;;;;GAwF/B,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * `filters.convolve3x3@1` — generic 3×3 convolution.
3
+ *
4
+ * Nine weights laid out row-major (top-left, top, top-right, …), an explicit
5
+ * `divisor` (auto-derived when set to 0 from the sum of weights), and a
6
+ * channel offset added after division. Covers PIL's edge/sharpen/smooth/
7
+ * emboss family without a bespoke shader per kernel.
8
+ *
9
+ * Fragment, mask-slot honoured. Alpha is preserved (the kernel applies to
10
+ * RGB only) so the same shader works for both opaque and translucent inputs.
11
+ */
12
+ import tgpu from "typegpu";
13
+ import * as d from "typegpu/data";
14
+ import { defineModule } from "../../../../module.js";
15
+ export const Convolve3x3Params = d.struct({
16
+ // Weights in row-major order: w00 w01 w02 / w10 w11 w12 / w20 w21 w22.
17
+ // Packed into three vec4f's for std140-friendly alignment. The kernel
18
+ // weights live in the first three components of each row (`xyz`); the
19
+ // trailing `w` of `row0` carries `offset`, `row1.w` is unused, and
20
+ // `row2.w` carries `divisor` (set to 0 to auto-derive from the kernel
21
+ // sum). Keeping the schema tight (3 × vec4f) avoids a vec4f array of
22
+ // length 3 plus its stride padding worries.
23
+ row0: d.vec4f, // [w00, w01, w02, offset]
24
+ row1: d.vec4f, // [w10, w11, w12, _unused]
25
+ row2: d.vec4f // [w20, w21, w22, divisor]
26
+ });
27
+ const layout = tgpu.bindGroupLayout({
28
+ params: { uniform: Convolve3x3Params },
29
+ source: { texture: "float" },
30
+ mask: { texture: "float" },
31
+ samp: { sampler: "filtering" }
32
+ });
33
+ const samplerDescriptor = {
34
+ magFilter: "nearest",
35
+ minFilter: "nearest",
36
+ addressModeU: "clamp-to-edge",
37
+ addressModeV: "clamp-to-edge"
38
+ };
39
+ export const filtersConvolve3x3V1 = defineModule({
40
+ id: "filters.convolve3x3",
41
+ version: 1,
42
+ surface: "internal",
43
+ category: "filters",
44
+ linearity: "nonlinear-in-rgb",
45
+ kind: "fragment",
46
+ params: Convolve3x3Params,
47
+ paramDefaults: {
48
+ // Identity kernel by default.
49
+ row0: d.vec4f(0, 0, 0, 0),
50
+ row1: d.vec4f(0, 1, 0, 0),
51
+ row2: d.vec4f(0, 0, 0, 1)
52
+ },
53
+ paramUi: {},
54
+ layout,
55
+ samplers: { samp: samplerDescriptor },
56
+ wgsl: /* wgsl */ `
57
+ @fragment
58
+ fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
59
+ let dims = textureDimensions(layout.$.source);
60
+ let px = 1.0 / vec2f(f32(dims.x), f32(dims.y));
61
+ let p = layout.$.params;
62
+
63
+ // Un-premultiply every tap so the kernel runs on straight colour. Convolving
64
+ // premultiplied rgb skews the weights against per-pixel alpha and can drive
65
+ // the result above the (preserved) centre alpha, breaking rgb <= a. The
66
+ // result is re-premultiplied by the centre alpha before output.
67
+ let c00 = textureSample(layout.$.source, layout.$.samp, uv + vec2f(-px.x, -px.y));
68
+ let c01 = textureSample(layout.$.source, layout.$.samp, uv + vec2f( 0.0, -px.y));
69
+ let c02 = textureSample(layout.$.source, layout.$.samp, uv + vec2f( px.x, -px.y));
70
+ let c10 = textureSample(layout.$.source, layout.$.samp, uv + vec2f(-px.x, 0.0));
71
+ let centerS = textureSample(layout.$.source, layout.$.samp, uv);
72
+ let c12 = textureSample(layout.$.source, layout.$.samp, uv + vec2f( px.x, 0.0));
73
+ let c20 = textureSample(layout.$.source, layout.$.samp, uv + vec2f(-px.x, px.y));
74
+ let c21 = textureSample(layout.$.source, layout.$.samp, uv + vec2f( 0.0, px.y));
75
+ let c22 = textureSample(layout.$.source, layout.$.samp, uv + vec2f( px.x, px.y));
76
+
77
+ let s00 = c00.rgb / max(c00.a, 1.0 / 255.0);
78
+ let s01 = c01.rgb / max(c01.a, 1.0 / 255.0);
79
+ let s02 = c02.rgb / max(c02.a, 1.0 / 255.0);
80
+ let s10 = c10.rgb / max(c10.a, 1.0 / 255.0);
81
+ let s11 = centerS.rgb / max(centerS.a, 1.0 / 255.0);
82
+ let s12 = c12.rgb / max(c12.a, 1.0 / 255.0);
83
+ let s20 = c20.rgb / max(c20.a, 1.0 / 255.0);
84
+ let s21 = c21.rgb / max(c21.a, 1.0 / 255.0);
85
+ let s22 = c22.rgb / max(c22.a, 1.0 / 255.0);
86
+
87
+ var acc = s00 * p.row0.x + s01 * p.row0.y + s02 * p.row0.z
88
+ + s10 * p.row1.x + s11 * p.row1.y + s12 * p.row1.z
89
+ + s20 * p.row2.x + s21 * p.row2.y + s22 * p.row2.z;
90
+
91
+ let declared = p.row2.w;
92
+ let kSum = p.row0.x + p.row0.y + p.row0.z
93
+ + p.row1.x + p.row1.y + p.row1.z
94
+ + p.row2.x + p.row2.y + p.row2.z;
95
+ let divisor = select(declared, select(1.0, kSum, kSum != 0.0), declared == 0.0);
96
+
97
+ acc = acc / divisor + vec3f(p.row0.w);
98
+ let outStraight = clamp(acc, vec3f(0.0), vec3f(1.0));
99
+
100
+ let coverage = textureSample(layout.$.mask, layout.$.samp, uv).a;
101
+ let mixedStraight = mix(s11, outStraight, coverage);
102
+ return vec4f(mixedStraight * centerS.a, centerS.a);
103
+ }
104
+ `,
105
+ io: {
106
+ inputs: {
107
+ source: {
108
+ colorSpace: "linear",
109
+ alpha: "premultiplied",
110
+ bindingKinds: ["texture_2d"]
111
+ },
112
+ mask: {
113
+ colorSpace: "linear",
114
+ alpha: "premultiplied",
115
+ bindingKinds: ["texture_2d"],
116
+ optional: true
117
+ }
118
+ },
119
+ output: {
120
+ colorSpace: "linear",
121
+ alpha: "premultiplied",
122
+ format: "rgba8unorm",
123
+ dimensions: "same-as:source"
124
+ },
125
+ rod: "same-as:source"
126
+ }
127
+ });
128
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../src/shaders/filters/convolve3x3/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,uEAAuE;IACvE,sEAAsE;IACtE,sEAAsE;IACtE,mEAAmE;IACnE,sEAAsE;IACtE,qEAAqE;IACrE,4CAA4C;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,0BAA0B;IACzC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,2BAA2B;IAC1C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAE,2BAA2B;CAC3C,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;IAClC,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;IACtC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5B,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAyB;IAC9C,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,eAAe;CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;IAC/C,EAAE,EAAE,qBAAqB;IACzB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,kBAAkB;IAC7B,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,iBAAiB;IACzB,aAAa,EAAE;QACb,8BAA8B;QAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAC1B;IACD,OAAO,EAAE,EAAE;IACX,MAAM;IACN,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACrC,IAAI,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDlB;IACC,EAAE,EAAE;QACF,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;YACD,IAAI,EAAE;gBACJ,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;gBAC5B,QAAQ,EAAE,IAAI;aACf;SACF;QACD,MAAM,EAAE;YACN,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `filters.glow@1` — multi-pass glow recipe.
3
+ *
4
+ * `extract` (`filters.threshold@1`) → `blurH` (`filters.blur.gaussian@1`) →
5
+ * `blurV` (`filters.blur.gaussian@1`) → `add` (`mixer.add@1`) over source.
6
+ *
7
+ * Intermediate formats are declared in the recipe, not chosen by the host —
8
+ * that's how a recipe like this produces the same output everywhere. The
9
+ * `bright` intermediate is a fragment write (render attachment); the blur
10
+ * intermediates are compute writes (storage textures). All three are read
11
+ * back as `texture_2d<f32>` by the next pass.
12
+ */
13
+ import * as d from "typegpu/data";
14
+ export declare const GlowParams: d.WgslStruct<{
15
+ threshold: d.F32;
16
+ softness: d.F32;
17
+ radius: d.F32;
18
+ intensity: d.F32;
19
+ }>;
20
+ export declare const filtersGlowV1: import("../../../../recipe.js").RecipeModule<{
21
+ threshold: number;
22
+ softness: number;
23
+ radius: number;
24
+ intensity: number;
25
+ }>;
26
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/shaders/filters/glow/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,UAAU;;;;;EAKrB,CAAC;AAWH,eAAO,MAAM,aAAa;;;;;EAwExB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * `filters.glow@1` — multi-pass glow recipe.
3
+ *
4
+ * `extract` (`filters.threshold@1`) → `blurH` (`filters.blur.gaussian@1`) →
5
+ * `blurV` (`filters.blur.gaussian@1`) → `add` (`mixer.add@1`) over source.
6
+ *
7
+ * Intermediate formats are declared in the recipe, not chosen by the host —
8
+ * that's how a recipe like this produces the same output everywhere. The
9
+ * `bright` intermediate is a fragment write (render attachment); the blur
10
+ * intermediates are compute writes (storage textures). All three are read
11
+ * back as `texture_2d<f32>` by the next pass.
12
+ */
13
+ import * as d from "typegpu/data";
14
+ import { defineRecipe } from "../../../../recipe.js";
15
+ export const GlowParams = d.struct({
16
+ threshold: d.f32,
17
+ softness: d.f32,
18
+ radius: d.f32,
19
+ intensity: d.f32
20
+ });
21
+ // Inlined WebGPU `GPUTextureUsage` flags. The named constants are runtime
22
+ // globals installed by the host adapter (browser ambient / Dawn `installGlobals`),
23
+ // so they're undefined when this module is imported before the adapter runs —
24
+ // using the literal bits keeps the recipe load-order-independent.
25
+ // COPY_SRC = 0x01, TEXTURE_BINDING = 0x04, STORAGE_BINDING = 0x08,
26
+ // RENDER_ATTACHMENT = 0x10
27
+ const INTERMEDIATE_BRIGHT_USAGE = 0x10 | 0x04 | 0x01;
28
+ const INTERMEDIATE_BLUR_USAGE = 0x08 | 0x04 | 0x01;
29
+ export const filtersGlowV1 = defineRecipe({
30
+ id: "filters.glow",
31
+ version: 1,
32
+ surface: "internal",
33
+ category: "filters",
34
+ paramDefaults: { threshold: 0.7, softness: 0.1, radius: 8, intensity: 1 },
35
+ paramUi: {
36
+ threshold: { min: 0, max: 1, step: 0.01, label: "Threshold" },
37
+ softness: { min: 0, max: 0.5, step: 0.01, label: "Softness" },
38
+ radius: { min: 0, max: 256, step: 0.5, label: "Radius", notes: "blur radius, px" },
39
+ intensity: { min: 0, max: 4, step: 0.01, label: "Intensity" }
40
+ },
41
+ io: {
42
+ inputs: {
43
+ source: {
44
+ colorSpace: "linear",
45
+ alpha: "premultiplied",
46
+ bindingKinds: ["texture_2d"]
47
+ }
48
+ },
49
+ output: {
50
+ colorSpace: "linear",
51
+ alpha: "premultiplied",
52
+ format: "rgba8unorm",
53
+ dimensions: "same-as:source"
54
+ },
55
+ rod: "expand:radius"
56
+ },
57
+ recipe: {
58
+ intermediates: {
59
+ bright: { format: "rgba8unorm", usage: INTERMEDIATE_BRIGHT_USAGE },
60
+ blurH: { format: "rgba8unorm", usage: INTERMEDIATE_BLUR_USAGE },
61
+ blurV: { format: "rgba8unorm", usage: INTERMEDIATE_BLUR_USAGE }
62
+ },
63
+ passes: [
64
+ {
65
+ op: { id: "filters.threshold", version: 1 },
66
+ in: { source: "source" },
67
+ out: { kind: "intermediate", name: "bright" },
68
+ params: { threshold: "$.threshold", softness: "$.softness" }
69
+ },
70
+ {
71
+ op: { id: "filters.blur.gaussian", version: 1 },
72
+ in: { source: { kind: "intermediate", name: "bright" } },
73
+ out: { kind: "intermediate", name: "blurH" },
74
+ params: {
75
+ radius: "$.radius",
76
+ sigma: 0,
77
+ direction: d.vec2f(1, 0)
78
+ }
79
+ },
80
+ {
81
+ op: { id: "filters.blur.gaussian", version: 1 },
82
+ in: { source: { kind: "intermediate", name: "blurH" } },
83
+ out: { kind: "intermediate", name: "blurV" },
84
+ params: {
85
+ radius: "$.radius",
86
+ sigma: 0,
87
+ direction: d.vec2f(0, 1)
88
+ }
89
+ },
90
+ {
91
+ op: { id: "mixer.add", version: 1 },
92
+ in: {
93
+ source: "source",
94
+ over: { kind: "intermediate", name: "blurV" }
95
+ },
96
+ out: "output",
97
+ params: { gain: "$.intensity" }
98
+ }
99
+ ]
100
+ }
101
+ });
102
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../src/shaders/filters/glow/v1/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `filters.grain@1` — film grain as a multiplicative gain wobble.
3
+ *
4
+ * **Multiplied, not added.** The input is premultiplied, so `rgb <= a` holds on
5
+ * every pixel and adding noise would break it: a translucent layer would come
6
+ * back with channels brighter than its own alpha, which reads as a bright
7
+ * fringe once it composites. A scalar gain preserves the invariant (the same
8
+ * reason `filters.vignette@1` may scale), and it is also closer to how exposed
9
+ * stock behaves — grain bites in the midtones and leaves black black, because
10
+ * there is nothing there to modulate.
11
+ *
12
+ * **Reproducible.** The pattern is a hash of the grain cell and `seed`, with no
13
+ * clock and no RNG state, so two renders of the same frame are byte-identical
14
+ * and a cached render can be handed back. A host that wants the pattern to roll
15
+ * passes the frame's own time as the seed.
16
+ */
17
+ import * as d from "typegpu/data";
18
+ export declare const GrainParams: d.WgslStruct<{
19
+ /** Gain wobble, 0..1. 0 leaves the picture untouched. */
20
+ amount: d.F32;
21
+ /** Grain cell size in source pixels. 1 is per-pixel. */
22
+ size: d.F32;
23
+ /** 0 = one gain for the pixel (monochrome), 1 = per-channel colour noise. */
24
+ colorAmount: d.F32;
25
+ /** Rolls the pattern. Same seed, same grain. */
26
+ seed: d.F32;
27
+ }>;
28
+ export declare const filtersGrainV1: import("../../../../module.js").ShaderModule<d.WgslStruct<{
29
+ /** Gain wobble, 0..1. 0 leaves the picture untouched. */
30
+ amount: d.F32;
31
+ /** Grain cell size in source pixels. 1 is per-pixel. */
32
+ size: d.F32;
33
+ /** 0 = one gain for the pixel (monochrome), 1 = per-channel colour noise. */
34
+ colorAmount: d.F32;
35
+ /** Rolls the pattern. Same seed, same grain. */
36
+ seed: d.F32;
37
+ }>>;
38
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/shaders/filters/grain/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,WAAW;IACtB,yDAAyD;;IAEzD,wDAAwD;;IAExD,6EAA6E;;IAE7E,gDAAgD;;EAEhD,CAAC;AAQH,eAAO,MAAM,cAAc;IAhBzB,yDAAyD;;IAEzD,wDAAwD;;IAExD,6EAA6E;;IAE7E,gDAAgD;;GAoFhD,CAAC"}