@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,32 @@
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 MediaKind = "image" | "video";
6
+ type Node = TSLNode;
7
+ export declare class MediaPass extends PassNode {
8
+ private readonly canvasAspectUniform;
9
+ private readonly fitModeUniform;
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 currentTexture;
17
+ private loadedUrl;
18
+ private videoHandle;
19
+ private videoTexture;
20
+ constructor(layerId: string);
21
+ setMedia(url: string, kind: MediaKind): Promise<void>;
22
+ clearMedia(): void;
23
+ updateParams(params: LayerParameterValues): void;
24
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
25
+ resize(width: number, height: number): void;
26
+ needsContinuousRender(): boolean;
27
+ dispose(): void;
28
+ protected buildEffectNode(): Node;
29
+ private releaseCurrentMedia;
30
+ private setTextureAspect;
31
+ }
32
+ export {};
@@ -0,0 +1,130 @@
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 { loadImageTexture, createVideoTexture } from "./media-texture.js";
4
+ import { PassNode } from "./pass-node.js";
5
+ export class MediaPass extends PassNode {
6
+ canvasAspectUniform;
7
+ fitModeUniform;
8
+ offsetXUniform;
9
+ offsetYUniform;
10
+ scaleUniform;
11
+ textureAspectUniform;
12
+ mediaTextureNode;
13
+ placeholder;
14
+ currentTexture = null;
15
+ loadedUrl = null;
16
+ videoHandle = null;
17
+ videoTexture = 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.offsetXUniform = uniform(0);
24
+ this.offsetYUniform = uniform(0);
25
+ this.scaleUniform = uniform(1);
26
+ this.textureAspectUniform = uniform(1);
27
+ this.mediaTextureNode = tslTexture(this.placeholder, uv());
28
+ this.rebuildEffectNode();
29
+ }
30
+ async setMedia(url, kind) {
31
+ if (this.loadedUrl === url) {
32
+ return;
33
+ }
34
+ this.releaseCurrentMedia();
35
+ this.loadedUrl = url;
36
+ if (kind === "image") {
37
+ const texture = await loadImageTexture(url);
38
+ this.currentTexture = texture;
39
+ this.setTextureAspect(texture);
40
+ return;
41
+ }
42
+ const handle = await createVideoTexture(url);
43
+ this.currentTexture = handle.texture;
44
+ this.videoHandle = handle;
45
+ this.videoTexture = handle.texture;
46
+ this.setTextureAspect(handle.texture);
47
+ }
48
+ clearMedia() {
49
+ this.releaseCurrentMedia();
50
+ }
51
+ updateParams(params) {
52
+ this.fitModeUniform.value = params.fitMode === "contain" ? 1 : 0;
53
+ this.scaleUniform.value =
54
+ typeof params.scale === "number" ? 1 / Math.max(params.scale, 0.01) : 1;
55
+ if (Array.isArray(params.offset) && params.offset.length === 2) {
56
+ this.offsetXUniform.value = params.offset[0] ?? 0;
57
+ this.offsetYUniform.value = params.offset[1] ?? 0;
58
+ }
59
+ if (this.videoHandle &&
60
+ typeof params.playbackRate === "number" &&
61
+ Number.isFinite(params.playbackRate)) {
62
+ this.videoHandle.video.playbackRate = Math.max(0.1, params.playbackRate);
63
+ }
64
+ if (this.videoHandle) {
65
+ this.videoHandle.video.loop = true;
66
+ }
67
+ }
68
+ render(renderer, inputTexture, outputTarget, time, delta) {
69
+ if (this.videoTexture) {
70
+ this.videoTexture.needsUpdate = true;
71
+ }
72
+ if (this.currentTexture && this.mediaTextureNode) {
73
+ this.mediaTextureNode.value = this.currentTexture;
74
+ }
75
+ super.render(renderer, inputTexture, outputTarget, time, delta);
76
+ }
77
+ resize(width, height) {
78
+ this.canvasAspectUniform.value = width / Math.max(height, 1);
79
+ }
80
+ needsContinuousRender() {
81
+ return this.videoTexture !== null;
82
+ }
83
+ dispose() {
84
+ this.releaseCurrentMedia();
85
+ this.placeholder.dispose();
86
+ super.dispose();
87
+ }
88
+ buildEffectNode() {
89
+ if (!this.canvasAspectUniform) {
90
+ return this.inputNode;
91
+ }
92
+ const aspectRatio = this.textureAspectUniform.div(this.canvasAspectUniform);
93
+ const centeredUv = uv().sub(0.5).mul(this.scaleUniform);
94
+ const coverScaleX = max(aspectRatio, float(1));
95
+ const coverScaleY = max(float(1).div(aspectRatio), float(1));
96
+ const containScaleX = float(1).div(coverScaleX);
97
+ const containScaleY = float(1).div(coverScaleY);
98
+ const useContain = this.fitModeUniform;
99
+ const scaleX = mix(coverScaleX, containScaleX, useContain);
100
+ const scaleY = mix(coverScaleY, containScaleY, useContain);
101
+ const sampledUv = vec2(centeredUv.x.div(scaleX).add(this.offsetXUniform).add(0.5), centeredUv.y.div(scaleY).add(this.offsetYUniform).add(0.5));
102
+ const safeUv = clamp(sampledUv, vec2(0, 0), vec2(1, 1));
103
+ this.mediaTextureNode = tslTexture(this.placeholder, safeUv);
104
+ const inBounds = sampledUv.x
105
+ .greaterThanEqual(0)
106
+ .and(sampledUv.x.lessThanEqual(1))
107
+ .and(sampledUv.y.greaterThanEqual(0))
108
+ .and(sampledUv.y.lessThanEqual(1));
109
+ const contained = select(inBounds, this.mediaTextureNode, vec4(0, 0, 0, 1));
110
+ return mix(this.mediaTextureNode, contained, useContain);
111
+ }
112
+ releaseCurrentMedia() {
113
+ this.currentTexture?.dispose();
114
+ this.currentTexture = null;
115
+ this.videoTexture = null;
116
+ this.videoHandle?.dispose();
117
+ this.videoHandle = null;
118
+ this.loadedUrl = null;
119
+ }
120
+ setTextureAspect(texture) {
121
+ const image = texture.image;
122
+ const width = image instanceof HTMLVideoElement
123
+ ? image.videoWidth
124
+ : image?.naturalWidth ?? 1;
125
+ const height = image instanceof HTMLVideoElement
126
+ ? image.videoHeight
127
+ : image?.naturalHeight ?? 1;
128
+ this.textureAspectUniform.value = width / Math.max(height, 1);
129
+ }
130
+ }
@@ -0,0 +1,8 @@
1
+ import * as THREE from "three/webgpu";
2
+ export interface VideoHandle {
3
+ dispose: () => void;
4
+ texture: THREE.VideoTexture;
5
+ video: HTMLVideoElement;
6
+ }
7
+ export declare function loadImageTexture(url: string): Promise<THREE.Texture>;
8
+ export declare function createVideoTexture(url: string): Promise<VideoHandle>;
@@ -0,0 +1,41 @@
1
+ import * as THREE from "three/webgpu";
2
+ export function loadImageTexture(url) {
3
+ return new Promise((resolve, reject) => {
4
+ const loader = new THREE.TextureLoader();
5
+ loader.load(url, (texture) => {
6
+ texture.colorSpace = THREE.SRGBColorSpace;
7
+ resolve(texture);
8
+ }, undefined, () => {
9
+ reject(new Error(`Failed to load image texture: ${url}`));
10
+ });
11
+ });
12
+ }
13
+ export function createVideoTexture(url) {
14
+ return new Promise((resolve, reject) => {
15
+ const video = document.createElement("video");
16
+ video.loop = true;
17
+ video.muted = true;
18
+ video.playsInline = true;
19
+ video.addEventListener("playing", () => {
20
+ const texture = new THREE.VideoTexture(video);
21
+ texture.colorSpace = THREE.SRGBColorSpace;
22
+ resolve({
23
+ dispose: () => {
24
+ texture.dispose();
25
+ video.pause();
26
+ video.src = "";
27
+ },
28
+ texture,
29
+ video,
30
+ });
31
+ }, { once: true });
32
+ video.addEventListener("loadedmetadata", () => {
33
+ video.play().catch(reject);
34
+ }, { once: true });
35
+ video.onerror = () => {
36
+ reject(new Error(`Failed to load video texture: ${url}`));
37
+ };
38
+ video.src = url;
39
+ video.load();
40
+ });
41
+ }
@@ -0,0 +1,48 @@
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 ParticleGridPass extends PassNode {
7
+ private readonly perspScene;
8
+ private readonly perspCamera;
9
+ private readonly internalRT;
10
+ private readonly blitInputNode;
11
+ private inputSamplerNode;
12
+ private readonly displacementUniform;
13
+ private readonly pointSizeUniform;
14
+ private readonly timeUniform;
15
+ private readonly noiseAmountUniform;
16
+ private readonly noiseScaleUniform;
17
+ private readonly noiseSpeedUniform;
18
+ private bloomEnabled;
19
+ private bloomNode;
20
+ private readonly bloomIntensityUniform;
21
+ private readonly bloomRadiusUniform;
22
+ private readonly bloomSoftnessUniform;
23
+ private readonly bloomThresholdUniform;
24
+ private mesh;
25
+ private meshMaterial;
26
+ private readonly bgColor;
27
+ private gridResolution;
28
+ private isAnimated;
29
+ private needsRebuild;
30
+ private width;
31
+ private height;
32
+ private readonly placeholder;
33
+ constructor(layerId: string);
34
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
35
+ protected beforeRender(time: number, _delta: number): void;
36
+ needsContinuousRender(): boolean;
37
+ updateParams(params: LayerParameterValues): void;
38
+ resize(width: number, height: number): void;
39
+ dispose(): void;
40
+ protected buildEffectNode(): Node;
41
+ private rebuildGrid;
42
+ private clearGrid;
43
+ private normalizeBloomRadius;
44
+ private normalizeBloomSoftness;
45
+ private disposeBloomNode;
46
+ private getBloomTextureNode;
47
+ }
48
+ export {};
@@ -0,0 +1,269 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
3
+ import { attribute, clamp, float, positionLocal, smoothstep, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
4
+ import { PassNode } from "./pass-node.js";
5
+ import { simplexNoise3d } from "./shaders/tsl/noise/simplex-noise-3d.js";
6
+ function clamp01(value) {
7
+ return Math.max(0, Math.min(1, value));
8
+ }
9
+ export class ParticleGridPass extends PassNode {
10
+ perspScene;
11
+ perspCamera;
12
+ internalRT;
13
+ blitInputNode;
14
+ inputSamplerNode = null;
15
+ displacementUniform;
16
+ pointSizeUniform;
17
+ timeUniform;
18
+ noiseAmountUniform;
19
+ noiseScaleUniform;
20
+ noiseSpeedUniform;
21
+ // Bloom
22
+ bloomEnabled = false;
23
+ bloomNode = null;
24
+ bloomIntensityUniform;
25
+ bloomRadiusUniform;
26
+ bloomSoftnessUniform;
27
+ bloomThresholdUniform;
28
+ mesh = null;
29
+ meshMaterial = null;
30
+ bgColor = new THREE.Color(0x000000);
31
+ gridResolution = 64;
32
+ isAnimated = false;
33
+ needsRebuild = true;
34
+ width = 1;
35
+ height = 1;
36
+ placeholder;
37
+ constructor(layerId) {
38
+ super(layerId);
39
+ this.perspScene = new THREE.Scene();
40
+ this.perspCamera = new THREE.PerspectiveCamera(45, 1, 0.01, 100);
41
+ this.perspCamera.position.set(0, 0, 1.2);
42
+ this.perspCamera.lookAt(0, 0, 0);
43
+ this.placeholder = new THREE.Texture();
44
+ this.internalRT = new THREE.WebGLRenderTarget(1, 1, {
45
+ depthBuffer: true,
46
+ format: THREE.RGBAFormat,
47
+ generateMipmaps: false,
48
+ magFilter: THREE.LinearFilter,
49
+ minFilter: THREE.LinearFilter,
50
+ stencilBuffer: false,
51
+ type: THREE.HalfFloatType,
52
+ });
53
+ this.displacementUniform = uniform(0.5);
54
+ this.pointSizeUniform = uniform(3.0);
55
+ this.timeUniform = uniform(0.0);
56
+ this.noiseAmountUniform = uniform(0.0);
57
+ this.noiseScaleUniform = uniform(3.0);
58
+ this.noiseSpeedUniform = uniform(0.5);
59
+ this.bloomIntensityUniform = uniform(1.25);
60
+ this.bloomRadiusUniform = uniform(6);
61
+ this.bloomSoftnessUniform = uniform(0.35);
62
+ this.bloomThresholdUniform = uniform(0.6);
63
+ const blitUv = vec2(uv().x, float(1).sub(uv().y));
64
+ this.blitInputNode = tslTexture(new THREE.Texture(), blitUv);
65
+ this.rebuildEffectNode();
66
+ }
67
+ render(renderer, inputTexture, outputTarget, time, delta) {
68
+ if (this.needsRebuild) {
69
+ this.rebuildGrid();
70
+ this.needsRebuild = false;
71
+ }
72
+ if (this.inputSamplerNode) {
73
+ this.inputSamplerNode.value = inputTexture;
74
+ }
75
+ renderer.setClearColor(this.bgColor, 1);
76
+ renderer.setRenderTarget(this.internalRT);
77
+ renderer.render(this.perspScene, this.perspCamera);
78
+ this.blitInputNode.value = this.internalRT.texture;
79
+ super.render(renderer, inputTexture, outputTarget, time, delta);
80
+ }
81
+ beforeRender(time, _delta) {
82
+ this.timeUniform.value = time;
83
+ }
84
+ needsContinuousRender() {
85
+ return this.isAnimated;
86
+ }
87
+ updateParams(params) {
88
+ const nextResolution = typeof params.gridResolution === "number"
89
+ ? Math.max(16, Math.min(512, Math.round(params.gridResolution)))
90
+ : 64;
91
+ const nextPointSize = typeof params.pointSize === "number" ? params.pointSize : 3;
92
+ const nextBloomEnabled = params.bloomEnabled === true;
93
+ if (nextResolution !== this.gridResolution || nextPointSize !== this.pointSizeUniform.value) {
94
+ this.gridResolution = nextResolution;
95
+ this.pointSizeUniform.value = nextPointSize;
96
+ this.needsRebuild = true;
97
+ }
98
+ this.displacementUniform.value =
99
+ typeof params.displacement === "number" ? params.displacement : 0.5;
100
+ this.bgColor.set(typeof params.backgroundColor === "string" ? params.backgroundColor : "#000000");
101
+ const noiseAmount = typeof params.noiseAmount === "number" ? params.noiseAmount : 0;
102
+ this.noiseAmountUniform.value = noiseAmount;
103
+ this.noiseScaleUniform.value =
104
+ typeof params.noiseScale === "number" ? params.noiseScale : 3;
105
+ this.noiseSpeedUniform.value =
106
+ typeof params.noiseSpeed === "number" ? params.noiseSpeed : 0.5;
107
+ this.isAnimated = noiseAmount > 0;
108
+ this.bloomIntensityUniform.value =
109
+ typeof params.bloomIntensity === "number" ? Math.max(0, params.bloomIntensity) : 1.25;
110
+ this.bloomThresholdUniform.value =
111
+ typeof params.bloomThreshold === "number" ? clamp01(params.bloomThreshold) : 0.6;
112
+ this.bloomRadiusUniform.value =
113
+ typeof params.bloomRadius === "number" ? Math.max(0, params.bloomRadius) : 6;
114
+ this.bloomSoftnessUniform.value =
115
+ typeof params.bloomSoftness === "number" ? clamp01(params.bloomSoftness) : 0.35;
116
+ if (nextBloomEnabled !== this.bloomEnabled) {
117
+ this.bloomEnabled = nextBloomEnabled;
118
+ this.rebuildEffectNode();
119
+ }
120
+ if (this.bloomNode) {
121
+ this.bloomNode.strength.value = this.bloomIntensityUniform.value;
122
+ this.bloomNode.radius.value = this.normalizeBloomRadius(this.bloomRadiusUniform.value);
123
+ this.bloomNode.threshold.value = this.bloomThresholdUniform.value;
124
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
125
+ }
126
+ }
127
+ resize(width, height) {
128
+ this.width = Math.max(1, width);
129
+ this.height = Math.max(1, height);
130
+ this.internalRT.setSize(this.width, this.height);
131
+ this.perspCamera.aspect = this.width / this.height;
132
+ this.perspCamera.updateProjectionMatrix();
133
+ this.needsRebuild = true;
134
+ }
135
+ dispose() {
136
+ this.disposeBloomNode();
137
+ this.clearGrid();
138
+ this.placeholder.dispose();
139
+ this.internalRT.dispose();
140
+ super.dispose();
141
+ }
142
+ buildEffectNode() {
143
+ if (!this.blitInputNode) {
144
+ return this.inputNode;
145
+ }
146
+ this.disposeBloomNode();
147
+ this.bloomNode = null;
148
+ const baseColor = vec3(this.blitInputNode.r, this.blitInputNode.g, this.blitInputNode.b);
149
+ if (!this.bloomEnabled) {
150
+ return vec4(baseColor, float(1));
151
+ }
152
+ const bloomInput = vec4(baseColor, float(1));
153
+ this.bloomNode = bloom(bloomInput, this.bloomIntensityUniform.value, this.normalizeBloomRadius(this.bloomRadiusUniform.value), this.bloomThresholdUniform.value);
154
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
155
+ return vec4(clamp(baseColor.add(this.getBloomTextureNode().rgb), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
156
+ }
157
+ rebuildGrid() {
158
+ this.clearGrid();
159
+ const res = this.gridResolution;
160
+ const count = res * res;
161
+ const aspect = this.width / this.height;
162
+ const pointSize = this.pointSizeUniform.value;
163
+ // Camera frustum at z=0
164
+ const halfH = Math.tan((45 * Math.PI) / 360) * 1.2;
165
+ const halfW = halfH * aspect;
166
+ // Size of each quad in world units — convert point size from pixels to world
167
+ // At z=0 with camera at 1.2, 1 world unit = canvas_height / (2 * halfH) pixels
168
+ const pixelsPerUnit = this.height / (2 * halfH);
169
+ const quadWorldSize = pointSize / pixelsPerUnit;
170
+ // Base quad: unit plane centered at origin
171
+ const baseGeo = new THREE.PlaneGeometry(1, 1);
172
+ // Instance attributes
173
+ const offsets = new Float32Array(count * 3);
174
+ const gridUvs = new Float32Array(count * 2);
175
+ for (let row = 0; row < res; row++) {
176
+ for (let col = 0; col < res; col++) {
177
+ const i = row * res + col;
178
+ const u = col / (res - 1);
179
+ const v = row / (res - 1);
180
+ offsets[i * 3] = (u * 2 - 1) * halfW;
181
+ offsets[i * 3 + 1] = (v * 2 - 1) * halfH;
182
+ offsets[i * 3 + 2] = 0;
183
+ gridUvs[i * 2] = u;
184
+ gridUvs[i * 2 + 1] = 1 - v;
185
+ }
186
+ }
187
+ const instancedGeo = new THREE.InstancedBufferGeometry();
188
+ instancedGeo.index = baseGeo.index;
189
+ instancedGeo.setAttribute("position", baseGeo.getAttribute("position"));
190
+ instancedGeo.setAttribute("normal", baseGeo.getAttribute("normal"));
191
+ instancedGeo.setAttribute("uv", baseGeo.getAttribute("uv"));
192
+ instancedGeo.setAttribute("instanceOffset", new THREE.InstancedBufferAttribute(offsets, 3));
193
+ instancedGeo.setAttribute("instanceGridUv", new THREE.InstancedBufferAttribute(gridUvs, 2));
194
+ instancedGeo.instanceCount = count;
195
+ // GPU material
196
+ const instanceOffset = attribute("instanceOffset", "vec3");
197
+ const instanceGridUv = attribute("instanceGridUv", "vec2");
198
+ // Sample input texture per instance
199
+ this.inputSamplerNode = tslTexture(this.placeholder, instanceGridUv);
200
+ const sampledColor = this.inputSamplerNode;
201
+ // Luma for Z displacement
202
+ const luma = sampledColor.r
203
+ .mul(0.2126)
204
+ .add(sampledColor.g.mul(0.7152))
205
+ .add(sampledColor.b.mul(0.0722));
206
+ // Per-particle noise using instance grid UV scaled by resolution
207
+ const noiseUv = vec2(instanceGridUv.x.mul(float(res)).mul(this.noiseScaleUniform), instanceGridUv.y.mul(float(res)).mul(this.noiseScaleUniform));
208
+ const noiseInputX = vec3(noiseUv.x, noiseUv.y, this.timeUniform.mul(this.noiseSpeedUniform));
209
+ const noiseInputY = vec3(noiseUv.x, noiseUv.y, this.timeUniform.mul(this.noiseSpeedUniform).add(float(100)));
210
+ const noiseOffsetX = simplexNoise3d(noiseInputX).mul(this.noiseAmountUniform).mul(0.01);
211
+ const noiseOffsetY = simplexNoise3d(noiseInputY).mul(this.noiseAmountUniform).mul(0.01);
212
+ // Scale quad vertices by world size, then offset to instance position + noise + displacement
213
+ const scaledPos = positionLocal.mul(float(quadWorldSize));
214
+ const finalPos = vec3(scaledPos.x.add(instanceOffset.x).add(noiseOffsetX), scaledPos.y.add(instanceOffset.y).add(noiseOffsetY), scaledPos.z.add(instanceOffset.z).add(luma.mul(this.displacementUniform)));
215
+ // Circle mask using quad UV (0–1 per quad)
216
+ // Edge width scales with point size so anti-aliasing is always ~1.5px
217
+ const quadUv = uv();
218
+ const dist = vec2(quadUv.x.sub(0.5), quadUv.y.sub(0.5)).length();
219
+ const aaWidth = float(1.5).div(this.pointSizeUniform);
220
+ const circleMask = smoothstep(float(0.5), float(0.5).sub(aaWidth), dist);
221
+ const material = new THREE.MeshBasicNodeMaterial();
222
+ material.positionNode = finalPos;
223
+ material.colorNode = vec4(sampledColor.r, sampledColor.g, sampledColor.b, circleMask);
224
+ material.transparent = true;
225
+ material.alphaTest = 0.01;
226
+ material.depthWrite = false;
227
+ material.side = THREE.DoubleSide;
228
+ this.meshMaterial = material;
229
+ this.mesh = new THREE.Mesh(instancedGeo, material);
230
+ this.mesh.frustumCulled = false;
231
+ this.perspScene.add(this.mesh);
232
+ baseGeo.dispose();
233
+ }
234
+ clearGrid() {
235
+ if (this.mesh) {
236
+ this.perspScene.remove(this.mesh);
237
+ this.mesh.geometry.dispose();
238
+ this.mesh = null;
239
+ }
240
+ if (this.meshMaterial) {
241
+ this.meshMaterial.dispose();
242
+ this.meshMaterial = null;
243
+ }
244
+ this.inputSamplerNode = null;
245
+ }
246
+ normalizeBloomRadius(value) {
247
+ return clamp01(value / 24);
248
+ }
249
+ normalizeBloomSoftness(value) {
250
+ return Math.max(0.001, value * 0.25);
251
+ }
252
+ disposeBloomNode() {
253
+ ;
254
+ this.bloomNode?.dispose?.();
255
+ }
256
+ getBloomTextureNode() {
257
+ const bloomNode = this.bloomNode;
258
+ if (!bloomNode) {
259
+ throw new Error("Bloom node is not initialized");
260
+ }
261
+ if ("getTextureNode" in bloomNode && typeof bloomNode.getTextureNode === "function") {
262
+ return bloomNode.getTextureNode();
263
+ }
264
+ if ("getTexture" in bloomNode && typeof bloomNode.getTexture === "function") {
265
+ return bloomNode.getTexture();
266
+ }
267
+ throw new Error("Bloom node does not expose a texture getter");
268
+ }
269
+ }
@@ -0,0 +1,36 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { type TSLNode } from "three/tsl";
3
+ import type { LayerCompositeMode, LayerParameterValues } from "../types/editor";
4
+ type Node = TSLNode;
5
+ export declare class PassNode {
6
+ readonly layerId: string;
7
+ enabled: boolean;
8
+ protected readonly scene: THREE.Scene;
9
+ protected readonly camera: THREE.OrthographicCamera;
10
+ protected readonly material: THREE.MeshBasicNodeMaterial;
11
+ protected readonly inputNode: Node;
12
+ protected effectNode: Node;
13
+ protected readonly hueUniform: Node;
14
+ protected readonly saturationUniform: Node;
15
+ private readonly opacityUniform;
16
+ private blendMode;
17
+ private compositeMode;
18
+ constructor(layerId: string);
19
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
20
+ updateOpacity(opacity: number): void;
21
+ updateBlendMode(blendMode: string): boolean;
22
+ updateCompositeMode(compositeMode: LayerCompositeMode): boolean;
23
+ updateLayerColorAdjustments(hue: number, saturation: number): void;
24
+ updateParams(_params: LayerParameterValues): void;
25
+ resize(_width: number, _height: number): void;
26
+ updateLogicalSize(_width: number, _height: number): void;
27
+ needsContinuousRender(): boolean;
28
+ dispose(): void;
29
+ getMaterialVersion(): number;
30
+ protected beforeRender(_time: number, _delta: number): void;
31
+ protected buildEffectNode(): Node;
32
+ protected rebuildEffectNode(): void;
33
+ protected rebuildColorNode(): void;
34
+ private applySharedColorAdjustments;
35
+ }
36
+ export {};