@basementstudio/shader-lab 0.1.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/dist/src/easings.d.ts +3 -0
  2. package/dist/src/easings.js +3 -0
  3. package/dist/src/index.d.ts +5 -0
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/lib/editor/custom-shader/shared.d.ts +1 -0
  6. package/dist/src/lib/editor/custom-shader/shared.js +1 -0
  7. package/dist/src/renderer/ascii-atlas.d.ts +5 -0
  8. package/dist/src/renderer/ascii-atlas.js +61 -0
  9. package/dist/src/renderer/ascii-pass.d.ts +50 -0
  10. package/dist/src/renderer/ascii-pass.js +271 -0
  11. package/dist/src/renderer/asset-url.d.ts +1 -0
  12. package/dist/src/renderer/asset-url.js +3 -0
  13. package/dist/src/renderer/blend-modes.d.ts +4 -0
  14. package/dist/src/renderer/blend-modes.js +157 -0
  15. package/dist/src/renderer/contracts.d.ts +26 -0
  16. package/dist/src/renderer/contracts.js +13 -0
  17. package/dist/src/renderer/create-webgpu-renderer.d.ts +3 -0
  18. package/dist/src/renderer/create-webgpu-renderer.js +37 -0
  19. package/dist/src/renderer/crt-pass.d.ts +72 -0
  20. package/dist/src/renderer/crt-pass.js +536 -0
  21. package/dist/src/renderer/custom-shader-pass.d.ts +17 -0
  22. package/dist/src/renderer/custom-shader-pass.js +79 -0
  23. package/dist/src/renderer/custom-shader-runtime.d.ts +16 -0
  24. package/dist/src/renderer/custom-shader-runtime.js +169 -0
  25. package/dist/src/renderer/dither-textures.d.ts +8 -0
  26. package/dist/src/renderer/dither-textures.js +66 -0
  27. package/dist/src/renderer/dithering-pass.d.ts +45 -0
  28. package/dist/src/renderer/dithering-pass.js +229 -0
  29. package/dist/src/renderer/gradient-pass.d.ts +39 -0
  30. package/dist/src/renderer/gradient-pass.js +358 -0
  31. package/dist/src/renderer/halftone-pass.d.ts +65 -0
  32. package/dist/src/renderer/halftone-pass.js +530 -0
  33. package/dist/src/renderer/ink-pass.d.ts +84 -0
  34. package/dist/src/renderer/ink-pass.js +526 -0
  35. package/dist/src/renderer/live-pass.d.ts +31 -0
  36. package/dist/src/renderer/live-pass.js +136 -0
  37. package/dist/src/renderer/media-pass.d.ts +32 -0
  38. package/dist/src/renderer/media-pass.js +130 -0
  39. package/dist/src/renderer/media-texture.d.ts +8 -0
  40. package/dist/src/renderer/media-texture.js +41 -0
  41. package/dist/src/renderer/particle-grid-pass.d.ts +48 -0
  42. package/dist/src/renderer/particle-grid-pass.js +269 -0
  43. package/dist/src/renderer/pass-node.d.ts +36 -0
  44. package/dist/src/renderer/pass-node.js +120 -0
  45. package/dist/src/renderer/pattern-atlas.d.ts +8 -0
  46. package/dist/src/renderer/pattern-atlas.js +79 -0
  47. package/dist/src/renderer/pattern-pass.d.ts +58 -0
  48. package/dist/src/renderer/pattern-pass.js +316 -0
  49. package/dist/src/renderer/pipeline-manager.d.ts +39 -0
  50. package/dist/src/renderer/pipeline-manager.js +287 -0
  51. package/dist/src/renderer/pixel-sorting-pass.d.ts +33 -0
  52. package/dist/src/renderer/pixel-sorting-pass.js +179 -0
  53. package/dist/src/renderer/shaders/tsl/color/tonemapping.d.ts +9 -0
  54. package/dist/src/renderer/shaders/tsl/color/tonemapping.js +59 -0
  55. package/dist/src/renderer/shaders/tsl/cosine-palette.d.ts +4 -0
  56. package/{packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts → dist/src/renderer/shaders/tsl/cosine-palette.js} +3 -4
  57. package/dist/src/renderer/shaders/tsl/noise/common.d.ts +5 -0
  58. package/dist/src/renderer/shaders/tsl/noise/common.js +24 -0
  59. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.d.ts +1 -0
  60. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.js +27 -0
  61. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.d.ts +1 -0
  62. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.js +27 -0
  63. package/dist/src/renderer/shaders/tsl/noise/fbm.d.ts +1 -0
  64. package/dist/src/renderer/shaders/tsl/noise/fbm.js +11 -0
  65. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.d.ts +5 -0
  66. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.js +66 -0
  67. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.d.ts +1 -0
  68. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.js +19 -0
  69. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.d.ts +1 -0
  70. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.js +44 -0
  71. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.d.ts +1 -0
  72. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.js +51 -0
  73. package/dist/src/renderer/shaders/tsl/noise/turbulence.d.ts +7 -0
  74. package/dist/src/renderer/shaders/tsl/noise/turbulence.js +34 -0
  75. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.d.ts +1 -0
  76. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.js +27 -0
  77. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.d.ts +1 -0
  78. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.js +45 -0
  79. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.d.ts +4 -0
  80. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.js +13 -0
  81. package/dist/src/renderer/shaders/tsl/patterns/bloom.d.ts +4 -0
  82. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts → dist/src/renderer/shaders/tsl/patterns/bloom.js} +4 -6
  83. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.d.ts +4 -0
  84. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.js +16 -0
  85. package/dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.d.ts +4 -0
  86. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts → dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.js} +3 -4
  87. package/dist/src/renderer/shaders/tsl/patterns/repeating-pattern.d.ts +4 -0
  88. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts → dist/src/renderer/shaders/tsl/patterns/repeating-pattern.js} +4 -6
  89. package/dist/src/renderer/shaders/tsl/utils/atan2.d.ts +1 -0
  90. package/dist/src/renderer/shaders/tsl/utils/atan2.js +7 -0
  91. package/dist/src/renderer/shaders/tsl/utils/complex-conj.d.ts +4 -0
  92. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts → dist/src/renderer/shaders/tsl/utils/complex-conj.js} +3 -4
  93. package/dist/src/renderer/shaders/tsl/utils/complex-cos.d.ts +4 -0
  94. package/dist/src/renderer/shaders/tsl/utils/complex-cos.js +9 -0
  95. package/dist/src/renderer/shaders/tsl/utils/complex-div.d.ts +1 -0
  96. package/dist/src/renderer/shaders/tsl/utils/complex-div.js +6 -0
  97. package/dist/src/renderer/shaders/tsl/utils/complex-log.d.ts +1 -0
  98. package/dist/src/renderer/shaders/tsl/utils/complex-log.js +6 -0
  99. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.d.ts +4 -0
  100. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.js +10 -0
  101. package/dist/src/renderer/shaders/tsl/utils/complex-mul.d.ts +4 -0
  102. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts → dist/src/renderer/shaders/tsl/utils/complex-mul.js} +3 -4
  103. package/dist/src/renderer/shaders/tsl/utils/complex-pow.d.ts +5 -0
  104. package/dist/src/renderer/shaders/tsl/utils/complex-pow.js +14 -0
  105. package/dist/src/renderer/shaders/tsl/utils/complex-sin.d.ts +4 -0
  106. package/dist/src/renderer/shaders/tsl/utils/complex-sin.js +9 -0
  107. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.d.ts +5 -0
  108. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.js +12 -0
  109. package/dist/src/renderer/shaders/tsl/utils/complex-tan.d.ts +4 -0
  110. package/dist/src/renderer/shaders/tsl/utils/complex-tan.js +11 -0
  111. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.d.ts +4 -0
  112. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.js +9 -0
  113. package/dist/src/renderer/shaders/tsl/utils/hyperbolic.d.ts +8 -0
  114. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts → dist/src/renderer/shaders/tsl/utils/hyperbolic.js} +7 -11
  115. package/dist/src/renderer/shaders/tsl/utils/index.d.ts +38 -0
  116. package/dist/src/renderer/shaders/tsl/utils/index.js +39 -0
  117. package/dist/src/renderer/shaders/tsl/utils/rotate.d.ts +2 -0
  118. package/dist/src/renderer/shaders/tsl/utils/rotate.js +7 -0
  119. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.d.ts +2 -0
  120. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.js +6 -0
  121. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.d.ts +1 -0
  122. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.js +5 -0
  123. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.d.ts +1 -0
  124. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.js +5 -0
  125. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.d.ts +1 -0
  126. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.js +14 -0
  127. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.d.ts +1 -0
  128. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.js +5 -0
  129. package/dist/src/renderer/shaders/tsl/utils/smax.d.ts +1 -0
  130. package/dist/src/renderer/shaders/tsl/utils/smax.js +6 -0
  131. package/dist/src/renderer/shaders/tsl/utils/smin.d.ts +1 -0
  132. package/dist/src/renderer/shaders/tsl/utils/smin.js +6 -0
  133. package/dist/src/renderer/text-pass.d.ts +23 -0
  134. package/dist/src/renderer/text-pass.js +129 -0
  135. package/dist/src/runtime-clock.d.ts +9 -0
  136. package/dist/src/runtime-clock.js +20 -0
  137. package/dist/src/runtime-frame.d.ts +11 -0
  138. package/dist/src/runtime-frame.js +12 -0
  139. package/dist/src/shader-lab-composition.d.ts +9 -0
  140. package/dist/src/shader-lab-composition.js +96 -0
  141. package/dist/src/timeline.d.ts +8 -0
  142. package/dist/src/timeline.js +179 -0
  143. package/dist/src/types/editor.d.ts +3 -0
  144. package/dist/src/types/editor.js +1 -0
  145. package/dist/src/types.d.ts +81 -0
  146. package/dist/src/types.js +1 -0
  147. package/package.json +28 -65
  148. package/.biome/plugins/README.md +0 -21
  149. package/.biome/plugins/no-anchor-element.grit +0 -12
  150. package/.biome/plugins/no-relative-parent-imports.grit +0 -10
  151. package/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  152. package/.changeset/README.md +0 -17
  153. package/.changeset/config.json +0 -11
  154. package/.editorconfig +0 -40
  155. package/.env.example +0 -81
  156. package/.gitattributes +0 -19
  157. package/.github/workflows/canary.yml +0 -80
  158. package/.github/workflows/ci.yml +0 -37
  159. package/.github/workflows/release.yml +0 -56
  160. package/.tldrignore +0 -84
  161. package/.vscode/extensions.json +0 -20
  162. package/.vscode/settings.json +0 -105
  163. package/biome.json +0 -249
  164. package/bun.lock +0 -1224
  165. package/next.config.ts +0 -131
  166. package/packages/shader-lab-react/CHANGELOG.md +0 -9
  167. package/packages/shader-lab-react/README.md +0 -119
  168. package/packages/shader-lab-react/package.json +0 -36
  169. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +0 -57
  170. package/packages/shader-lab-react/scripts/prepare-dist.mjs +0 -4
  171. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +0 -146
  172. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +0 -51
  173. package/packages/shader-lab-react/src/easings.ts +0 -4
  174. package/packages/shader-lab-react/src/index.ts +0 -35
  175. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +0 -2
  176. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +0 -83
  177. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +0 -416
  178. package/packages/shader-lab-react/src/renderer/asset-url.ts +0 -3
  179. package/packages/shader-lab-react/src/renderer/blend-modes.ts +0 -229
  180. package/packages/shader-lab-react/src/renderer/contracts.ts +0 -54
  181. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +0 -48
  182. package/packages/shader-lab-react/src/renderer/crt-pass.ts +0 -1040
  183. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +0 -108
  184. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +0 -309
  185. package/packages/shader-lab-react/src/renderer/dither-textures.ts +0 -99
  186. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +0 -322
  187. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +0 -521
  188. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +0 -932
  189. package/packages/shader-lab-react/src/renderer/ink-pass.ts +0 -802
  190. package/packages/shader-lab-react/src/renderer/live-pass.ts +0 -194
  191. package/packages/shader-lab-react/src/renderer/media-pass.ts +0 -187
  192. package/packages/shader-lab-react/src/renderer/media-texture.ts +0 -66
  193. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +0 -389
  194. package/packages/shader-lab-react/src/renderer/pass-node.ts +0 -209
  195. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +0 -133
  196. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +0 -552
  197. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +0 -369
  198. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +0 -277
  199. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +0 -87
  200. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +0 -31
  201. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -36
  202. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -36
  203. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +0 -13
  204. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -96
  205. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -24
  206. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -79
  207. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -89
  208. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +0 -56
  209. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -32
  210. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -60
  211. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -15
  212. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -24
  213. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +0 -9
  214. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -10
  215. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +0 -11
  216. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +0 -7
  217. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -12
  218. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -16
  219. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -10
  220. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -18
  221. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -12
  222. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -10
  223. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +0 -48
  224. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +0 -15
  225. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -15
  226. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -6
  227. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -6
  228. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -27
  229. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -6
  230. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  231. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +0 -7
  232. package/packages/shader-lab-react/src/renderer/text-pass.ts +0 -176
  233. package/packages/shader-lab-react/src/runtime-clock.ts +0 -42
  234. package/packages/shader-lab-react/src/runtime-frame.ts +0 -29
  235. package/packages/shader-lab-react/src/shader-lab-composition.tsx +0 -163
  236. package/packages/shader-lab-react/src/timeline.ts +0 -283
  237. package/packages/shader-lab-react/src/types/editor.ts +0 -5
  238. package/packages/shader-lab-react/src/types.ts +0 -141
  239. package/packages/shader-lab-react/tsconfig.build.json +0 -8
  240. package/packages/shader-lab-react/tsconfig.json +0 -21
  241. package/postcss.config.mjs +0 -5
  242. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  243. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +0 -1412
  244. package/public/assets/patterns/bars/1.svg +0 -3
  245. package/public/assets/patterns/bars/2.svg +0 -3
  246. package/public/assets/patterns/bars/3.svg +0 -3
  247. package/public/assets/patterns/bars/4.svg +0 -3
  248. package/public/assets/patterns/bars/5.svg +0 -3
  249. package/public/assets/patterns/bars/6.svg +0 -3
  250. package/public/assets/patterns/candles/1.svg +0 -3
  251. package/public/assets/patterns/candles/2.svg +0 -3
  252. package/public/assets/patterns/candles/3.svg +0 -3
  253. package/public/assets/patterns/candles/4.svg +0 -3
  254. package/public/assets/patterns/shapes/1.svg +0 -3
  255. package/public/assets/patterns/shapes/2.svg +0 -3
  256. package/public/assets/patterns/shapes/3.svg +0 -3
  257. package/public/assets/patterns/shapes/4.svg +0 -4
  258. package/public/assets/patterns/shapes/5.svg +0 -3
  259. package/public/assets/patterns/shapes/6.svg +0 -4
  260. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  261. package/public/textures/blue-noise.png +0 -0
  262. package/public/textures/crt-mask.png +0 -0
  263. package/src/app/design/page.tsx +0 -398
  264. package/src/app/favicon.ico +0 -0
  265. package/src/app/globals.css +0 -280
  266. package/src/app/layout.tsx +0 -89
  267. package/src/app/page.tsx +0 -20
  268. package/src/app/robots.ts +0 -13
  269. package/src/app/sitemap.ts +0 -13
  270. package/src/components/editor/editor-canvas-viewport.tsx +0 -116
  271. package/src/components/editor/editor-export-dialog.tsx +0 -1177
  272. package/src/components/editor/editor-timeline-overlay.tsx +0 -983
  273. package/src/components/editor/editor-topbar.tsx +0 -287
  274. package/src/components/editor/layer-sidebar.tsx +0 -738
  275. package/src/components/editor/properties-sidebar-content.tsx +0 -574
  276. package/src/components/editor/properties-sidebar-fields.tsx +0 -389
  277. package/src/components/editor/properties-sidebar-utils.ts +0 -178
  278. package/src/components/editor/properties-sidebar.tsx +0 -421
  279. package/src/components/ui/button/index.tsx +0 -57
  280. package/src/components/ui/color-picker/index.tsx +0 -358
  281. package/src/components/ui/glass-panel/index.tsx +0 -45
  282. package/src/components/ui/icon-button/index.tsx +0 -46
  283. package/src/components/ui/select/index.tsx +0 -136
  284. package/src/components/ui/slider/index.tsx +0 -192
  285. package/src/components/ui/toggle/index.tsx +0 -34
  286. package/src/components/ui/typography/index.tsx +0 -61
  287. package/src/components/ui/xy-pad/index.tsx +0 -160
  288. package/src/features/editor/components/editor-export-dialog.module.css +0 -271
  289. package/src/hooks/use-editor-renderer.ts +0 -182
  290. package/src/lib/app.ts +0 -6
  291. package/src/lib/cn.ts +0 -7
  292. package/src/lib/easings.ts +0 -240
  293. package/src/lib/editor/config/layer-registry.ts +0 -2434
  294. package/src/lib/editor/custom-shader/shared.ts +0 -28
  295. package/src/lib/editor/export.ts +0 -420
  296. package/src/lib/editor/history.ts +0 -71
  297. package/src/lib/editor/layers.ts +0 -76
  298. package/src/lib/editor/parameter-schema.ts +0 -75
  299. package/src/lib/editor/project-file.ts +0 -145
  300. package/src/lib/editor/shader-export-snippet.ts +0 -37
  301. package/src/lib/editor/shader-export.ts +0 -315
  302. package/src/lib/editor/timeline/evaluate.ts +0 -252
  303. package/src/lib/editor/view-transform.ts +0 -58
  304. package/src/lib/fonts.ts +0 -28
  305. package/src/renderer/ascii-atlas.ts +0 -83
  306. package/src/renderer/ascii-pass.ts +0 -416
  307. package/src/renderer/blend-modes.ts +0 -229
  308. package/src/renderer/contracts.ts +0 -161
  309. package/src/renderer/create-webgpu-renderer.ts +0 -48
  310. package/src/renderer/crt-pass.ts +0 -1040
  311. package/src/renderer/custom-shader-pass.ts +0 -117
  312. package/src/renderer/custom-shader-runtime.ts +0 -309
  313. package/src/renderer/dither-textures.ts +0 -99
  314. package/src/renderer/dithering-pass.ts +0 -322
  315. package/src/renderer/gradient-pass.ts +0 -520
  316. package/src/renderer/halftone-pass.ts +0 -932
  317. package/src/renderer/ink-pass.ts +0 -683
  318. package/src/renderer/live-pass.ts +0 -194
  319. package/src/renderer/media-pass.ts +0 -187
  320. package/src/renderer/media-texture.ts +0 -66
  321. package/src/renderer/particle-grid-pass.ts +0 -389
  322. package/src/renderer/pass-node-factory.ts +0 -33
  323. package/src/renderer/pass-node.ts +0 -209
  324. package/src/renderer/pattern-atlas.ts +0 -97
  325. package/src/renderer/pattern-pass.ts +0 -552
  326. package/src/renderer/pipeline-manager.ts +0 -343
  327. package/src/renderer/pixel-sorting-pass.ts +0 -277
  328. package/src/renderer/project-clock.ts +0 -57
  329. package/src/renderer/shaders/tsl/color/tonemapping.ts +0 -86
  330. package/src/renderer/shaders/tsl/cosine-palette.ts +0 -8
  331. package/src/renderer/shaders/tsl/noise/common.ts +0 -30
  332. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -35
  333. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -35
  334. package/src/renderer/shaders/tsl/noise/fbm.ts +0 -12
  335. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -97
  336. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -23
  337. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -78
  338. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -88
  339. package/src/renderer/shaders/tsl/noise/turbulence.ts +0 -55
  340. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -31
  341. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -59
  342. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -14
  343. package/src/renderer/shaders/tsl/patterns/bloom.ts +0 -10
  344. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -23
  345. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +0 -8
  346. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +0 -10
  347. package/src/renderer/shaders/tsl/utils/atan2.ts +0 -8
  348. package/src/renderer/shaders/tsl/utils/complex-conj.ts +0 -8
  349. package/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -9
  350. package/src/renderer/shaders/tsl/utils/complex-div.ts +0 -10
  351. package/src/renderer/shaders/tsl/utils/complex-log.ts +0 -6
  352. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -11
  353. package/src/renderer/shaders/tsl/utils/complex-mul.ts +0 -8
  354. package/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -15
  355. package/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -9
  356. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -17
  357. package/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -11
  358. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -9
  359. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +0 -19
  360. package/src/renderer/shaders/tsl/utils/index.ts +0 -47
  361. package/src/renderer/shaders/tsl/utils/rotate.ts +0 -14
  362. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -14
  363. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -5
  364. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -5
  365. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -26
  366. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -5
  367. package/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  368. package/src/renderer/shaders/tsl/utils/smin.ts +0 -6
  369. package/src/renderer/text-pass.ts +0 -176
  370. package/src/store/asset-store.ts +0 -193
  371. package/src/store/editor-store.ts +0 -223
  372. package/src/store/history-store.ts +0 -172
  373. package/src/store/index.ts +0 -31
  374. package/src/store/layer-store.ts +0 -675
  375. package/src/store/timeline-store.ts +0 -572
  376. package/src/types/assets.d.ts +0 -6
  377. package/src/types/css.d.ts +0 -21
  378. package/src/types/editor.ts +0 -357
  379. package/src/types/react.d.ts +0 -15
  380. package/src/types/three-tsl.d.ts +0 -146
  381. package/src/types/three-webgpu.d.ts +0 -51
  382. package/tsconfig.json +0 -49
  383. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/1.svg +0 -0
  384. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/2.svg +0 -0
  385. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/3.svg +0 -0
  386. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/4.svg +0 -0
  387. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/5.svg +0 -0
  388. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/6.svg +0 -0
  389. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/1.svg +0 -0
  390. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/2.svg +0 -0
  391. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/3.svg +0 -0
  392. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/4.svg +0 -0
  393. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/1.svg +0 -0
  394. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/2.svg +0 -0
  395. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/3.svg +0 -0
  396. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/4.svg +0 -0
  397. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/5.svg +0 -0
  398. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/6.svg +0 -0
  399. /package/{packages/shader-lab-react/assets → assets}/textures/blue-noise.png +0 -0
@@ -0,0 +1,530 @@
1
+ import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
2
+ import { abs, clamp, cos, float, floor, max, min, mix, screenSize, select, sin, smoothstep, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
3
+ import * as THREE from "three/webgpu";
4
+ import { PassNode } from "./pass-node.js";
5
+ import { grainTexturePattern } from "./shaders/tsl/patterns/grain-texture-pattern.js";
6
+ function clamp01(value) {
7
+ return Math.max(0, Math.min(1, value));
8
+ }
9
+ function hexToRgb(hex) {
10
+ const normalized = hex.trim().replace("#", "");
11
+ const value = normalized.length === 3
12
+ ? normalized
13
+ .split("")
14
+ .map((entry) => `${entry}${entry}`)
15
+ .join("")
16
+ : normalized.padEnd(6, "0").slice(0, 6);
17
+ return [
18
+ Number.parseInt(value.slice(0, 2), 16) / 255,
19
+ Number.parseInt(value.slice(2, 4), 16) / 255,
20
+ Number.parseInt(value.slice(4, 6), 16) / 255,
21
+ ];
22
+ }
23
+ export class HalftonePass extends PassNode {
24
+ bloomEnabled = false;
25
+ bloomNode = null;
26
+ colorMode = "cmyk";
27
+ cmykBlendMode = "subtractive";
28
+ spacingUniform;
29
+ dotSizeUniform;
30
+ dotMinUniform;
31
+ shapeUniform;
32
+ angleUniform;
33
+ contrastUniform;
34
+ softnessUniform;
35
+ invertUniform;
36
+ inkRedUniform;
37
+ inkGreenUniform;
38
+ inkBlueUniform;
39
+ duotoneLightUniform;
40
+ duotoneDarkUniform;
41
+ customBgColorUniform;
42
+ customColorCountUniform;
43
+ customLuminanceBiasUniform;
44
+ customColor1Uniform;
45
+ customColor2Uniform;
46
+ customColor3Uniform;
47
+ customColor4Uniform;
48
+ bloomIntensityUniform;
49
+ bloomRadiusUniform;
50
+ bloomSoftnessUniform;
51
+ bloomThresholdUniform;
52
+ cyanAngleUniform;
53
+ magentaAngleUniform;
54
+ yellowAngleUniform;
55
+ keyAngleUniform;
56
+ paperRedUniform;
57
+ paperGreenUniform;
58
+ paperBlueUniform;
59
+ paperGrainUniform;
60
+ gcrUniform;
61
+ registrationUniform;
62
+ inkCyanUniform;
63
+ inkMagentaUniform;
64
+ inkYellowUniform;
65
+ inkKeyUniform;
66
+ dotGainUniform;
67
+ dotMorphUniform;
68
+ sampleNodes = [];
69
+ constructor(layerId) {
70
+ super(layerId);
71
+ this.spacingUniform = uniform(5);
72
+ this.dotSizeUniform = uniform(1.0);
73
+ this.dotMinUniform = uniform(0.0);
74
+ this.shapeUniform = uniform(0);
75
+ this.angleUniform = uniform((28 * Math.PI) / 180);
76
+ this.contrastUniform = uniform(1.0);
77
+ this.softnessUniform = uniform(0.25);
78
+ this.invertUniform = uniform(0);
79
+ const [inkR, inkG, inkB] = hexToRgb("#0d1014");
80
+ this.inkRedUniform = uniform(inkR);
81
+ this.inkGreenUniform = uniform(inkG);
82
+ this.inkBlueUniform = uniform(inkB);
83
+ this.duotoneLightUniform = uniform(new THREE.Vector3(0.96, 0.96, 0.94));
84
+ this.duotoneDarkUniform = uniform(new THREE.Vector3(0.11, 0.11, 0.11));
85
+ const [customBgR, customBgG, customBgB] = hexToRgb("#F5F5F0");
86
+ this.customBgColorUniform = uniform(new THREE.Vector3(customBgR, customBgG, customBgB));
87
+ this.customColorCountUniform = uniform(4);
88
+ this.customLuminanceBiasUniform = uniform(0);
89
+ const [custom1R, custom1G, custom1B] = hexToRgb("#161616");
90
+ this.customColor1Uniform = uniform(new THREE.Vector3(custom1R, custom1G, custom1B));
91
+ const [custom2R, custom2G, custom2B] = hexToRgb("#595959");
92
+ this.customColor2Uniform = uniform(new THREE.Vector3(custom2R, custom2G, custom2B));
93
+ const [custom3R, custom3G, custom3B] = hexToRgb("#A0A0A0");
94
+ this.customColor3Uniform = uniform(new THREE.Vector3(custom3R, custom3G, custom3B));
95
+ const [custom4R, custom4G, custom4B] = hexToRgb("#E8E8E8");
96
+ this.customColor4Uniform = uniform(new THREE.Vector3(custom4R, custom4G, custom4B));
97
+ this.bloomIntensityUniform = uniform(1.25);
98
+ this.bloomRadiusUniform = uniform(6);
99
+ this.bloomSoftnessUniform = uniform(0.35);
100
+ this.bloomThresholdUniform = uniform(0.6);
101
+ this.cyanAngleUniform = uniform((15 * Math.PI) / 180);
102
+ this.magentaAngleUniform = uniform((75 * Math.PI) / 180);
103
+ this.yellowAngleUniform = uniform(0);
104
+ this.keyAngleUniform = uniform((45 * Math.PI) / 180);
105
+ const [paperR, paperG, paperB] = hexToRgb("#F5F5F0");
106
+ this.paperRedUniform = uniform(paperR);
107
+ this.paperGreenUniform = uniform(paperG);
108
+ this.paperBlueUniform = uniform(paperB);
109
+ this.paperGrainUniform = uniform(0.15);
110
+ this.gcrUniform = uniform(0.5);
111
+ this.registrationUniform = uniform(0);
112
+ const [cyanR, cyanG, cyanB] = hexToRgb("#00AEEF");
113
+ this.inkCyanUniform = uniform(new THREE.Vector3(cyanR, cyanG, cyanB));
114
+ const [magR, magG, magB] = hexToRgb("#EC008C");
115
+ this.inkMagentaUniform = uniform(new THREE.Vector3(magR, magG, magB));
116
+ const [yelR, yelG, yelB] = hexToRgb("#FFF200");
117
+ this.inkYellowUniform = uniform(new THREE.Vector3(yelR, yelG, yelB));
118
+ const [keyR, keyG, keyB] = hexToRgb("#1a1a1a");
119
+ this.inkKeyUniform = uniform(new THREE.Vector3(keyR, keyG, keyB));
120
+ this.dotGainUniform = uniform(0);
121
+ this.dotMorphUniform = uniform(0);
122
+ this.rebuildEffectNode();
123
+ }
124
+ render(renderer, inputTexture, outputTarget, time, delta) {
125
+ for (const node of this.sampleNodes) {
126
+ node.value = inputTexture;
127
+ }
128
+ super.render(renderer, inputTexture, outputTarget, time, delta);
129
+ }
130
+ updateParams(params) {
131
+ this.spacingUniform.value =
132
+ typeof params.spacing === "number" ? Math.max(2, params.spacing) : 12;
133
+ this.dotSizeUniform.value =
134
+ typeof params.dotSize === "number" ? params.dotSize : 0.8;
135
+ this.dotMinUniform.value =
136
+ typeof params.dotMin === "number" ? params.dotMin : 0;
137
+ this.contrastUniform.value =
138
+ typeof params.contrast === "number" ? params.contrast : 1;
139
+ this.softnessUniform.value =
140
+ typeof params.softness === "number" ? params.softness : 0.25;
141
+ this.invertUniform.value = params.invertLuma === true ? 1 : 0;
142
+ this.angleUniform.value =
143
+ typeof params.angle === "number" ? (params.angle * Math.PI) / 180 : 0;
144
+ const shapeMap = {
145
+ circle: 0,
146
+ square: 1,
147
+ diamond: 2,
148
+ line: 3,
149
+ };
150
+ this.shapeUniform.value = shapeMap[params.shape] ?? 0;
151
+ if (typeof params.ink === "string") {
152
+ const [r, g, b] = hexToRgb(params.ink);
153
+ this.inkRedUniform.value = r;
154
+ this.inkGreenUniform.value = g;
155
+ this.inkBlueUniform.value = b;
156
+ }
157
+ if (typeof params.duotoneLight === "string") {
158
+ const [r, g, b] = hexToRgb(params.duotoneLight);
159
+ this.duotoneLightUniform.value.set(r, g, b);
160
+ }
161
+ if (typeof params.duotoneDark === "string") {
162
+ const [r, g, b] = hexToRgb(params.duotoneDark);
163
+ this.duotoneDarkUniform.value.set(r, g, b);
164
+ }
165
+ if (typeof params.customBgColor === "string") {
166
+ const [r, g, b] = hexToRgb(params.customBgColor);
167
+ this.customBgColorUniform.value.set(r, g, b);
168
+ }
169
+ if (typeof params.customColorCount === "number") {
170
+ this.customColorCountUniform.value = Math.min(4, Math.max(2, Math.round(params.customColorCount)));
171
+ }
172
+ if (typeof params.customLuminanceBias === "number") {
173
+ this.customLuminanceBiasUniform.value = Math.min(1, Math.max(-1, params.customLuminanceBias));
174
+ }
175
+ if (typeof params.customColor1 === "string") {
176
+ const [r, g, b] = hexToRgb(params.customColor1);
177
+ this.customColor1Uniform.value.set(r, g, b);
178
+ }
179
+ if (typeof params.customColor2 === "string") {
180
+ const [r, g, b] = hexToRgb(params.customColor2);
181
+ this.customColor2Uniform.value.set(r, g, b);
182
+ }
183
+ if (typeof params.customColor3 === "string") {
184
+ const [r, g, b] = hexToRgb(params.customColor3);
185
+ this.customColor3Uniform.value.set(r, g, b);
186
+ }
187
+ if (typeof params.customColor4 === "string") {
188
+ const [r, g, b] = hexToRgb(params.customColor4);
189
+ this.customColor4Uniform.value.set(r, g, b);
190
+ }
191
+ if (typeof params.cyanAngle === "number") {
192
+ this.cyanAngleUniform.value = (params.cyanAngle * Math.PI) / 180;
193
+ }
194
+ if (typeof params.magentaAngle === "number") {
195
+ this.magentaAngleUniform.value = (params.magentaAngle * Math.PI) / 180;
196
+ }
197
+ if (typeof params.yellowAngle === "number") {
198
+ this.yellowAngleUniform.value = (params.yellowAngle * Math.PI) / 180;
199
+ }
200
+ if (typeof params.keyAngle === "number") {
201
+ this.keyAngleUniform.value = (params.keyAngle * Math.PI) / 180;
202
+ }
203
+ if (typeof params.paperColor === "string") {
204
+ const [r, g, b] = hexToRgb(params.paperColor);
205
+ this.paperRedUniform.value = r;
206
+ this.paperGreenUniform.value = g;
207
+ this.paperBlueUniform.value = b;
208
+ }
209
+ if (typeof params.paperGrain === "number") {
210
+ this.paperGrainUniform.value = params.paperGrain;
211
+ }
212
+ if (typeof params.gcr === "number") {
213
+ this.gcrUniform.value = params.gcr;
214
+ }
215
+ if (typeof params.registration === "number") {
216
+ this.registrationUniform.value = params.registration;
217
+ }
218
+ if (typeof params.dotGain === "number") {
219
+ this.dotGainUniform.value = params.dotGain;
220
+ }
221
+ if (typeof params.dotMorph === "number") {
222
+ this.dotMorphUniform.value = params.dotMorph;
223
+ }
224
+ const nextBloomIntensity = typeof params.bloomIntensity === "number"
225
+ ? Math.max(0, params.bloomIntensity)
226
+ : 1.25;
227
+ const nextBloomThreshold = typeof params.bloomThreshold === "number"
228
+ ? clamp01(params.bloomThreshold)
229
+ : 0.6;
230
+ const nextBloomRadius = typeof params.bloomRadius === "number"
231
+ ? Math.max(0, params.bloomRadius)
232
+ : 6;
233
+ const nextBloomSoftness = typeof params.bloomSoftness === "number"
234
+ ? clamp01(params.bloomSoftness)
235
+ : 0.35;
236
+ this.bloomIntensityUniform.value = nextBloomIntensity;
237
+ this.bloomRadiusUniform.value = nextBloomRadius;
238
+ this.bloomSoftnessUniform.value = nextBloomSoftness;
239
+ this.bloomThresholdUniform.value = nextBloomThreshold;
240
+ if (typeof params.inkCyan === "string") {
241
+ const [r, g, b] = hexToRgb(params.inkCyan);
242
+ this.inkCyanUniform.value.set(r, g, b);
243
+ }
244
+ if (typeof params.inkMagenta === "string") {
245
+ const [r, g, b] = hexToRgb(params.inkMagenta);
246
+ this.inkMagentaUniform.value.set(r, g, b);
247
+ }
248
+ if (typeof params.inkYellow === "string") {
249
+ const [r, g, b] = hexToRgb(params.inkYellow);
250
+ this.inkYellowUniform.value.set(r, g, b);
251
+ }
252
+ if (typeof params.inkKey === "string") {
253
+ const [r, g, b] = hexToRgb(params.inkKey);
254
+ this.inkKeyUniform.value.set(r, g, b);
255
+ }
256
+ let needsRebuild = false;
257
+ const nextColorMode = parseColorMode(params.colorMode);
258
+ if (nextColorMode !== this.colorMode) {
259
+ this.colorMode = nextColorMode;
260
+ needsRebuild = true;
261
+ }
262
+ const resolvedBloomEnabled = nextColorMode === "custom" && params.bloomEnabled === true;
263
+ if (resolvedBloomEnabled !== this.bloomEnabled) {
264
+ this.bloomEnabled = resolvedBloomEnabled;
265
+ needsRebuild = true;
266
+ }
267
+ const nextCmykBlend = parseCmykBlend(params.cmykBlend);
268
+ if (nextCmykBlend !== this.cmykBlendMode) {
269
+ this.cmykBlendMode = nextCmykBlend;
270
+ needsRebuild = true;
271
+ }
272
+ if (needsRebuild) {
273
+ this.rebuildEffectNode();
274
+ return;
275
+ }
276
+ if (this.bloomNode) {
277
+ this.bloomNode.strength.value = nextBloomIntensity;
278
+ this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius);
279
+ this.bloomNode.threshold.value = nextBloomThreshold;
280
+ this.bloomNode.smoothWidth.value =
281
+ this.normalizeBloomSoftness(nextBloomSoftness);
282
+ }
283
+ }
284
+ dispose() {
285
+ this.disposeBloomNode();
286
+ super.dispose();
287
+ }
288
+ buildEffectNode() {
289
+ if (!this.spacingUniform)
290
+ return this.inputNode;
291
+ this.disposeBloomNode();
292
+ this.bloomNode = null;
293
+ this.sampleNodes = [];
294
+ const renderTargetUv = vec2(uv().x, float(1).sub(uv().y));
295
+ const pixCoord = renderTargetUv.mul(screenSize);
296
+ if (this.colorMode === "cmyk") {
297
+ return this.buildCmykNode(pixCoord, renderTargetUv);
298
+ }
299
+ return this.buildSingleChannelNode(pixCoord, renderTargetUv);
300
+ }
301
+ buildSingleChannelNode(pixCoord, _renderTargetUv) {
302
+ const grid = this.buildHalftoneGrid(pixCoord, this.angleUniform, (sample) => {
303
+ return float(sample.r)
304
+ .mul(0.2126)
305
+ .add(float(sample.g).mul(0.7152))
306
+ .add(float(sample.b).mul(0.0722));
307
+ });
308
+ const darkVec = vec3(float(this.duotoneDarkUniform.x), float(this.duotoneDarkUniform.y), float(this.duotoneDarkUniform.z));
309
+ const lightVec = vec3(float(this.duotoneLightUniform.x), float(this.duotoneLightUniform.y), float(this.duotoneLightUniform.z));
310
+ const customBgVec = vec3(float(this.customBgColorUniform.x), float(this.customBgColorUniform.y), float(this.customBgColorUniform.z));
311
+ const customColor1Vec = vec3(float(this.customColor1Uniform.x), float(this.customColor1Uniform.y), float(this.customColor1Uniform.z));
312
+ const customColor2Vec = vec3(float(this.customColor2Uniform.x), float(this.customColor2Uniform.y), float(this.customColor2Uniform.z));
313
+ const customColor3Vec = vec3(float(this.customColor3Uniform.x), float(this.customColor3Uniform.y), float(this.customColor3Uniform.z));
314
+ const customColor4Vec = vec3(float(this.customColor4Uniform.x), float(this.customColor4Uniform.y), float(this.customColor4Uniform.z));
315
+ const customColorCount = clamp(float(this.customColorCountUniform), float(2), float(4));
316
+ const customLuminance = clamp(grid.luma.add(float(this.customLuminanceBiasUniform).mul(0.35)), float(0), float(1));
317
+ let dotColor;
318
+ let bgColor;
319
+ let emissiveColor = vec3(float(0), float(0), float(0));
320
+ switch (this.colorMode) {
321
+ case "monochrome": {
322
+ const inkVec = vec3(this.inkRedUniform, this.inkGreenUniform, this.inkBlueUniform);
323
+ dotColor = vec3(grid.luma, grid.luma, grid.luma).mul(inkVec);
324
+ bgColor = vec3(0, 0, 0);
325
+ break;
326
+ }
327
+ case "duotone":
328
+ dotColor = mix(darkVec, lightVec, grid.luma);
329
+ bgColor = darkVec;
330
+ break;
331
+ case "custom":
332
+ dotColor = select(customColorCount.lessThan(float(2.5)), select(customLuminance.lessThan(float(0.5)), customColor1Vec, customColor2Vec), select(customColorCount.lessThan(float(3.5)), select(customLuminance.lessThan(float(1 / 3)), customColor1Vec, select(customLuminance.lessThan(float(2 / 3)), customColor2Vec, customColor3Vec)), select(customLuminance.lessThan(float(0.25)), customColor1Vec, select(customLuminance.lessThan(float(0.5)), customColor2Vec, select(customLuminance.lessThan(float(0.75)), customColor3Vec, customColor4Vec)))));
333
+ bgColor = customBgVec;
334
+ emissiveColor = dotColor.mul(grid.coverage);
335
+ break;
336
+ default:
337
+ dotColor = grid.color;
338
+ bgColor = vec3(1, 1, 1);
339
+ break;
340
+ }
341
+ const baseColor = mix(bgColor, dotColor, grid.coverage);
342
+ if (!(this.colorMode === "custom" && this.bloomEnabled)) {
343
+ return vec4(baseColor, float(1));
344
+ }
345
+ const bloomInput = vec4(emissiveColor, float(1));
346
+ this.bloomNode = bloom(bloomInput, this.bloomIntensityUniform.value, this.normalizeBloomRadius(this.bloomRadiusUniform.value), this.bloomThresholdUniform.value);
347
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
348
+ return vec4(clamp(baseColor.add(this.getBloomTextureNode().rgb), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
349
+ }
350
+ buildCmykNode(pixCoord, renderTargetUv) {
351
+ const gcrAmount = this.gcrUniform;
352
+ const extractCyan = (sample) => {
353
+ const maxK = float(1).sub(max(max(float(sample.r), float(sample.g)), float(sample.b)));
354
+ const k = maxK.mul(gcrAmount);
355
+ const oneMinusK = max(float(1).sub(k), float(0.001));
356
+ return clamp(float(1).sub(float(sample.r)).sub(k).div(oneMinusK), float(0), float(1));
357
+ };
358
+ const extractMagenta = (sample) => {
359
+ const maxK = float(1).sub(max(max(float(sample.r), float(sample.g)), float(sample.b)));
360
+ const k = maxK.mul(gcrAmount);
361
+ const oneMinusK = max(float(1).sub(k), float(0.001));
362
+ return clamp(float(1).sub(float(sample.g)).sub(k).div(oneMinusK), float(0), float(1));
363
+ };
364
+ const extractYellow = (sample) => {
365
+ const maxK = float(1).sub(max(max(float(sample.r), float(sample.g)), float(sample.b)));
366
+ const k = maxK.mul(gcrAmount);
367
+ const oneMinusK = max(float(1).sub(k), float(0.001));
368
+ return clamp(float(1).sub(float(sample.b)).sub(k).div(oneMinusK), float(0), float(1));
369
+ };
370
+ const extractKey = (sample) => {
371
+ const maxK = float(1).sub(max(max(float(sample.r), float(sample.g)), float(sample.b)));
372
+ return maxK.mul(gcrAmount);
373
+ };
374
+ const reg = float(this.registrationUniform);
375
+ const cyanCoord = pixCoord.add(vec2(reg, float(0)));
376
+ const magentaCoord = pixCoord.add(vec2(reg.mul(-0.5), reg.mul(0.866)));
377
+ const yellowCoord = pixCoord.add(vec2(reg.mul(-0.5), reg.mul(-0.866)));
378
+ const cyanGrid = this.buildHalftoneGrid(cyanCoord, this.cyanAngleUniform, extractCyan);
379
+ const magentaGrid = this.buildHalftoneGrid(magentaCoord, this.magentaAngleUniform, extractMagenta);
380
+ const yellowGrid = this.buildHalftoneGrid(yellowCoord, this.yellowAngleUniform, extractYellow);
381
+ const keyGrid = this.buildHalftoneGrid(pixCoord, this.keyAngleUniform, extractKey);
382
+ const grain = grainTexturePattern(renderTargetUv.mul(screenSize));
383
+ const grainOffset = grain.sub(0.5).mul(this.paperGrainUniform);
384
+ const paperR = clamp(float(this.paperRedUniform).add(grainOffset), float(0), float(1));
385
+ const paperG = clamp(float(this.paperGreenUniform).add(grainOffset), float(0), float(1));
386
+ const paperB = clamp(float(this.paperBlueUniform).add(grainOffset), float(0), float(1));
387
+ const inkC = vec3(float(this.inkCyanUniform.x), float(this.inkCyanUniform.y), float(this.inkCyanUniform.z));
388
+ const inkM = vec3(float(this.inkMagentaUniform.x), float(this.inkMagentaUniform.y), float(this.inkMagentaUniform.z));
389
+ const inkY = vec3(float(this.inkYellowUniform.x), float(this.inkYellowUniform.y), float(this.inkYellowUniform.z));
390
+ const inkK = vec3(float(this.inkKeyUniform.x), float(this.inkKeyUniform.y), float(this.inkKeyUniform.z));
391
+ const transC = mix(vec3(1, 1, 1), inkC, cyanGrid.coverage);
392
+ const transM = mix(vec3(1, 1, 1), inkM, magentaGrid.coverage);
393
+ const transY = mix(vec3(1, 1, 1), inkY, yellowGrid.coverage);
394
+ const transK = mix(vec3(1, 1, 1), inkK, keyGrid.coverage);
395
+ const paper = vec3(paperR, paperG, paperB);
396
+ let finalColor;
397
+ if (this.cmykBlendMode === "overprint") {
398
+ finalColor = vec3(clamp(paper.x.mul(transC.x).mul(transM.x).mul(transY.x).mul(transK.x), float(0), float(1)), clamp(paper.y.mul(transC.y).mul(transM.y).mul(transY.y).mul(transK.y), float(0), float(1)), clamp(paper.z.mul(transC.z).mul(transM.z).mul(transY.z).mul(transK.z), float(0), float(1)));
399
+ }
400
+ else {
401
+ const layerC = vec3(paper.x.mul(transC.x), paper.y.mul(transC.y), paper.z.mul(transC.z));
402
+ const layerM = vec3(paper.x.mul(transM.x), paper.y.mul(transM.y), paper.z.mul(transM.z));
403
+ const layerY = vec3(paper.x.mul(transY.x), paper.y.mul(transY.y), paper.z.mul(transY.z));
404
+ const layerK = vec3(paper.x.mul(transK.x), paper.y.mul(transK.y), paper.z.mul(transK.z));
405
+ finalColor = vec3(clamp(min(min(layerC.x, layerM.x), min(layerY.x, layerK.x)), float(0), float(1)), clamp(min(min(layerC.y, layerM.y), min(layerY.y, layerK.y)), float(0), float(1)), clamp(min(min(layerC.z, layerM.z), min(layerY.z, layerK.z)), float(0), float(1)));
406
+ }
407
+ return vec4(finalColor, float(1));
408
+ }
409
+ buildHalftoneGrid(pixCoord, angleRadians, channelExtractor) {
410
+ const cosA = float(cos(angleRadians));
411
+ const sinA = float(sin(angleRadians));
412
+ const rotX = cosA.mul(pixCoord.x).add(sinA.mul(pixCoord.y));
413
+ const rotY = cosA.mul(pixCoord.y).sub(sinA.mul(pixCoord.x));
414
+ const ccrX = floor(float(rotX.div(this.spacingUniform)).add(0.5)).mul(this.spacingUniform);
415
+ const ccrY = floor(float(rotY.div(this.spacingUniform)).add(0.5)).mul(this.spacingUniform);
416
+ const aa = max(float(0.5), float(this.softnessUniform).mul(this.spacingUniform).mul(0.3));
417
+ let accCov = float(0);
418
+ let accR = float(0);
419
+ let accG = float(0);
420
+ let accB = float(0);
421
+ let accLuma = float(0);
422
+ let accField = float(0);
423
+ let accWeightR = float(0);
424
+ let accWeightG = float(0);
425
+ let accWeightB = float(0);
426
+ let accWeightLuma = float(0);
427
+ const morph = clamp(float(this.dotMorphUniform), float(0), float(1));
428
+ const fieldReach = this.spacingUniform.mul(morph).mul(0.6);
429
+ for (let dj = -1; dj <= 1; dj++) {
430
+ for (let di = -1; di <= 1; di++) {
431
+ const cellRX = di === 0 ? ccrX : float(ccrX.add(this.spacingUniform.mul(float(di))));
432
+ const cellRY = dj === 0 ? ccrY : float(ccrY.add(this.spacingUniform.mul(float(dj))));
433
+ const cellSX = cosA.mul(cellRX).sub(sinA.mul(cellRY));
434
+ const cellSY = sinA.mul(cellRX).add(cosA.mul(cellRY));
435
+ const cellUV = vec2(cellSX, cellSY).div(screenSize);
436
+ const sNode = tslTexture(new THREE.Texture(), cellUV);
437
+ this.sampleNodes.push(sNode);
438
+ const channelValue = channelExtractor(sNode);
439
+ const clampedValue = clamp(channelValue.mul(this.contrastUniform), float(0), float(1));
440
+ const effectiveValue = select(this.invertUniform.greaterThan(float(0.5)), float(1).sub(clampedValue), clampedValue);
441
+ const radius = float(this.dotMinUniform)
442
+ .add(effectiveValue.mul(this.dotSizeUniform))
443
+ .add(this.dotGainUniform)
444
+ .mul(this.spacingUniform)
445
+ .mul(0.5);
446
+ const dx = rotX.sub(cellRX);
447
+ const dy = rotY.sub(cellRY);
448
+ const dCircle = vec2(dx, dy).length();
449
+ const dSquare = max(abs(dx), abs(dy));
450
+ const dDiamond = abs(dx).add(abs(dy));
451
+ const dLine = abs(dy);
452
+ const dist = select(this.shapeUniform.lessThan(float(0.5)), dCircle, select(this.shapeUniform.lessThan(float(1.5)), dSquare, select(this.shapeUniform.lessThan(float(2.5)), dDiamond, dLine)));
453
+ const cellCov = smoothstep(radius.add(aa), radius.sub(aa), dist);
454
+ const isNew = cellCov.greaterThan(accCov);
455
+ const maxR = select(isNew, float(sNode.r), accR);
456
+ const maxG = select(isNew, float(sNode.g), accG);
457
+ const maxB = select(isNew, float(sNode.b), accB);
458
+ const maxLuma = select(isNew, effectiveValue, accLuma);
459
+ const maxCov = max(cellCov, accCov);
460
+ const fieldRadius = max(radius.add(fieldReach), float(0.001));
461
+ const cellField = clamp(float(1).sub(dist.div(fieldRadius)), float(0), float(1));
462
+ const cellFieldSq = cellField.mul(cellField);
463
+ accWeightR = accWeightR.add(float(sNode.r).mul(cellFieldSq));
464
+ accWeightG = accWeightG.add(float(sNode.g).mul(cellFieldSq));
465
+ accWeightB = accWeightB.add(float(sNode.b).mul(cellFieldSq));
466
+ accWeightLuma = accWeightLuma.add(effectiveValue.mul(cellFieldSq));
467
+ accField = accField.add(cellFieldSq);
468
+ accR = maxR;
469
+ accG = maxG;
470
+ accB = maxB;
471
+ accLuma = maxLuma;
472
+ accCov = maxCov;
473
+ }
474
+ }
475
+ const metaEdge = max(float(0.01), aa.div(this.spacingUniform).mul(0.5));
476
+ const metaCov = smoothstep(float(0.5).sub(metaEdge), float(0.5).add(metaEdge), accField);
477
+ const fieldWeight = max(accField, float(0.001));
478
+ const finalCov = mix(accCov, metaCov, morph);
479
+ const finalR = mix(accR, accWeightR.div(fieldWeight), morph);
480
+ const finalG = mix(accG, accWeightG.div(fieldWeight), morph);
481
+ const finalB = mix(accB, accWeightB.div(fieldWeight), morph);
482
+ const finalLuma = mix(accLuma, accWeightLuma.div(fieldWeight), morph);
483
+ return {
484
+ color: vec3(finalR, finalG, finalB),
485
+ coverage: finalCov,
486
+ luma: finalLuma,
487
+ };
488
+ }
489
+ normalizeBloomRadius(value) {
490
+ return clamp01(value / 24);
491
+ }
492
+ normalizeBloomSoftness(value) {
493
+ return Math.max(0.001, value * 0.25);
494
+ }
495
+ disposeBloomNode() {
496
+ ;
497
+ this.bloomNode?.dispose?.();
498
+ }
499
+ getBloomTextureNode() {
500
+ const bloomNode = this.bloomNode;
501
+ if (!bloomNode) {
502
+ throw new Error("Bloom node is not initialized");
503
+ }
504
+ if ("getTextureNode" in bloomNode &&
505
+ typeof bloomNode.getTextureNode === "function") {
506
+ return bloomNode.getTextureNode();
507
+ }
508
+ if ("getTexture" in bloomNode &&
509
+ typeof bloomNode.getTexture === "function") {
510
+ return bloomNode.getTexture();
511
+ }
512
+ throw new Error("Bloom node does not expose a texture getter");
513
+ }
514
+ }
515
+ function parseColorMode(value) {
516
+ if (value === "source" ||
517
+ value === "monochrome" ||
518
+ value === "duotone" ||
519
+ value === "custom" ||
520
+ value === "cmyk") {
521
+ return value;
522
+ }
523
+ return "source";
524
+ }
525
+ function parseCmykBlend(value) {
526
+ if (value === "subtractive" || value === "overprint") {
527
+ return value;
528
+ }
529
+ return "subtractive";
530
+ }
@@ -0,0 +1,84 @@
1
+ import { type TSLNode } from "three/tsl";
2
+ import * as THREE from "three/webgpu";
3
+ import type { LayerParameterValues } from "../types/editor";
4
+ import { PassNode } from "./pass-node";
5
+ type Node = TSLNode;
6
+ export declare class InkPass extends PassNode {
7
+ private readonly blurScene;
8
+ private readonly compositeScene;
9
+ private readonly copyScene;
10
+ private readonly orthoCamera;
11
+ private readonly blurMaterial;
12
+ private readonly compositeMaterial;
13
+ private readonly copyMaterial;
14
+ private readonly blurInputNode;
15
+ private readonly crispInputNode;
16
+ private readonly finalInputNode;
17
+ private readonly copyInputNode;
18
+ private readonly noiseInputNode;
19
+ private blurSampleNodes;
20
+ private compositeBlurNodes;
21
+ private noiseSampleNodes;
22
+ private bloomEnabled;
23
+ private bloomNode;
24
+ private readonly bloomIntensityUniform;
25
+ private readonly bloomRadiusUniform;
26
+ private readonly bloomSoftnessUniform;
27
+ private readonly bloomThresholdUniform;
28
+ private readonly backgroundColorUniform;
29
+ private readonly coreColorUniform;
30
+ private readonly edgeColorUniform;
31
+ private readonly midColorUniform;
32
+ private readonly blurStrengthUniform;
33
+ private readonly crispBlendUniform;
34
+ private readonly directionXUniform;
35
+ private readonly directionYUniform;
36
+ private readonly dripLengthUniform;
37
+ private readonly dripWeightUniform;
38
+ private readonly fluidNoiseUniform;
39
+ private readonly grainEnabledUniform;
40
+ private readonly grainIntensityUniform;
41
+ private readonly grainScaleUniform;
42
+ private readonly blurSpreadUniform;
43
+ private readonly noiseScaleUniform;
44
+ private readonly passIndexUniform;
45
+ private readonly resolutionWidthUniform;
46
+ private readonly resolutionHeightUniform;
47
+ private readonly smokeSpeedUniform;
48
+ private readonly smokeTurbulenceUniform;
49
+ private readonly timeUniform;
50
+ private blurPassCount;
51
+ private crispPassCount;
52
+ private compositeTarget;
53
+ private crispTarget;
54
+ private readTarget;
55
+ private writeTarget;
56
+ private readonly placeholder;
57
+ private noiseTexture;
58
+ private noiseLoadStarted;
59
+ private needsRefresh;
60
+ private width;
61
+ private height;
62
+ private isAnimated;
63
+ constructor(layerId: string);
64
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
65
+ protected beforeRender(time: number): void;
66
+ needsContinuousRender(): boolean;
67
+ updateParams(params: LayerParameterValues): void;
68
+ resize(width: number, height: number): void;
69
+ dispose(): void;
70
+ protected buildEffectNode(): Node;
71
+ private buildBlurNode;
72
+ private buildCompositeNode;
73
+ private applyColorGradient;
74
+ private ensureNoiseTexture;
75
+ private trackBlurSampleNode;
76
+ private trackCompositeBlurNode;
77
+ private trackNoiseSampleNode;
78
+ private setColorUniform;
79
+ private normalizeBloomRadius;
80
+ private normalizeBloomSoftness;
81
+ private disposeBloomNode;
82
+ private getBloomTextureNode;
83
+ }
84
+ export {};