@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,526 @@
1
+ import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
2
+ import { clamp, float, max, mix, pow, select, sin, smoothstep, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
3
+ import * as THREE from "three/webgpu";
4
+ import { loadImageTexture } from "./media-texture.js";
5
+ import { PassNode } from "./pass-node.js";
6
+ import { grainTexturePattern } from "./shaders/tsl/patterns/grain-texture-pattern.js";
7
+ const BLUE_NOISE_TEXTURE_URL = new URL("../../../assets/textures/blue-noise.png", import.meta.url).toString();
8
+ const INTERNAL_TARGET_OPTIONS = {
9
+ depthBuffer: false,
10
+ format: THREE.RGBAFormat,
11
+ generateMipmaps: false,
12
+ magFilter: THREE.LinearFilter,
13
+ minFilter: THREE.LinearFilter,
14
+ stencilBuffer: false,
15
+ type: THREE.HalfFloatType,
16
+ };
17
+ function clamp01(value) {
18
+ return Math.max(0, Math.min(1, value));
19
+ }
20
+ function hexToRgb(hex) {
21
+ const normalized = hex.trim().replace("#", "");
22
+ const value = normalized.length === 3
23
+ ? normalized
24
+ .split("")
25
+ .map((entry) => `${entry}${entry}`)
26
+ .join("")
27
+ : normalized.padEnd(6, "0").slice(0, 6);
28
+ return [
29
+ Number.parseInt(value.slice(0, 2), 16) / 255,
30
+ Number.parseInt(value.slice(2, 4), 16) / 255,
31
+ Number.parseInt(value.slice(4, 6), 16) / 255,
32
+ ];
33
+ }
34
+ export class InkPass extends PassNode {
35
+ blurScene;
36
+ compositeScene;
37
+ copyScene;
38
+ orthoCamera;
39
+ blurMaterial;
40
+ compositeMaterial;
41
+ copyMaterial;
42
+ blurInputNode;
43
+ crispInputNode;
44
+ finalInputNode;
45
+ copyInputNode;
46
+ noiseInputNode;
47
+ blurSampleNodes = [];
48
+ compositeBlurNodes = [];
49
+ noiseSampleNodes = [];
50
+ bloomEnabled = false;
51
+ bloomNode = null;
52
+ bloomIntensityUniform;
53
+ bloomRadiusUniform;
54
+ bloomSoftnessUniform;
55
+ bloomThresholdUniform;
56
+ backgroundColorUniform;
57
+ coreColorUniform;
58
+ edgeColorUniform;
59
+ midColorUniform;
60
+ blurStrengthUniform;
61
+ crispBlendUniform;
62
+ directionXUniform;
63
+ directionYUniform;
64
+ dripLengthUniform;
65
+ dripWeightUniform;
66
+ fluidNoiseUniform;
67
+ grainEnabledUniform;
68
+ grainIntensityUniform;
69
+ grainScaleUniform;
70
+ blurSpreadUniform;
71
+ noiseScaleUniform;
72
+ passIndexUniform;
73
+ resolutionWidthUniform;
74
+ resolutionHeightUniform;
75
+ smokeSpeedUniform;
76
+ smokeTurbulenceUniform;
77
+ timeUniform;
78
+ blurPassCount = 12;
79
+ crispPassCount = 3;
80
+ compositeTarget;
81
+ crispTarget;
82
+ readTarget;
83
+ writeTarget;
84
+ placeholder;
85
+ noiseTexture = null;
86
+ noiseLoadStarted = false;
87
+ needsRefresh = true;
88
+ width = 1;
89
+ height = 1;
90
+ isAnimated = true;
91
+ constructor(layerId) {
92
+ super(layerId);
93
+ this.orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
94
+ this.blurScene = new THREE.Scene();
95
+ this.compositeScene = new THREE.Scene();
96
+ this.copyScene = new THREE.Scene();
97
+ this.placeholder = new THREE.Texture();
98
+ const flippedUv = vec2(uv().x, float(1).sub(uv().y));
99
+ this.blurInputNode = tslTexture(this.placeholder, flippedUv);
100
+ this.crispInputNode = tslTexture(this.placeholder, flippedUv);
101
+ this.finalInputNode = tslTexture(this.placeholder, flippedUv);
102
+ this.copyInputNode = tslTexture(this.placeholder, flippedUv);
103
+ this.noiseInputNode = tslTexture(this.placeholder, flippedUv);
104
+ this.bloomIntensityUniform = uniform(1.25);
105
+ this.bloomRadiusUniform = uniform(6);
106
+ this.bloomSoftnessUniform = uniform(0.35);
107
+ this.bloomThresholdUniform = uniform(0.6);
108
+ this.backgroundColorUniform = uniform(new THREE.Vector3(0.039, 0.043, 0.051));
109
+ this.coreColorUniform = uniform(new THREE.Vector3(1.0, 0.992, 0.91));
110
+ this.midColorUniform = uniform(new THREE.Vector3(0.784, 0.961, 0.259));
111
+ this.edgeColorUniform = uniform(new THREE.Vector3(0.0, 0.788, 0.655));
112
+ this.blurStrengthUniform = uniform(0.02);
113
+ this.crispBlendUniform = uniform(0.75);
114
+ this.directionXUniform = uniform(0.3746);
115
+ this.directionYUniform = uniform(0.9271);
116
+ this.dripLengthUniform = uniform(7.1);
117
+ this.dripWeightUniform = uniform(1.2);
118
+ this.fluidNoiseUniform = uniform(0.2);
119
+ this.grainEnabledUniform = uniform(1);
120
+ this.grainIntensityUniform = uniform(0.3);
121
+ this.grainScaleUniform = uniform(1.5);
122
+ this.blurSpreadUniform = uniform(1.7);
123
+ this.noiseScaleUniform = uniform(1);
124
+ this.passIndexUniform = uniform(0);
125
+ this.resolutionWidthUniform = uniform(1);
126
+ this.resolutionHeightUniform = uniform(1);
127
+ this.smokeSpeedUniform = uniform(0.2);
128
+ this.smokeTurbulenceUniform = uniform(0.25);
129
+ this.timeUniform = uniform(0);
130
+ this.readTarget = new THREE.WebGLRenderTarget(1, 1, INTERNAL_TARGET_OPTIONS);
131
+ this.writeTarget = new THREE.WebGLRenderTarget(1, 1, INTERNAL_TARGET_OPTIONS);
132
+ this.crispTarget = new THREE.WebGLRenderTarget(1, 1, INTERNAL_TARGET_OPTIONS);
133
+ this.compositeTarget = new THREE.WebGLRenderTarget(1, 1, INTERNAL_TARGET_OPTIONS);
134
+ this.blurMaterial = new THREE.MeshBasicNodeMaterial();
135
+ this.blurMaterial.colorNode = this.buildBlurNode();
136
+ const blurMesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.blurMaterial);
137
+ blurMesh.frustumCulled = false;
138
+ this.blurScene.add(blurMesh);
139
+ this.copyMaterial = new THREE.MeshBasicNodeMaterial();
140
+ this.copyMaterial.colorNode = vec4(this.copyInputNode.rgb, float(1));
141
+ const copyMesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.copyMaterial);
142
+ copyMesh.frustumCulled = false;
143
+ this.copyScene.add(copyMesh);
144
+ this.compositeMaterial = new THREE.MeshBasicNodeMaterial();
145
+ this.compositeMaterial.colorNode = this.buildCompositeNode();
146
+ const compositeMesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.compositeMaterial);
147
+ compositeMesh.frustumCulled = false;
148
+ this.compositeScene.add(compositeMesh);
149
+ this.rebuildEffectNode();
150
+ }
151
+ render(renderer, inputTexture, outputTarget, time, delta) {
152
+ this.ensureNoiseTexture();
153
+ this.blurInputNode.value = inputTexture;
154
+ this.noiseInputNode.value = this.noiseTexture ?? this.placeholder;
155
+ for (const node of this.blurSampleNodes) {
156
+ node.value = inputTexture;
157
+ }
158
+ for (const node of this.noiseSampleNodes) {
159
+ node.value = this.noiseTexture ?? this.placeholder;
160
+ }
161
+ this.passIndexUniform.value = 0;
162
+ renderer.setRenderTarget(this.readTarget);
163
+ renderer.render(this.blurScene, this.orthoCamera);
164
+ if (this.crispPassCount <= 1) {
165
+ this.copyInputNode.value = this.readTarget.texture;
166
+ renderer.setRenderTarget(this.crispTarget);
167
+ renderer.render(this.copyScene, this.orthoCamera);
168
+ }
169
+ const totalPasses = Math.max(this.blurPassCount, this.crispPassCount);
170
+ let readTarget = this.readTarget;
171
+ let writeTarget = this.writeTarget;
172
+ for (let passIndex = 1; passIndex < totalPasses; passIndex += 1) {
173
+ this.blurInputNode.value = readTarget.texture;
174
+ for (const node of this.blurSampleNodes) {
175
+ node.value = readTarget.texture;
176
+ }
177
+ this.passIndexUniform.value = passIndex;
178
+ renderer.setRenderTarget(writeTarget);
179
+ renderer.render(this.blurScene, this.orthoCamera);
180
+ if (passIndex === this.crispPassCount - 1) {
181
+ this.copyInputNode.value = writeTarget.texture;
182
+ renderer.setRenderTarget(this.crispTarget);
183
+ renderer.render(this.copyScene, this.orthoCamera);
184
+ }
185
+ const temp = readTarget;
186
+ readTarget = writeTarget;
187
+ writeTarget = temp;
188
+ }
189
+ this.finalInputNode.value = readTarget.texture;
190
+ this.crispInputNode.value = this.crispTarget.texture;
191
+ for (const node of this.compositeBlurNodes) {
192
+ node.value = readTarget.texture;
193
+ }
194
+ renderer.setRenderTarget(this.compositeTarget);
195
+ renderer.render(this.compositeScene, this.orthoCamera);
196
+ this.finalInputNode.value = this.compositeTarget.texture;
197
+ super.render(renderer, inputTexture, outputTarget, time, delta);
198
+ this.needsRefresh = false;
199
+ }
200
+ beforeRender(time) {
201
+ this.timeUniform.value = time;
202
+ }
203
+ needsContinuousRender() {
204
+ return this.isAnimated || this.needsRefresh;
205
+ }
206
+ updateParams(params) {
207
+ const angle = ((typeof params.blurDirection === "number" ? params.blurDirection : 68) *
208
+ Math.PI) /
209
+ 180;
210
+ this.directionXUniform.value = Math.cos(angle);
211
+ this.directionYUniform.value = Math.sin(angle);
212
+ this.blurPassCount =
213
+ typeof params.blurPasses === "number"
214
+ ? Math.max(1, Math.round(params.blurPasses))
215
+ : 12;
216
+ this.crispPassCount =
217
+ typeof params.crispPasses === "number"
218
+ ? Math.max(1, Math.round(params.crispPasses))
219
+ : 3;
220
+ this.blurStrengthUniform.value =
221
+ typeof params.blurStrength === "number"
222
+ ? Math.max(0.001, params.blurStrength)
223
+ : 0.02;
224
+ this.crispBlendUniform.value =
225
+ typeof params.crispBlend === "number" ? clamp01(params.crispBlend) : 0.75;
226
+ this.dripLengthUniform.value =
227
+ typeof params.dripLength === "number"
228
+ ? Math.max(1, params.dripLength)
229
+ : 7.1;
230
+ this.dripWeightUniform.value =
231
+ typeof params.dripWeight === "number"
232
+ ? Math.max(0.2, params.dripWeight)
233
+ : 1.2;
234
+ this.fluidNoiseUniform.value =
235
+ typeof params.fluidNoise === "number"
236
+ ? Math.max(0, params.fluidNoise)
237
+ : 0.2;
238
+ this.noiseScaleUniform.value =
239
+ typeof params.noiseScale === "number"
240
+ ? Math.max(0.5, params.noiseScale)
241
+ : 1;
242
+ this.smokeSpeedUniform.value =
243
+ typeof params.smokeSpeed === "number"
244
+ ? Math.max(0, params.smokeSpeed)
245
+ : 0.2;
246
+ this.smokeTurbulenceUniform.value =
247
+ typeof params.smokeTurbulence === "number"
248
+ ? Math.max(0, params.smokeTurbulence)
249
+ : 0.25;
250
+ this.blurSpreadUniform.value =
251
+ typeof params.blurSpread === "number"
252
+ ? Math.max(0.5, params.blurSpread)
253
+ : 1.7;
254
+ this.grainEnabledUniform.value = params.grainEnabled === false ? 0 : 1;
255
+ this.grainIntensityUniform.value =
256
+ typeof params.grainIntensity === "number"
257
+ ? clamp01(params.grainIntensity)
258
+ : 0.3;
259
+ this.grainScaleUniform.value =
260
+ typeof params.grainScale === "number"
261
+ ? Math.max(0.5, params.grainScale)
262
+ : 1.5;
263
+ this.setColorUniform(this.backgroundColorUniform, typeof params.backgroundColor === "string"
264
+ ? params.backgroundColor
265
+ : "#0a0b0d");
266
+ this.setColorUniform(this.coreColorUniform, typeof params.coreColor === "string" ? params.coreColor : "#fffde8");
267
+ this.setColorUniform(this.midColorUniform, typeof params.midColor === "string" ? params.midColor : "#c8f542");
268
+ this.setColorUniform(this.edgeColorUniform, typeof params.edgeColor === "string" ? params.edgeColor : "#00c9a7");
269
+ const nextBloomEnabled = params.bloomEnabled === true;
270
+ const nextBloomIntensity = typeof params.bloomIntensity === "number"
271
+ ? Math.max(0, params.bloomIntensity)
272
+ : 1.25;
273
+ const nextBloomThreshold = typeof params.bloomThreshold === "number"
274
+ ? clamp01(params.bloomThreshold)
275
+ : 0.6;
276
+ const nextBloomRadius = typeof params.bloomRadius === "number"
277
+ ? Math.max(0, params.bloomRadius)
278
+ : 6;
279
+ const nextBloomSoftness = typeof params.bloomSoftness === "number"
280
+ ? clamp01(params.bloomSoftness)
281
+ : 0.35;
282
+ this.bloomIntensityUniform.value = nextBloomIntensity;
283
+ this.bloomRadiusUniform.value = nextBloomRadius;
284
+ this.bloomSoftnessUniform.value = nextBloomSoftness;
285
+ this.bloomThresholdUniform.value = nextBloomThreshold;
286
+ if (nextBloomEnabled !== this.bloomEnabled) {
287
+ this.bloomEnabled = nextBloomEnabled;
288
+ this.rebuildEffectNode();
289
+ }
290
+ else if (this.bloomNode) {
291
+ this.bloomNode.strength.value = nextBloomIntensity;
292
+ this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius);
293
+ this.bloomNode.threshold.value = nextBloomThreshold;
294
+ this.bloomNode.smoothWidth.value =
295
+ this.normalizeBloomSoftness(nextBloomSoftness);
296
+ }
297
+ this.isAnimated = this.smokeSpeedUniform.value > 0;
298
+ this.needsRefresh = true;
299
+ }
300
+ resize(width, height) {
301
+ this.width = Math.max(1, width);
302
+ this.height = Math.max(1, height);
303
+ this.resolutionWidthUniform.value = this.width;
304
+ this.resolutionHeightUniform.value = this.height;
305
+ this.readTarget.setSize(this.width, this.height);
306
+ this.writeTarget.setSize(this.width, this.height);
307
+ this.crispTarget.setSize(this.width, this.height);
308
+ this.compositeTarget.setSize(this.width, this.height);
309
+ this.needsRefresh = true;
310
+ }
311
+ dispose() {
312
+ this.disposeBloomNode();
313
+ this.noiseTexture?.dispose();
314
+ this.readTarget?.dispose();
315
+ this.writeTarget?.dispose();
316
+ this.crispTarget?.dispose();
317
+ this.compositeTarget?.dispose();
318
+ this.blurMaterial?.dispose();
319
+ this.copyMaterial?.dispose();
320
+ this.compositeMaterial?.dispose();
321
+ this.placeholder.dispose();
322
+ super.dispose();
323
+ }
324
+ buildEffectNode() {
325
+ if (!this.finalInputNode) {
326
+ return vec4(float(0), float(0), float(0), float(1));
327
+ }
328
+ this.disposeBloomNode();
329
+ this.bloomNode = null;
330
+ const baseColor = vec3(this.finalInputNode.r, this.finalInputNode.g, this.finalInputNode.b);
331
+ if (!this.bloomEnabled) {
332
+ return vec4(baseColor, float(1));
333
+ }
334
+ this.bloomNode = bloom(vec4(baseColor, float(1)), this.bloomIntensityUniform.value, this.normalizeBloomRadius(this.bloomRadiusUniform.value), this.bloomThresholdUniform.value);
335
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
336
+ return vec4(clamp(baseColor.add(this.getBloomTextureNode().rgb), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
337
+ }
338
+ buildBlurNode() {
339
+ this.blurSampleNodes = [];
340
+ this.noiseSampleNodes = [];
341
+ const texUv = vec2(uv().x, float(1).sub(uv().y));
342
+ const texelSize = vec2(float(1).div(this.resolutionWidthUniform), float(1).div(this.resolutionHeightUniform));
343
+ const original = this.blurInputNode;
344
+ const originalIntensity = max(max(original.r, original.g), original.b);
345
+ const rotatedUv = vec2(texUv.x
346
+ .mul(float(Math.cos(0.7854)))
347
+ .sub(texUv.y.mul(float(Math.sin(0.7854)))), texUv.x
348
+ .mul(float(Math.sin(0.7854)))
349
+ .add(texUv.y.mul(float(Math.cos(0.7854)))));
350
+ const timeOffset1 = vec2(this.timeUniform.mul(this.smokeSpeedUniform).mul(0.3), this.timeUniform.mul(this.smokeSpeedUniform).mul(0.15));
351
+ const timeOffset2 = vec2(sin(this.timeUniform.mul(this.smokeSpeedUniform).mul(0.7)).mul(0.1), sin(this.timeUniform
352
+ .mul(this.smokeSpeedUniform)
353
+ .mul(0.5)
354
+ .add(float(1.5707963))).mul(0.08));
355
+ const noiseUv1 = texUv
356
+ .mul(this.noiseScaleUniform)
357
+ .add(vec2(this.passIndexUniform.mul(0.1), this.passIndexUniform.mul(0.1)))
358
+ .add(timeOffset1);
359
+ const noiseUv2 = rotatedUv
360
+ .mul(this.noiseScaleUniform)
361
+ .mul(0.8)
362
+ .add(vec2(this.passIndexUniform.mul(0.15), this.passIndexUniform.mul(0.15)))
363
+ .add(timeOffset1.mul(1.2));
364
+ const turbulenceUv = rotatedUv
365
+ .mul(this.noiseScaleUniform)
366
+ .mul(0.6)
367
+ .add(timeOffset2.mul(2));
368
+ const noiseSample1 = this.trackNoiseSampleNode(noiseUv1);
369
+ const noiseSample2 = this.trackNoiseSampleNode(noiseUv2);
370
+ const turbulenceSample = this.trackNoiseSampleNode(turbulenceUv);
371
+ const noiseSample = mix(noiseSample1.rgb, noiseSample2.rgb, float(0.5));
372
+ const noiseX = noiseSample.r
373
+ .sub(0.5)
374
+ .mul(2)
375
+ .mul(this.fluidNoiseUniform)
376
+ .add(turbulenceSample.r.sub(0.5).mul(this.smokeTurbulenceUniform));
377
+ const noiseY = noiseSample.g
378
+ .sub(0.5)
379
+ .mul(2)
380
+ .mul(this.fluidNoiseUniform)
381
+ .mul(0.4)
382
+ .add(turbulenceSample.g.sub(0.5).mul(this.smokeTurbulenceUniform).mul(0.5));
383
+ const flowDir = vec2(this.directionXUniform.add(noiseX), this.directionYUniform.add(noiseY)).normalize();
384
+ const baseNoise = noiseSample.b
385
+ .sub(0.5)
386
+ .mul(0.03)
387
+ .mul(this.fluidNoiseUniform);
388
+ let result = vec4(float(0), float(0), float(0), float(0));
389
+ let totalWeight = float(0);
390
+ for (let sampleIndex = 0; sampleIndex < 10; sampleIndex += 1) {
391
+ const t = float(sampleIndex / 9);
392
+ const asymmetry = smoothstep(float(0), float(1), t).mul(t).add(t.mul(0.5));
393
+ const sampleDist = asymmetry
394
+ .mul(this.dripLengthUniform)
395
+ .mul(this.blurStrengthUniform)
396
+ .mul(float(1).add(this.passIndexUniform.mul(this.blurSpreadUniform).mul(0.15)));
397
+ const sampleNoise = baseNoise.mul(float(1 + sampleIndex * 0.1));
398
+ const disperseTurbulence = sampleNoise
399
+ .mul(t)
400
+ .mul(this.smokeTurbulenceUniform);
401
+ const samplePos = texUv
402
+ .add(flowDir.mul(sampleDist).mul(texelSize).mul(100))
403
+ .add(vec2(sampleNoise.add(disperseTurbulence), sampleNoise.add(disperseTurbulence).mul(0.3)));
404
+ const weight = mix(float(1).sub(t), float(1), smoothstep(float(0.35), float(0), t));
405
+ const sample = this.trackBlurSampleNode(samplePos);
406
+ result = result.add(sample.mul(weight));
407
+ totalWeight = totalWeight.add(weight);
408
+ }
409
+ for (let sampleIndex = 1; sampleIndex <= 2; sampleIndex += 1) {
410
+ const t = float(sampleIndex / 3);
411
+ const sampleDist = t
412
+ .mul(this.dripLengthUniform)
413
+ .mul(this.blurStrengthUniform)
414
+ .mul(0.2);
415
+ const samplePos = texUv.sub(flowDir.mul(sampleDist).mul(texelSize).mul(100));
416
+ const weight = float(1).sub(t).mul(0.4);
417
+ const sample = this.trackBlurSampleNode(samplePos);
418
+ result = result.add(sample.mul(weight));
419
+ totalWeight = totalWeight.add(weight);
420
+ }
421
+ const blurred = result.div(max(totalWeight, float(0.0001)));
422
+ const lifted = max(blurred, original);
423
+ return vec4(mix(blurred.rgb, lifted.rgb, originalIntensity.mul(0.5)), float(1));
424
+ }
425
+ buildCompositeNode() {
426
+ this.compositeBlurNodes = [];
427
+ const texUv = vec2(uv().x, float(1).sub(uv().y));
428
+ const blurSample = this.finalInputNode;
429
+ const crispSample = this.crispInputNode;
430
+ const blurIntensity = max(max(blurSample.r, blurSample.g), blurSample.b);
431
+ const crispIntensity = max(max(crispSample.r, crispSample.g), crispSample.b);
432
+ const texelSize = vec2(float(1).div(this.resolutionWidthUniform), float(1).div(this.resolutionHeightUniform));
433
+ const blurR = this.trackCompositeBlurNode(texUv.add(vec2(texelSize.x.mul(2), texelSize.y))).r;
434
+ const blurB = this.trackCompositeBlurNode(texUv.sub(vec2(texelSize.x.mul(2), texelSize.y))).b;
435
+ const backgroundColor = vec3(float(this.backgroundColorUniform.x), float(this.backgroundColorUniform.y), float(this.backgroundColorUniform.z));
436
+ const edgeColor = vec3(float(this.edgeColorUniform.x), float(this.edgeColorUniform.y), float(this.edgeColorUniform.z));
437
+ const midColor = vec3(float(this.midColorUniform.x), float(this.midColorUniform.y), float(this.midColorUniform.z));
438
+ const coreColor = vec3(float(this.coreColorUniform.x), float(this.coreColorUniform.y), float(this.coreColorUniform.z));
439
+ const fluidColor = this.applyColorGradient(blurIntensity, backgroundColor, edgeColor, midColor, coreColor);
440
+ const crispColor = this.applyColorGradient(crispIntensity, backgroundColor, edgeColor, midColor, coreColor);
441
+ const fluidColorChroma = vec3(mix(fluidColor.x, fluidColor.x.mul(1.1), blurR.mul(0.3)), fluidColor.y, mix(fluidColor.z, fluidColor.z.mul(1.15), blurB.mul(0.3)));
442
+ const fluidMask = pow(clamp(blurIntensity, float(0), float(1)), float(1.2));
443
+ const crispMask = pow(clamp(crispIntensity, float(0), float(1)), float(0.96));
444
+ const fluidGlow = fluidColorChroma.mul(fluidMask).mul(1.8);
445
+ const crispGlow = crispColor.mul(crispMask).mul(1.95);
446
+ const crispWeight = crispMask.mul(this.crispBlendUniform);
447
+ let combined = mix(fluidGlow, crispGlow, crispWeight).add(fluidGlow.mul(0.15));
448
+ const grain = grainTexturePattern(texUv.mul(vec2(this.grainScaleUniform, this.grainScaleUniform)))
449
+ .sub(0.5)
450
+ .mul(this.grainIntensityUniform);
451
+ combined = select(this.grainEnabledUniform.greaterThan(float(0.5)), combined.add(vec3(grain, grain, grain)), combined);
452
+ const alpha = max(fluidMask, crispMask);
453
+ let finalColor = mix(backgroundColor, combined, smoothstep(float(0.01), float(0.85), alpha));
454
+ const vignetteUv = texUv.mul(2).sub(vec2(1, 1));
455
+ finalColor = finalColor.mul(float(1).sub(vignetteUv.dot(vignetteUv).mul(0.15)));
456
+ return vec4(clamp(finalColor, vec3(0, 0, 0), vec3(1, 1, 1)), float(1));
457
+ }
458
+ applyColorGradient(intensity, bgColor, edgeColor, midColor, coreColor) {
459
+ const t1 = smoothstep(float(0.6), float(0.95), intensity);
460
+ const t2 = smoothstep(float(0.2), float(0.65), intensity);
461
+ const t3 = smoothstep(float(0), float(0.25), intensity);
462
+ const edgeMixed = mix(bgColor, edgeColor, t3);
463
+ const midMixed = mix(edgeMixed, midColor, t2);
464
+ return mix(midMixed, coreColor, t1);
465
+ }
466
+ ensureNoiseTexture() {
467
+ if (this.noiseTexture || this.noiseLoadStarted) {
468
+ return;
469
+ }
470
+ this.noiseLoadStarted = true;
471
+ void loadImageTexture(BLUE_NOISE_TEXTURE_URL)
472
+ .then((texture) => {
473
+ texture.wrapS = THREE.RepeatWrapping;
474
+ texture.wrapT = THREE.RepeatWrapping;
475
+ this.noiseTexture = texture;
476
+ this.needsRefresh = true;
477
+ })
478
+ .catch(() => {
479
+ this.needsRefresh = true;
480
+ });
481
+ }
482
+ trackBlurSampleNode(sampleUv) {
483
+ const sampleNode = tslTexture(this.placeholder, sampleUv);
484
+ this.blurSampleNodes.push(sampleNode);
485
+ return sampleNode;
486
+ }
487
+ trackCompositeBlurNode(sampleUv) {
488
+ const sampleNode = tslTexture(this.placeholder, sampleUv);
489
+ this.compositeBlurNodes.push(sampleNode);
490
+ return sampleNode;
491
+ }
492
+ trackNoiseSampleNode(sampleUv) {
493
+ const sampleNode = tslTexture(this.placeholder, sampleUv);
494
+ this.noiseSampleNodes.push(sampleNode);
495
+ return sampleNode;
496
+ }
497
+ setColorUniform(target, value) {
498
+ const [r, g, b] = hexToRgb(value);
499
+ target.value.set(r, g, b);
500
+ }
501
+ normalizeBloomRadius(value) {
502
+ return clamp01(value / 24);
503
+ }
504
+ normalizeBloomSoftness(value) {
505
+ return Math.max(0.001, value * 0.25);
506
+ }
507
+ disposeBloomNode() {
508
+ ;
509
+ this.bloomNode?.dispose?.();
510
+ }
511
+ getBloomTextureNode() {
512
+ const bloomNode = this.bloomNode;
513
+ if (!bloomNode) {
514
+ throw new Error("Bloom node is not initialized");
515
+ }
516
+ if ("getTextureNode" in bloomNode &&
517
+ typeof bloomNode.getTextureNode === "function") {
518
+ return bloomNode.getTextureNode();
519
+ }
520
+ if ("getTexture" in bloomNode &&
521
+ typeof bloomNode.getTexture === "function") {
522
+ return bloomNode.getTexture();
523
+ }
524
+ throw new Error("Bloom node does not expose a texture getter");
525
+ }
526
+ }
@@ -0,0 +1,31 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { type TSLNode } from "three/tsl";
3
+ import { PassNode } from "./pass-node";
4
+ import type { LayerParameterValues } from "../types/editor";
5
+ type Node = TSLNode;
6
+ export declare class LivePass extends PassNode {
7
+ private readonly canvasAspectUniform;
8
+ private readonly fitModeUniform;
9
+ private readonly mirrorUniform;
10
+ private readonly offsetXUniform;
11
+ private readonly offsetYUniform;
12
+ private readonly scaleUniform;
13
+ private readonly textureAspectUniform;
14
+ private mediaTextureNode;
15
+ private readonly placeholder;
16
+ private videoElement;
17
+ private videoTexture;
18
+ private stream;
19
+ private activeFacingMode;
20
+ constructor(layerId: string);
21
+ startCamera(facingMode: string): Promise<void>;
22
+ getFacingMode(): string;
23
+ private stopCamera;
24
+ updateParams(params: LayerParameterValues): void;
25
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
26
+ resize(width: number, height: number): void;
27
+ needsContinuousRender(): boolean;
28
+ dispose(): void;
29
+ protected buildEffectNode(): Node;
30
+ }
31
+ export {};
@@ -0,0 +1,136 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { clamp, float, max, mix, select, texture as tslTexture, uniform, uv, vec2, vec4, } from "three/tsl";
3
+ import { PassNode } from "./pass-node.js";
4
+ export class LivePass extends PassNode {
5
+ canvasAspectUniform;
6
+ fitModeUniform;
7
+ mirrorUniform;
8
+ offsetXUniform;
9
+ offsetYUniform;
10
+ scaleUniform;
11
+ textureAspectUniform;
12
+ mediaTextureNode;
13
+ placeholder;
14
+ videoElement = null;
15
+ videoTexture = null;
16
+ stream = null;
17
+ activeFacingMode = null;
18
+ constructor(layerId) {
19
+ super(layerId);
20
+ this.placeholder = new THREE.Texture();
21
+ this.canvasAspectUniform = uniform(1);
22
+ this.fitModeUniform = uniform(0);
23
+ this.mirrorUniform = uniform(1);
24
+ this.offsetXUniform = uniform(0);
25
+ this.offsetYUniform = uniform(0);
26
+ this.scaleUniform = uniform(1);
27
+ this.textureAspectUniform = uniform(1);
28
+ this.mediaTextureNode = tslTexture(this.placeholder, uv());
29
+ this.rebuildEffectNode();
30
+ }
31
+ async startCamera(facingMode) {
32
+ if (this.activeFacingMode === facingMode && this.videoTexture) {
33
+ return;
34
+ }
35
+ this.stopCamera();
36
+ this.activeFacingMode = facingMode;
37
+ const stream = await navigator.mediaDevices.getUserMedia({
38
+ video: {
39
+ facingMode,
40
+ width: { ideal: 1920 },
41
+ height: { ideal: 1080 },
42
+ },
43
+ audio: false,
44
+ });
45
+ this.stream = stream;
46
+ const video = document.createElement("video");
47
+ video.srcObject = stream;
48
+ video.muted = true;
49
+ video.playsInline = true;
50
+ await new Promise((resolve, reject) => {
51
+ video.addEventListener("playing", () => resolve(), { once: true });
52
+ video.addEventListener("error", () => reject(new Error("Failed to start camera")), { once: true });
53
+ video.play().catch(reject);
54
+ });
55
+ this.videoElement = video;
56
+ const texture = new THREE.VideoTexture(video);
57
+ texture.colorSpace = THREE.SRGBColorSpace;
58
+ this.videoTexture = texture;
59
+ const width = video.videoWidth || 1;
60
+ const height = video.videoHeight || 1;
61
+ this.textureAspectUniform.value = width / Math.max(height, 1);
62
+ }
63
+ getFacingMode() {
64
+ return this.activeFacingMode ?? "user";
65
+ }
66
+ stopCamera() {
67
+ this.videoTexture?.dispose();
68
+ this.videoTexture = null;
69
+ if (this.videoElement) {
70
+ this.videoElement.pause();
71
+ this.videoElement.srcObject = null;
72
+ this.videoElement = null;
73
+ }
74
+ if (this.stream) {
75
+ for (const track of this.stream.getTracks()) {
76
+ track.stop();
77
+ }
78
+ this.stream = null;
79
+ }
80
+ this.activeFacingMode = null;
81
+ }
82
+ updateParams(params) {
83
+ this.fitModeUniform.value = params.fitMode === "contain" ? 1 : 0;
84
+ this.mirrorUniform.value = params.mirror === false ? 0 : 1;
85
+ this.scaleUniform.value =
86
+ typeof params.scale === "number" ? 1 / Math.max(params.scale, 0.01) : 1;
87
+ if (Array.isArray(params.offset) && params.offset.length === 2) {
88
+ this.offsetXUniform.value = params.offset[0] ?? 0;
89
+ this.offsetYUniform.value = params.offset[1] ?? 0;
90
+ }
91
+ }
92
+ render(renderer, inputTexture, outputTarget, time, delta) {
93
+ if (this.videoTexture) {
94
+ this.videoTexture.needsUpdate = true;
95
+ this.mediaTextureNode.value = this.videoTexture;
96
+ }
97
+ super.render(renderer, inputTexture, outputTarget, time, delta);
98
+ }
99
+ resize(width, height) {
100
+ this.canvasAspectUniform.value = width / Math.max(height, 1);
101
+ }
102
+ needsContinuousRender() {
103
+ return this.videoTexture !== null;
104
+ }
105
+ dispose() {
106
+ this.stopCamera();
107
+ this.placeholder.dispose();
108
+ super.dispose();
109
+ }
110
+ buildEffectNode() {
111
+ if (!this.canvasAspectUniform) {
112
+ return this.inputNode;
113
+ }
114
+ const aspectRatio = this.textureAspectUniform.div(this.canvasAspectUniform);
115
+ const rawUv = uv().sub(0.5).mul(this.scaleUniform);
116
+ const mirroredX = mix(rawUv.x, rawUv.x.negate(), this.mirrorUniform);
117
+ const centeredUv = vec2(mirroredX, rawUv.y);
118
+ const coverScaleX = max(aspectRatio, float(1));
119
+ const coverScaleY = max(float(1).div(aspectRatio), float(1));
120
+ const containScaleX = float(1).div(coverScaleX);
121
+ const containScaleY = float(1).div(coverScaleY);
122
+ const useContain = this.fitModeUniform;
123
+ const scaleX = mix(coverScaleX, containScaleX, useContain);
124
+ const scaleY = mix(coverScaleY, containScaleY, useContain);
125
+ const sampledUv = vec2(centeredUv.x.div(scaleX).add(this.offsetXUniform).add(0.5), centeredUv.y.div(scaleY).add(this.offsetYUniform).add(0.5));
126
+ const safeUv = clamp(sampledUv, vec2(0, 0), vec2(1, 1));
127
+ this.mediaTextureNode = tslTexture(this.placeholder, safeUv);
128
+ const inBounds = sampledUv.x
129
+ .greaterThanEqual(0)
130
+ .and(sampledUv.x.lessThanEqual(1))
131
+ .and(sampledUv.y.greaterThanEqual(0))
132
+ .and(sampledUv.y.lessThanEqual(1));
133
+ const contained = select(inBounds, this.mediaTextureNode, vec4(0, 0, 0, 1));
134
+ return mix(this.mediaTextureNode, contained, useContain);
135
+ }
136
+ }