@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
@@ -1,97 +0,0 @@
1
- import * as THREE from "three/webgpu"
2
-
3
- export const PATTERN_PRESET_SOURCES = {
4
- bars: [
5
- "/assets/patterns/bars/1.svg",
6
- "/assets/patterns/bars/2.svg",
7
- "/assets/patterns/bars/3.svg",
8
- "/assets/patterns/bars/4.svg",
9
- "/assets/patterns/bars/5.svg",
10
- "/assets/patterns/bars/6.svg",
11
- ],
12
- candles: [
13
- "/assets/patterns/candles/1.svg",
14
- "/assets/patterns/candles/2.svg",
15
- "/assets/patterns/candles/3.svg",
16
- "/assets/patterns/candles/4.svg",
17
- ],
18
- shapes: [
19
- "/assets/patterns/shapes/1.svg",
20
- "/assets/patterns/shapes/2.svg",
21
- "/assets/patterns/shapes/3.svg",
22
- "/assets/patterns/shapes/4.svg",
23
- "/assets/patterns/shapes/5.svg",
24
- "/assets/patterns/shapes/6.svg",
25
- ],
26
- } as const
27
-
28
- export type PatternPreset = keyof typeof PATTERN_PRESET_SOURCES
29
-
30
- function loadSvg(url: string): Promise<HTMLImageElement> {
31
- return new Promise((resolve, reject) => {
32
- const image = new Image()
33
- image.decoding = "async"
34
- image.onload = () => resolve(image)
35
- image.onerror = () => reject(new Error(`Unable to load SVG pattern: ${url}`))
36
- image.src = url
37
- })
38
- }
39
-
40
- export async function buildPatternAtlas(
41
- preset: PatternPreset,
42
- cellPx = 16,
43
- ): Promise<THREE.CanvasTexture> {
44
- const urls = PATTERN_PRESET_SOURCES[preset]
45
- const cellSize = Math.max(4, Math.round(cellPx))
46
- const images = await Promise.all(urls.map((url) => loadSvg(url)))
47
- const canvas = document.createElement("canvas")
48
- canvas.width = urls.length * cellSize
49
- canvas.height = cellSize
50
-
51
- const context = canvas.getContext("2d")
52
-
53
- if (!context) {
54
- throw new Error("Unable to create 2D context for pattern atlas")
55
- }
56
-
57
- context.clearRect(0, 0, canvas.width, canvas.height)
58
- context.fillStyle = "#000"
59
- context.fillRect(0, 0, canvas.width, canvas.height)
60
- context.imageSmoothingEnabled = true
61
-
62
- for (const [index, image] of images.entries()) {
63
- const aspect = image.naturalWidth / Math.max(image.naturalHeight, 1)
64
- const drawWidth = aspect >= 1 ? cellSize : cellSize * aspect
65
- const drawHeight = aspect >= 1 ? cellSize / Math.max(aspect, 0.0001) : cellSize
66
- const x = index * cellSize + (cellSize - drawWidth) * 0.5
67
- const y = (cellSize - drawHeight) * 0.5
68
-
69
- context.drawImage(image, x, y, drawWidth, drawHeight)
70
- }
71
-
72
- const imageData = context.getImageData(0, 0, canvas.width, canvas.height)
73
- const { data } = imageData
74
-
75
- for (let index = 0; index < data.length; index += 4) {
76
- const alpha = data[index + 3] ?? 0
77
- const luminance = Math.max(data[index] ?? 0, data[index + 1] ?? 0, data[index + 2] ?? 0)
78
- const mask = alpha > 0 && luminance > 32 ? 255 : 0
79
- data[index] = mask
80
- data[index + 1] = mask
81
- data[index + 2] = mask
82
- data[index + 3] = 255
83
- }
84
-
85
- context.putImageData(imageData, 0, 0)
86
-
87
- const texture = new THREE.CanvasTexture(canvas)
88
- texture.flipY = false
89
- texture.generateMipmaps = false
90
- texture.magFilter = THREE.NearestFilter
91
- texture.minFilter = THREE.NearestFilter
92
- texture.wrapS = THREE.ClampToEdgeWrapping
93
- texture.wrapT = THREE.ClampToEdgeWrapping
94
- texture.needsUpdate = true
95
-
96
- return texture
97
- }
@@ -1,552 +0,0 @@
1
- import * as THREE from "three/webgpu"
2
- import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js"
3
- import {
4
- clamp,
5
- float,
6
- floor,
7
- mix,
8
- mod,
9
- select,
10
- texture as tslTexture,
11
- type TSLNode,
12
- uniform,
13
- uv,
14
- vec2,
15
- vec3,
16
- vec4,
17
- } from "three/tsl"
18
- import {
19
- buildPatternAtlas,
20
- type PatternPreset,
21
- } from "@/renderer/pattern-atlas"
22
- import { PassNode } from "@/renderer/pass-node"
23
- import type { LayerParameterValues } from "@/types/editor"
24
-
25
- type Node = TSLNode
26
- type PatternColorMode = "custom" | "monochrome" | "quantized" | "source"
27
-
28
- function clamp01(value: number): number {
29
- return Math.max(0, Math.min(1, value))
30
- }
31
-
32
- function parseCssColorRgb(value: string): [number, number, number] {
33
- const rgba = value.match(
34
- /rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*[\d.]+)?\s*\)/i,
35
- )
36
-
37
- if (rgba) {
38
- return [
39
- clamp01(Number.parseFloat(rgba[1] ?? "0") / 255),
40
- clamp01(Number.parseFloat(rgba[2] ?? "0") / 255),
41
- clamp01(Number.parseFloat(rgba[3] ?? "0") / 255),
42
- ]
43
- }
44
-
45
- const hex = value.trim().replace("#", "")
46
-
47
- if (hex.length === 6) {
48
- return [
49
- Number.parseInt(hex.slice(0, 2), 16) / 255,
50
- Number.parseInt(hex.slice(2, 4), 16) / 255,
51
- Number.parseInt(hex.slice(4, 6), 16) / 255,
52
- ]
53
- }
54
-
55
- if (hex.length === 3) {
56
- return [
57
- Number.parseInt(`${hex[0] ?? "0"}${hex[0] ?? "0"}`, 16) / 255,
58
- Number.parseInt(`${hex[1] ?? "0"}${hex[1] ?? "0"}`, 16) / 255,
59
- Number.parseInt(`${hex[2] ?? "0"}${hex[2] ?? "0"}`, 16) / 255,
60
- ]
61
- }
62
-
63
- return [1, 1, 1]
64
- }
65
-
66
- export class PatternPass extends PassNode {
67
- private atlasTexture: THREE.CanvasTexture | null = null
68
- private atlasTextureNodes: Node[] = []
69
- private bloomEnabled = false
70
- private bloomNode: ReturnType<typeof bloom> | null = null
71
- private readonly bloomIntensityUniform: Node
72
- private readonly bloomRadiusUniform: Node
73
- private readonly bloomSoftnessUniform: Node
74
- private readonly bloomThresholdUniform: Node
75
- private sourceTextureNodes: Node[] = []
76
-
77
- private readonly bgOpacityUniform: Node
78
- private readonly cellSizeUniform: Node
79
- private readonly colorModeUniform: Node
80
- private readonly customBgColorUniform: Node
81
- private readonly customColor1Uniform: Node
82
- private readonly customColor2Uniform: Node
83
- private readonly customColor3Uniform: Node
84
- private readonly customColor4Uniform: Node
85
- private readonly customColorCountUniform: Node
86
- private readonly customLuminanceBiasUniform: Node
87
- private readonly invertUniform: Node
88
- private readonly logicalHeightUniform: Node
89
- private readonly logicalWidthUniform: Node
90
- private readonly monoBlueUniform: Node
91
- private readonly monoGreenUniform: Node
92
- private readonly monoRedUniform: Node
93
- private readonly numPatternsUniform: Node
94
- private readonly placeholder: THREE.Texture
95
-
96
- private atlasBuildRequestId = 0
97
- private atlasPending = false
98
- private currentCellSize = 12
99
- private currentPreset: PatternPreset = "bars"
100
- private needsRefresh = false
101
-
102
- constructor(layerId: string) {
103
- super(layerId)
104
- this.placeholder = new THREE.Texture()
105
- this.bloomIntensityUniform = uniform(1.25)
106
- this.bloomRadiusUniform = uniform(6)
107
- this.bloomSoftnessUniform = uniform(0.35)
108
- this.bloomThresholdUniform = uniform(0.6)
109
- this.bgOpacityUniform = uniform(0)
110
- this.cellSizeUniform = uniform(12)
111
- this.colorModeUniform = uniform(0)
112
- this.customColorCountUniform = uniform(4)
113
- this.customLuminanceBiasUniform = uniform(0)
114
- this.customBgColorUniform = uniform(new THREE.Vector3(0.96, 0.96, 0.94))
115
- this.customColor1Uniform = uniform(new THREE.Vector3(0.05, 0.063, 0.078))
116
- this.customColor2Uniform = uniform(new THREE.Vector3(0.302, 0.314, 0.341))
117
- this.customColor3Uniform = uniform(new THREE.Vector3(0.588, 0.604, 0.635))
118
- this.customColor4Uniform = uniform(new THREE.Vector3(0.882, 0.886, 0.871))
119
- this.invertUniform = uniform(0)
120
- this.logicalWidthUniform = uniform(1)
121
- this.logicalHeightUniform = uniform(1)
122
- this.monoRedUniform = uniform(0.96)
123
- this.monoGreenUniform = uniform(0.96)
124
- this.monoBlueUniform = uniform(0.94)
125
- this.numPatternsUniform = uniform(1)
126
- this.rebuildAtlas()
127
- this.rebuildEffectNode()
128
- }
129
-
130
- override render(
131
- renderer: THREE.WebGPURenderer,
132
- inputTexture: THREE.Texture,
133
- outputTarget: THREE.WebGLRenderTarget,
134
- time: number,
135
- delta: number,
136
- ): void {
137
- for (const sourceTextureNode of this.sourceTextureNodes) {
138
- sourceTextureNode.value = inputTexture
139
- }
140
-
141
- if (this.atlasTexture) {
142
- for (const atlasTextureNode of this.atlasTextureNodes) {
143
- atlasTextureNode.value = this.atlasTexture
144
- }
145
- }
146
-
147
- super.render(renderer, inputTexture, outputTarget, time, delta)
148
- this.needsRefresh = false
149
- }
150
-
151
- override updateParams(params: LayerParameterValues): void {
152
- const nextCellSize =
153
- typeof params.cellSize === "number" ? Math.max(4, Math.round(params.cellSize)) : 12
154
- const nextPreset = this.resolvePreset(params.preset)
155
- const nextColorMode = this.resolveColorMode(params.colorMode)
156
- const nextBgOpacity =
157
- typeof params.bgOpacity === "number" ? clamp01(params.bgOpacity) : 0
158
- const nextCustomColorCount =
159
- typeof params.customColorCount === "number"
160
- ? Math.min(4, Math.max(2, Math.round(params.customColorCount)))
161
- : 4
162
- const nextCustomLuminanceBias =
163
- typeof params.customLuminanceBias === "number"
164
- ? Math.min(1, Math.max(-1, params.customLuminanceBias))
165
- : 0
166
- const nextBloomEnabled = params.bloomEnabled === true
167
- const nextBloomIntensity =
168
- typeof params.bloomIntensity === "number" ? Math.max(0, params.bloomIntensity) : 1.25
169
- const nextBloomThreshold =
170
- typeof params.bloomThreshold === "number" ? clamp01(params.bloomThreshold) : 0.6
171
- const nextBloomRadius =
172
- typeof params.bloomRadius === "number" ? Math.max(0, params.bloomRadius) : 6
173
- const nextBloomSoftness =
174
- typeof params.bloomSoftness === "number" ? clamp01(params.bloomSoftness) : 0.35
175
- const [red, green, blue] = parseCssColorRgb(
176
- typeof params.monoColor === "string" ? params.monoColor : "#f5f5f0",
177
- )
178
-
179
- this.bgOpacityUniform.value = nextBgOpacity
180
- this.bloomIntensityUniform.value = nextBloomIntensity
181
- this.bloomRadiusUniform.value = nextBloomRadius
182
- this.bloomSoftnessUniform.value = nextBloomSoftness
183
- this.bloomThresholdUniform.value = nextBloomThreshold
184
- this.cellSizeUniform.value = nextCellSize
185
- this.colorModeUniform.value = this.getColorModeValue(nextColorMode)
186
- this.customColorCountUniform.value = nextCustomColorCount
187
- this.customLuminanceBiasUniform.value = nextCustomLuminanceBias
188
- this.invertUniform.value = params.invert === true ? 1 : 0
189
- this.monoRedUniform.value = red
190
- this.monoGreenUniform.value = green
191
- this.monoBlueUniform.value = blue
192
- this.setCustomColorUniform(
193
- this.customBgColorUniform,
194
- typeof params.customBgColor === "string" ? params.customBgColor : "#F5F5F0",
195
- )
196
- this.setCustomColorUniform(
197
- this.customColor1Uniform,
198
- typeof params.customColor1 === "string" ? params.customColor1 : "#0d1014",
199
- )
200
- this.setCustomColorUniform(
201
- this.customColor2Uniform,
202
- typeof params.customColor2 === "string" ? params.customColor2 : "#4d5057",
203
- )
204
- this.setCustomColorUniform(
205
- this.customColor3Uniform,
206
- typeof params.customColor3 === "string" ? params.customColor3 : "#969aa2",
207
- )
208
- this.setCustomColorUniform(
209
- this.customColor4Uniform,
210
- typeof params.customColor4 === "string" ? params.customColor4 : "#e1e2de",
211
- )
212
-
213
- const needsAtlasRebuild =
214
- nextCellSize !== this.currentCellSize || nextPreset !== this.currentPreset
215
-
216
- this.currentCellSize = nextCellSize
217
- this.currentPreset = nextPreset
218
-
219
- if (nextBloomEnabled !== this.bloomEnabled) {
220
- this.bloomEnabled = nextBloomEnabled
221
- this.rebuildEffectNode()
222
- return
223
- }
224
-
225
- if (this.bloomNode) {
226
- this.bloomNode.strength.value = nextBloomIntensity
227
- this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius)
228
- this.bloomNode.threshold.value = nextBloomThreshold
229
- this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(nextBloomSoftness)
230
- }
231
-
232
- if (needsAtlasRebuild) {
233
- this.rebuildAtlas()
234
- }
235
- }
236
-
237
- override updateLogicalSize(width: number, height: number): void {
238
- this.logicalWidthUniform.value = Math.max(1, width)
239
- this.logicalHeightUniform.value = Math.max(1, height)
240
- }
241
-
242
- override needsContinuousRender(): boolean {
243
- return this.atlasPending || this.needsRefresh
244
- }
245
-
246
- override dispose(): void {
247
- this.disposeBloomNode()
248
- this.placeholder.dispose()
249
- this.atlasTexture?.dispose()
250
- super.dispose()
251
- }
252
-
253
- protected override buildEffectNode(): Node {
254
- if (!(this.cellSizeUniform && this.numPatternsUniform && this.placeholder)) {
255
- return this.inputNode
256
- }
257
-
258
- this.disposeBloomNode()
259
- this.bloomNode = null
260
- this.sourceTextureNodes = []
261
- this.atlasTextureNodes = []
262
-
263
- const renderTargetUv = vec2(uv().x, float(1).sub(uv().y))
264
- const logicalScreenSize = vec2(this.logicalWidthUniform, this.logicalHeightUniform)
265
- const normalizedCellSize = vec2(this.cellSizeUniform, this.cellSizeUniform).div(
266
- logicalScreenSize,
267
- )
268
- const quantizeLevels = vec3(float(7), float(7), float(3))
269
- const inverseQuantizeLevels = vec3(float(1 / 7), float(1 / 7), float(1 / 3))
270
- const customBgVec = vec3(
271
- float(this.customBgColorUniform.x),
272
- float(this.customBgColorUniform.y),
273
- float(this.customBgColorUniform.z),
274
- )
275
- const customColor1Vec = vec3(
276
- float(this.customColor1Uniform.x),
277
- float(this.customColor1Uniform.y),
278
- float(this.customColor1Uniform.z),
279
- )
280
- const customColor2Vec = vec3(
281
- float(this.customColor2Uniform.x),
282
- float(this.customColor2Uniform.y),
283
- float(this.customColor2Uniform.z),
284
- )
285
- const customColor3Vec = vec3(
286
- float(this.customColor3Uniform.x),
287
- float(this.customColor3Uniform.y),
288
- float(this.customColor3Uniform.z),
289
- )
290
- const customColor4Vec = vec3(
291
- float(this.customColor4Uniform.x),
292
- float(this.customColor4Uniform.y),
293
- float(this.customColor4Uniform.z),
294
- )
295
- const customColorCount = clamp(
296
- float(this.customColorCountUniform),
297
- float(2),
298
- float(4),
299
- )
300
-
301
- const samplePattern = (sampleUv: Node) => {
302
- const safeUv = clamp(sampleUv, vec2(float(0), float(0)), vec2(float(1), float(1)))
303
- const screenPixel = floor(safeUv.mul(logicalScreenSize))
304
- const tileCenterUv = floor(safeUv.div(normalizedCellSize))
305
- .add(vec2(0.5, 0.5))
306
- .mul(normalizedCellSize)
307
- const localCellPixel = vec2(
308
- mod(screenPixel.x, this.cellSizeUniform),
309
- mod(screenPixel.y, this.cellSizeUniform),
310
- )
311
- const sampledColor = this.trackSourceTextureNode(tileCenterUv)
312
- const sourceColor = vec3(
313
- float(sampledColor.r),
314
- float(sampledColor.g),
315
- float(sampledColor.b),
316
- )
317
- const luma = float(sampledColor.r)
318
- .mul(float(0.299))
319
- .add(float(sampledColor.g).mul(float(0.45)))
320
- .add(float(sampledColor.b).mul(float(0.114)))
321
- const adjustedLuma = select(
322
- this.invertUniform.greaterThan(float(0.5)),
323
- float(1).sub(luma),
324
- luma,
325
- )
326
- const patternIndex = floor(
327
- clamp(
328
- adjustedLuma.mul(this.numPatternsUniform.sub(float(1))),
329
- float(0),
330
- this.numPatternsUniform.sub(float(1)),
331
- ),
332
- )
333
- const atlasUv = vec2(
334
- patternIndex
335
- .mul(this.cellSizeUniform)
336
- .add(localCellPixel.x)
337
- .add(float(0.5))
338
- .div(this.numPatternsUniform.mul(this.cellSizeUniform)),
339
- localCellPixel.y.add(float(0.5)).div(this.cellSizeUniform),
340
- )
341
- const patternMask = float(this.trackAtlasTextureNode(atlasUv).r)
342
- const quantized = floor(sourceColor.mul(quantizeLevels).add(vec3(0.5, 0.5, 0.5))).mul(
343
- inverseQuantizeLevels,
344
- )
345
- const quantizedLuma = float(quantized.x)
346
- .mul(float(0.299))
347
- .add(float(quantized.y).mul(float(0.45)))
348
- .add(float(quantized.z).mul(float(0.114)))
349
- const quantizedColor = clamp(
350
- mix(vec3(quantizedLuma, quantizedLuma, quantizedLuma), quantized, float(1.2)),
351
- vec3(float(0), float(0), float(0)),
352
- vec3(float(1), float(1), float(1)),
353
- )
354
- const monochromeColor = vec3(
355
- this.monoRedUniform,
356
- this.monoGreenUniform,
357
- this.monoBlueUniform,
358
- ).mul(adjustedLuma)
359
- const customLuminance = clamp(
360
- adjustedLuma.add(float(this.customLuminanceBiasUniform).mul(float(0.35))),
361
- float(0),
362
- float(1),
363
- )
364
- const customColor = select(
365
- customColorCount.lessThan(float(2.5)),
366
- select(
367
- customLuminance.lessThan(float(0.5)),
368
- customColor1Vec,
369
- customColor2Vec,
370
- ),
371
- select(
372
- customColorCount.lessThan(float(3.5)),
373
- select(
374
- customLuminance.lessThan(float(1 / 3)),
375
- customColor1Vec,
376
- select(
377
- customLuminance.lessThan(float(2 / 3)),
378
- customColor2Vec,
379
- customColor3Vec,
380
- ),
381
- ),
382
- select(
383
- customLuminance.lessThan(float(0.25)),
384
- customColor1Vec,
385
- select(
386
- customLuminance.lessThan(float(0.5)),
387
- customColor2Vec,
388
- select(
389
- customLuminance.lessThan(float(0.75)),
390
- customColor3Vec,
391
- customColor4Vec,
392
- ),
393
- ),
394
- ),
395
- ),
396
- )
397
- const patternColor = select(
398
- this.colorModeUniform.lessThan(float(0.5)),
399
- sourceColor,
400
- select(
401
- this.colorModeUniform.lessThan(float(1.5)),
402
- quantizedColor,
403
- select(
404
- this.colorModeUniform.lessThan(float(2.5)),
405
- monochromeColor,
406
- customColor,
407
- ),
408
- ),
409
- )
410
- const sourceBackground = sourceColor.mul(this.bgOpacityUniform)
411
- const backgroundColor = select(
412
- this.colorModeUniform.lessThan(float(0.5)),
413
- sourceBackground,
414
- select(
415
- this.colorModeUniform.lessThan(float(2.5)),
416
- vec3(float(0), float(0), float(0)),
417
- customBgVec,
418
- ),
419
- )
420
-
421
- return vec4(mix(backgroundColor, patternColor, patternMask), float(1))
422
- }
423
-
424
- const baseSample = samplePattern(renderTargetUv)
425
-
426
- if (!this.bloomEnabled) {
427
- return baseSample
428
- }
429
-
430
- this.bloomNode = bloom(
431
- vec4(baseSample.rgb, float(1)),
432
- this.bloomIntensityUniform.value as number,
433
- this.normalizeBloomRadius(this.bloomRadiusUniform.value as number),
434
- this.bloomThresholdUniform.value as number,
435
- )
436
- this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(
437
- this.bloomSoftnessUniform.value as number,
438
- )
439
-
440
- return vec4(
441
- clamp(
442
- baseSample.rgb.add(this.getBloomTextureNode().rgb),
443
- vec3(float(0), float(0), float(0)),
444
- vec3(float(1), float(1), float(1)),
445
- ),
446
- float(1),
447
- )
448
- }
449
-
450
- private getColorModeValue(colorMode: PatternColorMode): number {
451
- switch (colorMode) {
452
- case "quantized":
453
- return 1
454
- case "monochrome":
455
- return 2
456
- case "custom":
457
- return 3
458
- default:
459
- return 0
460
- }
461
- }
462
-
463
- private rebuildAtlas(): void {
464
- const requestId = ++this.atlasBuildRequestId
465
- this.atlasPending = true
466
-
467
- void buildPatternAtlas(this.currentPreset, this.currentCellSize)
468
- .then((atlasTexture) => {
469
- if (requestId !== this.atlasBuildRequestId) {
470
- atlasTexture.dispose()
471
- return
472
- }
473
-
474
- this.atlasTexture?.dispose()
475
- this.atlasTexture = atlasTexture
476
- this.numPatternsUniform.value = atlasTexture.image.width / this.currentCellSize
477
- this.atlasPending = false
478
- this.needsRefresh = true
479
- this.rebuildEffectNode()
480
- })
481
- .catch(() => {
482
- if (requestId !== this.atlasBuildRequestId) {
483
- return
484
- }
485
-
486
- this.atlasPending = false
487
- this.needsRefresh = true
488
- })
489
- }
490
-
491
- private resolveColorMode(value: unknown): PatternColorMode {
492
- return value === "quantized" || value === "monochrome" || value === "custom"
493
- ? value
494
- : "source"
495
- }
496
-
497
- private resolvePreset(value: unknown): PatternPreset {
498
- return value === "candles" || value === "shapes" ? value : "bars"
499
- }
500
-
501
- private normalizeBloomRadius(value: number): number {
502
- return clamp01(value / 24)
503
- }
504
-
505
- private normalizeBloomSoftness(value: number): number {
506
- return Math.max(0.001, value * 0.25)
507
- }
508
-
509
- private disposeBloomNode(): void {
510
- ;(this.bloomNode as { dispose?: () => void } | null)?.dispose?.()
511
- }
512
-
513
- private getBloomTextureNode(): Node {
514
- const bloomNode = this.bloomNode as
515
- | ({
516
- getTexture?: () => Node
517
- getTextureNode?: () => Node
518
- } & object)
519
- | null
520
-
521
- if (!bloomNode) {
522
- throw new Error("Bloom node is not initialized")
523
- }
524
-
525
- if ("getTextureNode" in bloomNode && typeof bloomNode.getTextureNode === "function") {
526
- return bloomNode.getTextureNode()
527
- }
528
-
529
- if ("getTexture" in bloomNode && typeof bloomNode.getTexture === "function") {
530
- return bloomNode.getTexture()
531
- }
532
-
533
- throw new Error("Bloom node does not expose a texture getter")
534
- }
535
-
536
- private trackAtlasTextureNode(uvNode: Node): Node {
537
- const atlasTextureNode = tslTexture(this.atlasTexture ?? new THREE.Texture(), uvNode)
538
- this.atlasTextureNodes.push(atlasTextureNode)
539
- return atlasTextureNode
540
- }
541
-
542
- private trackSourceTextureNode(uvNode: Node): Node {
543
- const sourceTextureNode = tslTexture(this.placeholder, uvNode)
544
- this.sourceTextureNodes.push(sourceTextureNode)
545
- return sourceTextureNode
546
- }
547
-
548
- private setCustomColorUniform(target: Node, value: string): void {
549
- const [r, g, b] = parseCssColorRgb(value)
550
- ;(target.value as THREE.Vector3).set(r, g, b)
551
- }
552
- }