@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,120 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { clamp, cos, float, mix, sin, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
3
+ import { buildBlendNode } from "./blend-modes.js";
4
+ export class PassNode {
5
+ layerId;
6
+ enabled = true;
7
+ scene;
8
+ camera;
9
+ material;
10
+ inputNode;
11
+ effectNode;
12
+ hueUniform;
13
+ saturationUniform;
14
+ opacityUniform;
15
+ blendMode = "normal";
16
+ compositeMode = "filter";
17
+ constructor(layerId) {
18
+ this.layerId = layerId;
19
+ this.scene = new THREE.Scene();
20
+ this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
21
+ this.material = new THREE.MeshBasicNodeMaterial();
22
+ this.opacityUniform = uniform(1);
23
+ this.hueUniform = uniform(0);
24
+ this.saturationUniform = uniform(1);
25
+ const placeholder = new THREE.Texture();
26
+ const renderTargetUv = vec2(uv().x, float(1).sub(uv().y));
27
+ this.inputNode = tslTexture(placeholder, renderTargetUv);
28
+ this.effectNode = this.buildEffectNode();
29
+ this.rebuildColorNode();
30
+ const mesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.material);
31
+ mesh.frustumCulled = false;
32
+ this.scene.add(mesh);
33
+ }
34
+ render(renderer, inputTexture, outputTarget, time, delta) {
35
+ this.inputNode.value = inputTexture;
36
+ this.beforeRender(time, delta);
37
+ renderer.setRenderTarget(outputTarget);
38
+ renderer.render(this.scene, this.camera);
39
+ }
40
+ updateOpacity(opacity) {
41
+ this.opacityUniform.value = opacity;
42
+ }
43
+ updateBlendMode(blendMode) {
44
+ if (blendMode === this.blendMode) {
45
+ return false;
46
+ }
47
+ this.blendMode = blendMode;
48
+ this.rebuildColorNode();
49
+ this.material.needsUpdate = true;
50
+ return true;
51
+ }
52
+ updateCompositeMode(compositeMode) {
53
+ if (compositeMode === this.compositeMode) {
54
+ return false;
55
+ }
56
+ this.compositeMode = compositeMode;
57
+ this.rebuildColorNode();
58
+ this.material.needsUpdate = true;
59
+ return true;
60
+ }
61
+ updateLayerColorAdjustments(hue, saturation) {
62
+ this.hueUniform.value = (hue * Math.PI) / 180;
63
+ this.saturationUniform.value = Math.max(0, saturation);
64
+ }
65
+ updateParams(_params) {
66
+ // Default pass has no per-layer parameter handling.
67
+ }
68
+ resize(_width, _height) {
69
+ // Default pass has no resize-dependent uniforms.
70
+ }
71
+ updateLogicalSize(_width, _height) {
72
+ // Default pass has no logical-size-dependent uniforms.
73
+ }
74
+ needsContinuousRender() {
75
+ return false;
76
+ }
77
+ dispose() {
78
+ this.scene.clear();
79
+ this.material.dispose();
80
+ }
81
+ getMaterialVersion() {
82
+ return this.material.version;
83
+ }
84
+ beforeRender(_time, _delta) {
85
+ // Default pass has no per-frame work.
86
+ }
87
+ buildEffectNode() {
88
+ return this.inputNode;
89
+ }
90
+ rebuildEffectNode() {
91
+ this.effectNode = this.buildEffectNode();
92
+ this.rebuildColorNode();
93
+ this.material.needsUpdate = true;
94
+ }
95
+ rebuildColorNode() {
96
+ const adjustedEffectNode = this.applySharedColorAdjustments(this.effectNode);
97
+ this.material.colorNode = buildBlendNode(this.blendMode, this.inputNode, adjustedEffectNode, this.opacityUniform, this.compositeMode);
98
+ }
99
+ applySharedColorAdjustments(sourceNode) {
100
+ const sourceColor = vec3(float(sourceNode.r), float(sourceNode.g), float(sourceNode.b));
101
+ const luma = float(sourceColor.x)
102
+ .mul(float(0.2126))
103
+ .add(float(sourceColor.y).mul(float(0.7152)))
104
+ .add(float(sourceColor.z).mul(float(0.0722)));
105
+ const saturated = mix(vec3(luma, luma, luma), sourceColor, this.saturationUniform);
106
+ const hueCos = float(cos(this.hueUniform));
107
+ const hueSin = float(sin(this.hueUniform));
108
+ const rotated = vec3(float(saturated.x)
109
+ .mul(float(0.213).add(hueCos.mul(float(0.787))).sub(hueSin.mul(float(0.213))))
110
+ .add(float(saturated.y).mul(float(0.715).sub(hueCos.mul(float(0.715))).sub(hueSin.mul(float(0.715)))))
111
+ .add(float(saturated.z).mul(float(0.072).sub(hueCos.mul(float(0.072))).add(hueSin.mul(float(0.928))))), float(saturated.x)
112
+ .mul(float(0.213).sub(hueCos.mul(float(0.213))).add(hueSin.mul(float(0.143))))
113
+ .add(float(saturated.y).mul(float(0.715).add(hueCos.mul(float(0.285))).add(hueSin.mul(float(0.14)))))
114
+ .add(float(saturated.z).mul(float(0.072).sub(hueCos.mul(float(0.072))).sub(hueSin.mul(float(0.283))))), float(saturated.x)
115
+ .mul(float(0.213).sub(hueCos.mul(float(0.213))).sub(hueSin.mul(float(0.787))))
116
+ .add(float(saturated.y).mul(float(0.715).sub(hueCos.mul(float(0.715))).add(hueSin.mul(float(0.715)))))
117
+ .add(float(saturated.z).mul(float(0.072).add(hueCos.mul(float(0.928))).add(hueSin.mul(float(0.072))))));
118
+ return vec4(clamp(rotated, vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
119
+ }
120
+ }
@@ -0,0 +1,8 @@
1
+ import * as THREE from "three/webgpu";
2
+ export declare const PATTERN_PRESET_SOURCES: {
3
+ readonly bars: readonly [string, string, string, string, string, string];
4
+ readonly candles: readonly [string, string, string, string];
5
+ readonly shapes: readonly [string, string, string, string, string, string];
6
+ };
7
+ export type PatternPreset = keyof typeof PATTERN_PRESET_SOURCES;
8
+ export declare function buildPatternAtlas(preset: PatternPreset, cellPx?: number): Promise<THREE.CanvasTexture>;
@@ -0,0 +1,79 @@
1
+ import * as THREE from "three/webgpu";
2
+ export const PATTERN_PRESET_SOURCES = {
3
+ bars: [
4
+ new URL("../../../assets/patterns/bars/1.svg", import.meta.url).toString(),
5
+ new URL("../../../assets/patterns/bars/2.svg", import.meta.url).toString(),
6
+ new URL("../../../assets/patterns/bars/3.svg", import.meta.url).toString(),
7
+ new URL("../../../assets/patterns/bars/4.svg", import.meta.url).toString(),
8
+ new URL("../../../assets/patterns/bars/5.svg", import.meta.url).toString(),
9
+ new URL("../../../assets/patterns/bars/6.svg", import.meta.url).toString(),
10
+ ],
11
+ candles: [
12
+ new URL("../../../assets/patterns/candles/1.svg", import.meta.url).toString(),
13
+ new URL("../../../assets/patterns/candles/2.svg", import.meta.url).toString(),
14
+ new URL("../../../assets/patterns/candles/3.svg", import.meta.url).toString(),
15
+ new URL("../../../assets/patterns/candles/4.svg", import.meta.url).toString(),
16
+ ],
17
+ shapes: [
18
+ new URL("../../../assets/patterns/shapes/1.svg", import.meta.url).toString(),
19
+ new URL("../../../assets/patterns/shapes/2.svg", import.meta.url).toString(),
20
+ new URL("../../../assets/patterns/shapes/3.svg", import.meta.url).toString(),
21
+ new URL("../../../assets/patterns/shapes/4.svg", import.meta.url).toString(),
22
+ new URL("../../../assets/patterns/shapes/5.svg", import.meta.url).toString(),
23
+ new URL("../../../assets/patterns/shapes/6.svg", import.meta.url).toString(),
24
+ ],
25
+ };
26
+ function loadSvg(url) {
27
+ return new Promise((resolve, reject) => {
28
+ const image = new Image();
29
+ image.decoding = "async";
30
+ image.onload = () => resolve(image);
31
+ image.onerror = () => reject(new Error(`Unable to load SVG pattern: ${url}`));
32
+ image.src = url;
33
+ });
34
+ }
35
+ export async function buildPatternAtlas(preset, cellPx = 16) {
36
+ const urls = PATTERN_PRESET_SOURCES[preset];
37
+ const cellSize = Math.max(4, Math.round(cellPx));
38
+ const images = await Promise.all(urls.map((url) => loadSvg(url)));
39
+ const canvas = document.createElement("canvas");
40
+ canvas.width = urls.length * cellSize;
41
+ canvas.height = cellSize;
42
+ const context = canvas.getContext("2d");
43
+ if (!context) {
44
+ throw new Error("Unable to create 2D context for pattern atlas");
45
+ }
46
+ context.clearRect(0, 0, canvas.width, canvas.height);
47
+ context.fillStyle = "#000";
48
+ context.fillRect(0, 0, canvas.width, canvas.height);
49
+ context.imageSmoothingEnabled = true;
50
+ for (const [index, image] of images.entries()) {
51
+ const aspect = image.naturalWidth / Math.max(image.naturalHeight, 1);
52
+ const drawWidth = aspect >= 1 ? cellSize : cellSize * aspect;
53
+ const drawHeight = aspect >= 1 ? cellSize / Math.max(aspect, 0.0001) : cellSize;
54
+ const x = index * cellSize + (cellSize - drawWidth) * 0.5;
55
+ const y = (cellSize - drawHeight) * 0.5;
56
+ context.drawImage(image, x, y, drawWidth, drawHeight);
57
+ }
58
+ const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
59
+ const { data } = imageData;
60
+ for (let index = 0; index < data.length; index += 4) {
61
+ const alpha = data[index + 3] ?? 0;
62
+ const luminance = Math.max(data[index] ?? 0, data[index + 1] ?? 0, data[index + 2] ?? 0);
63
+ const mask = alpha > 0 && luminance > 32 ? 255 : 0;
64
+ data[index] = mask;
65
+ data[index + 1] = mask;
66
+ data[index + 2] = mask;
67
+ data[index + 3] = 255;
68
+ }
69
+ context.putImageData(imageData, 0, 0);
70
+ const texture = new THREE.CanvasTexture(canvas);
71
+ texture.flipY = false;
72
+ texture.generateMipmaps = false;
73
+ texture.magFilter = THREE.NearestFilter;
74
+ texture.minFilter = THREE.NearestFilter;
75
+ texture.wrapS = THREE.ClampToEdgeWrapping;
76
+ texture.wrapT = THREE.ClampToEdgeWrapping;
77
+ texture.needsUpdate = true;
78
+ return texture;
79
+ }
@@ -0,0 +1,58 @@
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 PatternPass extends PassNode {
7
+ private atlasTexture;
8
+ private atlasTextureNodes;
9
+ private bloomEnabled;
10
+ private bloomNode;
11
+ private readonly bloomIntensityUniform;
12
+ private readonly bloomRadiusUniform;
13
+ private readonly bloomSoftnessUniform;
14
+ private readonly bloomThresholdUniform;
15
+ private sourceTextureNodes;
16
+ private readonly bgOpacityUniform;
17
+ private readonly cellSizeUniform;
18
+ private readonly colorModeUniform;
19
+ private readonly customBgColorUniform;
20
+ private readonly customColor1Uniform;
21
+ private readonly customColor2Uniform;
22
+ private readonly customColor3Uniform;
23
+ private readonly customColor4Uniform;
24
+ private readonly customColorCountUniform;
25
+ private readonly customLuminanceBiasUniform;
26
+ private readonly invertUniform;
27
+ private readonly logicalHeightUniform;
28
+ private readonly logicalWidthUniform;
29
+ private readonly monoBlueUniform;
30
+ private readonly monoGreenUniform;
31
+ private readonly monoRedUniform;
32
+ private readonly numPatternsUniform;
33
+ private readonly placeholder;
34
+ private atlasBuildRequestId;
35
+ private atlasPending;
36
+ private currentCellSize;
37
+ private currentPreset;
38
+ private needsRefresh;
39
+ constructor(layerId: string);
40
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
41
+ updateParams(params: LayerParameterValues): void;
42
+ updateLogicalSize(width: number, height: number): void;
43
+ needsContinuousRender(): boolean;
44
+ dispose(): void;
45
+ protected buildEffectNode(): Node;
46
+ private getColorModeValue;
47
+ private rebuildAtlas;
48
+ private resolveColorMode;
49
+ private resolvePreset;
50
+ private normalizeBloomRadius;
51
+ private normalizeBloomSoftness;
52
+ private disposeBloomNode;
53
+ private getBloomTextureNode;
54
+ private trackAtlasTextureNode;
55
+ private trackSourceTextureNode;
56
+ private setCustomColorUniform;
57
+ }
58
+ export {};
@@ -0,0 +1,316 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
3
+ import { clamp, float, floor, mix, mod, select, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
4
+ import { buildPatternAtlas, } from "./pattern-atlas.js";
5
+ import { PassNode } from "./pass-node.js";
6
+ function clamp01(value) {
7
+ return Math.max(0, Math.min(1, value));
8
+ }
9
+ function parseCssColorRgb(value) {
10
+ const rgba = value.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*[\d.]+)?\s*\)/i);
11
+ if (rgba) {
12
+ return [
13
+ clamp01(Number.parseFloat(rgba[1] ?? "0") / 255),
14
+ clamp01(Number.parseFloat(rgba[2] ?? "0") / 255),
15
+ clamp01(Number.parseFloat(rgba[3] ?? "0") / 255),
16
+ ];
17
+ }
18
+ const hex = value.trim().replace("#", "");
19
+ if (hex.length === 6) {
20
+ return [
21
+ Number.parseInt(hex.slice(0, 2), 16) / 255,
22
+ Number.parseInt(hex.slice(2, 4), 16) / 255,
23
+ Number.parseInt(hex.slice(4, 6), 16) / 255,
24
+ ];
25
+ }
26
+ if (hex.length === 3) {
27
+ return [
28
+ Number.parseInt(`${hex[0] ?? "0"}${hex[0] ?? "0"}`, 16) / 255,
29
+ Number.parseInt(`${hex[1] ?? "0"}${hex[1] ?? "0"}`, 16) / 255,
30
+ Number.parseInt(`${hex[2] ?? "0"}${hex[2] ?? "0"}`, 16) / 255,
31
+ ];
32
+ }
33
+ return [1, 1, 1];
34
+ }
35
+ export class PatternPass extends PassNode {
36
+ atlasTexture = null;
37
+ atlasTextureNodes = [];
38
+ bloomEnabled = false;
39
+ bloomNode = null;
40
+ bloomIntensityUniform;
41
+ bloomRadiusUniform;
42
+ bloomSoftnessUniform;
43
+ bloomThresholdUniform;
44
+ sourceTextureNodes = [];
45
+ bgOpacityUniform;
46
+ cellSizeUniform;
47
+ colorModeUniform;
48
+ customBgColorUniform;
49
+ customColor1Uniform;
50
+ customColor2Uniform;
51
+ customColor3Uniform;
52
+ customColor4Uniform;
53
+ customColorCountUniform;
54
+ customLuminanceBiasUniform;
55
+ invertUniform;
56
+ logicalHeightUniform;
57
+ logicalWidthUniform;
58
+ monoBlueUniform;
59
+ monoGreenUniform;
60
+ monoRedUniform;
61
+ numPatternsUniform;
62
+ placeholder;
63
+ atlasBuildRequestId = 0;
64
+ atlasPending = false;
65
+ currentCellSize = 12;
66
+ currentPreset = "bars";
67
+ needsRefresh = false;
68
+ constructor(layerId) {
69
+ super(layerId);
70
+ this.placeholder = new THREE.Texture();
71
+ this.bloomIntensityUniform = uniform(1.25);
72
+ this.bloomRadiusUniform = uniform(6);
73
+ this.bloomSoftnessUniform = uniform(0.35);
74
+ this.bloomThresholdUniform = uniform(0.6);
75
+ this.bgOpacityUniform = uniform(0);
76
+ this.cellSizeUniform = uniform(12);
77
+ this.colorModeUniform = uniform(0);
78
+ this.customColorCountUniform = uniform(4);
79
+ this.customLuminanceBiasUniform = uniform(0);
80
+ this.customBgColorUniform = uniform(new THREE.Vector3(0.96, 0.96, 0.94));
81
+ this.customColor1Uniform = uniform(new THREE.Vector3(0.05, 0.063, 0.078));
82
+ this.customColor2Uniform = uniform(new THREE.Vector3(0.302, 0.314, 0.341));
83
+ this.customColor3Uniform = uniform(new THREE.Vector3(0.588, 0.604, 0.635));
84
+ this.customColor4Uniform = uniform(new THREE.Vector3(0.882, 0.886, 0.871));
85
+ this.invertUniform = uniform(0);
86
+ this.logicalWidthUniform = uniform(1);
87
+ this.logicalHeightUniform = uniform(1);
88
+ this.monoRedUniform = uniform(0.96);
89
+ this.monoGreenUniform = uniform(0.96);
90
+ this.monoBlueUniform = uniform(0.94);
91
+ this.numPatternsUniform = uniform(1);
92
+ this.rebuildAtlas();
93
+ this.rebuildEffectNode();
94
+ }
95
+ render(renderer, inputTexture, outputTarget, time, delta) {
96
+ for (const sourceTextureNode of this.sourceTextureNodes) {
97
+ sourceTextureNode.value = inputTexture;
98
+ }
99
+ if (this.atlasTexture) {
100
+ for (const atlasTextureNode of this.atlasTextureNodes) {
101
+ atlasTextureNode.value = this.atlasTexture;
102
+ }
103
+ }
104
+ super.render(renderer, inputTexture, outputTarget, time, delta);
105
+ this.needsRefresh = false;
106
+ }
107
+ updateParams(params) {
108
+ const nextCellSize = typeof params.cellSize === "number" ? Math.max(4, Math.round(params.cellSize)) : 12;
109
+ const nextPreset = this.resolvePreset(params.preset);
110
+ const nextColorMode = this.resolveColorMode(params.colorMode);
111
+ const nextBgOpacity = typeof params.bgOpacity === "number" ? clamp01(params.bgOpacity) : 0;
112
+ const nextCustomColorCount = typeof params.customColorCount === "number"
113
+ ? Math.min(4, Math.max(2, Math.round(params.customColorCount)))
114
+ : 4;
115
+ const nextCustomLuminanceBias = typeof params.customLuminanceBias === "number"
116
+ ? Math.min(1, Math.max(-1, params.customLuminanceBias))
117
+ : 0;
118
+ const nextBloomEnabled = params.bloomEnabled === true;
119
+ const nextBloomIntensity = typeof params.bloomIntensity === "number" ? Math.max(0, params.bloomIntensity) : 1.25;
120
+ const nextBloomThreshold = typeof params.bloomThreshold === "number" ? clamp01(params.bloomThreshold) : 0.6;
121
+ const nextBloomRadius = typeof params.bloomRadius === "number" ? Math.max(0, params.bloomRadius) : 6;
122
+ const nextBloomSoftness = typeof params.bloomSoftness === "number" ? clamp01(params.bloomSoftness) : 0.35;
123
+ const [red, green, blue] = parseCssColorRgb(typeof params.monoColor === "string" ? params.monoColor : "#f5f5f0");
124
+ this.bgOpacityUniform.value = nextBgOpacity;
125
+ this.bloomIntensityUniform.value = nextBloomIntensity;
126
+ this.bloomRadiusUniform.value = nextBloomRadius;
127
+ this.bloomSoftnessUniform.value = nextBloomSoftness;
128
+ this.bloomThresholdUniform.value = nextBloomThreshold;
129
+ this.cellSizeUniform.value = nextCellSize;
130
+ this.colorModeUniform.value = this.getColorModeValue(nextColorMode);
131
+ this.customColorCountUniform.value = nextCustomColorCount;
132
+ this.customLuminanceBiasUniform.value = nextCustomLuminanceBias;
133
+ this.invertUniform.value = params.invert === true ? 1 : 0;
134
+ this.monoRedUniform.value = red;
135
+ this.monoGreenUniform.value = green;
136
+ this.monoBlueUniform.value = blue;
137
+ this.setCustomColorUniform(this.customBgColorUniform, typeof params.customBgColor === "string" ? params.customBgColor : "#F5F5F0");
138
+ this.setCustomColorUniform(this.customColor1Uniform, typeof params.customColor1 === "string" ? params.customColor1 : "#0d1014");
139
+ this.setCustomColorUniform(this.customColor2Uniform, typeof params.customColor2 === "string" ? params.customColor2 : "#4d5057");
140
+ this.setCustomColorUniform(this.customColor3Uniform, typeof params.customColor3 === "string" ? params.customColor3 : "#969aa2");
141
+ this.setCustomColorUniform(this.customColor4Uniform, typeof params.customColor4 === "string" ? params.customColor4 : "#e1e2de");
142
+ const needsAtlasRebuild = nextCellSize !== this.currentCellSize || nextPreset !== this.currentPreset;
143
+ this.currentCellSize = nextCellSize;
144
+ this.currentPreset = nextPreset;
145
+ if (nextBloomEnabled !== this.bloomEnabled) {
146
+ this.bloomEnabled = nextBloomEnabled;
147
+ this.rebuildEffectNode();
148
+ return;
149
+ }
150
+ if (this.bloomNode) {
151
+ this.bloomNode.strength.value = nextBloomIntensity;
152
+ this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius);
153
+ this.bloomNode.threshold.value = nextBloomThreshold;
154
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(nextBloomSoftness);
155
+ }
156
+ if (needsAtlasRebuild) {
157
+ this.rebuildAtlas();
158
+ }
159
+ }
160
+ updateLogicalSize(width, height) {
161
+ this.logicalWidthUniform.value = Math.max(1, width);
162
+ this.logicalHeightUniform.value = Math.max(1, height);
163
+ }
164
+ needsContinuousRender() {
165
+ return this.atlasPending || this.needsRefresh;
166
+ }
167
+ dispose() {
168
+ this.disposeBloomNode();
169
+ this.placeholder.dispose();
170
+ this.atlasTexture?.dispose();
171
+ super.dispose();
172
+ }
173
+ buildEffectNode() {
174
+ if (!(this.cellSizeUniform && this.numPatternsUniform && this.placeholder)) {
175
+ return this.inputNode;
176
+ }
177
+ this.disposeBloomNode();
178
+ this.bloomNode = null;
179
+ this.sourceTextureNodes = [];
180
+ this.atlasTextureNodes = [];
181
+ const renderTargetUv = vec2(uv().x, float(1).sub(uv().y));
182
+ const logicalScreenSize = vec2(this.logicalWidthUniform, this.logicalHeightUniform);
183
+ const normalizedCellSize = vec2(this.cellSizeUniform, this.cellSizeUniform).div(logicalScreenSize);
184
+ const quantizeLevels = vec3(float(7), float(7), float(3));
185
+ const inverseQuantizeLevels = vec3(float(1 / 7), float(1 / 7), float(1 / 3));
186
+ const customBgVec = vec3(float(this.customBgColorUniform.x), float(this.customBgColorUniform.y), float(this.customBgColorUniform.z));
187
+ const customColor1Vec = vec3(float(this.customColor1Uniform.x), float(this.customColor1Uniform.y), float(this.customColor1Uniform.z));
188
+ const customColor2Vec = vec3(float(this.customColor2Uniform.x), float(this.customColor2Uniform.y), float(this.customColor2Uniform.z));
189
+ const customColor3Vec = vec3(float(this.customColor3Uniform.x), float(this.customColor3Uniform.y), float(this.customColor3Uniform.z));
190
+ const customColor4Vec = vec3(float(this.customColor4Uniform.x), float(this.customColor4Uniform.y), float(this.customColor4Uniform.z));
191
+ const customColorCount = clamp(float(this.customColorCountUniform), float(2), float(4));
192
+ const samplePattern = (sampleUv) => {
193
+ const safeUv = clamp(sampleUv, vec2(float(0), float(0)), vec2(float(1), float(1)));
194
+ const screenPixel = floor(safeUv.mul(logicalScreenSize));
195
+ const tileCenterUv = floor(safeUv.div(normalizedCellSize))
196
+ .add(vec2(0.5, 0.5))
197
+ .mul(normalizedCellSize);
198
+ const localCellPixel = vec2(mod(screenPixel.x, this.cellSizeUniform), mod(screenPixel.y, this.cellSizeUniform));
199
+ const sampledColor = this.trackSourceTextureNode(tileCenterUv);
200
+ const sourceColor = vec3(float(sampledColor.r), float(sampledColor.g), float(sampledColor.b));
201
+ const luma = float(sampledColor.r)
202
+ .mul(float(0.299))
203
+ .add(float(sampledColor.g).mul(float(0.45)))
204
+ .add(float(sampledColor.b).mul(float(0.114)));
205
+ const adjustedLuma = select(this.invertUniform.greaterThan(float(0.5)), float(1).sub(luma), luma);
206
+ const patternIndex = floor(clamp(adjustedLuma.mul(this.numPatternsUniform.sub(float(1))), float(0), this.numPatternsUniform.sub(float(1))));
207
+ const atlasUv = vec2(patternIndex
208
+ .mul(this.cellSizeUniform)
209
+ .add(localCellPixel.x)
210
+ .add(float(0.5))
211
+ .div(this.numPatternsUniform.mul(this.cellSizeUniform)), localCellPixel.y.add(float(0.5)).div(this.cellSizeUniform));
212
+ const patternMask = float(this.trackAtlasTextureNode(atlasUv).r);
213
+ const quantized = floor(sourceColor.mul(quantizeLevels).add(vec3(0.5, 0.5, 0.5))).mul(inverseQuantizeLevels);
214
+ const quantizedLuma = float(quantized.x)
215
+ .mul(float(0.299))
216
+ .add(float(quantized.y).mul(float(0.45)))
217
+ .add(float(quantized.z).mul(float(0.114)));
218
+ const quantizedColor = clamp(mix(vec3(quantizedLuma, quantizedLuma, quantizedLuma), quantized, float(1.2)), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1)));
219
+ const monochromeColor = vec3(this.monoRedUniform, this.monoGreenUniform, this.monoBlueUniform).mul(adjustedLuma);
220
+ const customLuminance = clamp(adjustedLuma.add(float(this.customLuminanceBiasUniform).mul(float(0.35))), float(0), float(1));
221
+ const customColor = select(customColorCount.lessThan(float(2.5)), select(customLuminance.lessThan(float(0.5)), customColor1Vec, customColor2Vec), select(customColorCount.lessThan(float(3.5)), select(customLuminance.lessThan(float(1 / 3)), customColor1Vec, select(customLuminance.lessThan(float(2 / 3)), customColor2Vec, customColor3Vec)), select(customLuminance.lessThan(float(0.25)), customColor1Vec, select(customLuminance.lessThan(float(0.5)), customColor2Vec, select(customLuminance.lessThan(float(0.75)), customColor3Vec, customColor4Vec)))));
222
+ const patternColor = select(this.colorModeUniform.lessThan(float(0.5)), sourceColor, select(this.colorModeUniform.lessThan(float(1.5)), quantizedColor, select(this.colorModeUniform.lessThan(float(2.5)), monochromeColor, customColor)));
223
+ const sourceBackground = sourceColor.mul(this.bgOpacityUniform);
224
+ const backgroundColor = select(this.colorModeUniform.lessThan(float(0.5)), sourceBackground, select(this.colorModeUniform.lessThan(float(2.5)), vec3(float(0), float(0), float(0)), customBgVec));
225
+ return vec4(mix(backgroundColor, patternColor, patternMask), float(1));
226
+ };
227
+ const baseSample = samplePattern(renderTargetUv);
228
+ if (!this.bloomEnabled) {
229
+ return baseSample;
230
+ }
231
+ this.bloomNode = bloom(vec4(baseSample.rgb, float(1)), this.bloomIntensityUniform.value, this.normalizeBloomRadius(this.bloomRadiusUniform.value), this.bloomThresholdUniform.value);
232
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
233
+ return vec4(clamp(baseSample.rgb.add(this.getBloomTextureNode().rgb), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
234
+ }
235
+ getColorModeValue(colorMode) {
236
+ switch (colorMode) {
237
+ case "quantized":
238
+ return 1;
239
+ case "monochrome":
240
+ return 2;
241
+ case "custom":
242
+ return 3;
243
+ default:
244
+ return 0;
245
+ }
246
+ }
247
+ rebuildAtlas() {
248
+ const requestId = ++this.atlasBuildRequestId;
249
+ this.atlasPending = true;
250
+ void buildPatternAtlas(this.currentPreset, this.currentCellSize)
251
+ .then((atlasTexture) => {
252
+ if (requestId !== this.atlasBuildRequestId) {
253
+ atlasTexture.dispose();
254
+ return;
255
+ }
256
+ this.atlasTexture?.dispose();
257
+ this.atlasTexture = atlasTexture;
258
+ this.numPatternsUniform.value = atlasTexture.image.width / this.currentCellSize;
259
+ this.atlasPending = false;
260
+ this.needsRefresh = true;
261
+ this.rebuildEffectNode();
262
+ })
263
+ .catch(() => {
264
+ if (requestId !== this.atlasBuildRequestId) {
265
+ return;
266
+ }
267
+ this.atlasPending = false;
268
+ this.needsRefresh = true;
269
+ });
270
+ }
271
+ resolveColorMode(value) {
272
+ return value === "quantized" || value === "monochrome" || value === "custom"
273
+ ? value
274
+ : "source";
275
+ }
276
+ resolvePreset(value) {
277
+ return value === "candles" || value === "shapes" ? value : "bars";
278
+ }
279
+ normalizeBloomRadius(value) {
280
+ return clamp01(value / 24);
281
+ }
282
+ normalizeBloomSoftness(value) {
283
+ return Math.max(0.001, value * 0.25);
284
+ }
285
+ disposeBloomNode() {
286
+ ;
287
+ this.bloomNode?.dispose?.();
288
+ }
289
+ getBloomTextureNode() {
290
+ const bloomNode = this.bloomNode;
291
+ if (!bloomNode) {
292
+ throw new Error("Bloom node is not initialized");
293
+ }
294
+ if ("getTextureNode" in bloomNode && typeof bloomNode.getTextureNode === "function") {
295
+ return bloomNode.getTextureNode();
296
+ }
297
+ if ("getTexture" in bloomNode && typeof bloomNode.getTexture === "function") {
298
+ return bloomNode.getTexture();
299
+ }
300
+ throw new Error("Bloom node does not expose a texture getter");
301
+ }
302
+ trackAtlasTextureNode(uvNode) {
303
+ const atlasTextureNode = tslTexture(this.atlasTexture ?? new THREE.Texture(), uvNode);
304
+ this.atlasTextureNodes.push(atlasTextureNode);
305
+ return atlasTextureNode;
306
+ }
307
+ trackSourceTextureNode(uvNode) {
308
+ const sourceTextureNode = tslTexture(this.placeholder, uvNode);
309
+ this.sourceTextureNodes.push(sourceTextureNode);
310
+ return sourceTextureNode;
311
+ }
312
+ setCustomColorUniform(target, value) {
313
+ const [r, g, b] = parseCssColorRgb(value);
314
+ target.value.set(r, g, b);
315
+ }
316
+ }
@@ -0,0 +1,39 @@
1
+ import * as THREE from "three/webgpu";
2
+ import type { ShaderLabLayerConfig } from "../types";
3
+ export declare class PipelineManager {
4
+ private readonly renderer;
5
+ private readonly baseScene;
6
+ private readonly baseCamera;
7
+ private readonly blitScene;
8
+ private readonly blitCamera;
9
+ private readonly blitInputNode;
10
+ private readonly blitMaterial;
11
+ private readonly onRuntimeError;
12
+ private passMap;
13
+ private passes;
14
+ private layerSignatures;
15
+ private dirty;
16
+ private width;
17
+ private height;
18
+ private logicalWidth;
19
+ private logicalHeight;
20
+ private rtA;
21
+ private rtB;
22
+ constructor(renderer: THREE.WebGPURenderer, size: {
23
+ height: number;
24
+ width: number;
25
+ }, onRuntimeError?: (message: string | null) => void);
26
+ syncLayers(layers: ShaderLabLayerConfig[]): void;
27
+ render(time: number, delta: number): boolean;
28
+ resize(size: {
29
+ height: number;
30
+ width: number;
31
+ }): void;
32
+ updateLogicalSize(size: {
33
+ height: number;
34
+ width: number;
35
+ }): void;
36
+ dispose(): void;
37
+ private applyLayerState;
38
+ private createPass;
39
+ }