@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,802 +0,0 @@
1
- import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js"
2
- import {
3
- clamp,
4
- float,
5
- max,
6
- mix,
7
- pow,
8
- select,
9
- sin,
10
- smoothstep,
11
- type TSLNode,
12
- texture as tslTexture,
13
- uniform,
14
- uv,
15
- vec2,
16
- vec3,
17
- vec4,
18
- } from "three/tsl"
19
- import * as THREE from "three/webgpu"
20
- import type { LayerParameterValues } from "../types/editor"
21
- import { loadImageTexture } from "./media-texture"
22
- import { PassNode } from "./pass-node"
23
- import { grainTexturePattern } from "./shaders/tsl/patterns/grain-texture-pattern"
24
-
25
- type Node = TSLNode
26
-
27
- const BLUE_NOISE_TEXTURE_URL = new URL(
28
- "../../../assets/textures/blue-noise.png",
29
- import.meta.url
30
- ).toString()
31
-
32
- const INTERNAL_TARGET_OPTIONS = {
33
- depthBuffer: false,
34
- format: THREE.RGBAFormat,
35
- generateMipmaps: false,
36
- magFilter: THREE.LinearFilter,
37
- minFilter: THREE.LinearFilter,
38
- stencilBuffer: false,
39
- type: THREE.HalfFloatType,
40
- } as const
41
-
42
- function clamp01(value: number): number {
43
- return Math.max(0, Math.min(1, value))
44
- }
45
-
46
- function hexToRgb(hex: string): [number, number, number] {
47
- const normalized = hex.trim().replace("#", "")
48
- const value =
49
- normalized.length === 3
50
- ? normalized
51
- .split("")
52
- .map((entry) => `${entry}${entry}`)
53
- .join("")
54
- : normalized.padEnd(6, "0").slice(0, 6)
55
-
56
- return [
57
- Number.parseInt(value.slice(0, 2), 16) / 255,
58
- Number.parseInt(value.slice(2, 4), 16) / 255,
59
- Number.parseInt(value.slice(4, 6), 16) / 255,
60
- ]
61
- }
62
-
63
- export class InkPass extends PassNode {
64
- private readonly blurScene: THREE.Scene
65
- private readonly compositeScene: THREE.Scene
66
- private readonly copyScene: THREE.Scene
67
- private readonly orthoCamera: THREE.OrthographicCamera
68
- private readonly blurMaterial: THREE.MeshBasicNodeMaterial
69
- private readonly compositeMaterial: THREE.MeshBasicNodeMaterial
70
- private readonly copyMaterial: THREE.MeshBasicNodeMaterial
71
- private readonly blurInputNode: Node
72
- private readonly crispInputNode: Node
73
- private readonly finalInputNode: Node
74
- private readonly copyInputNode: Node
75
- private readonly noiseInputNode: Node
76
-
77
- private blurSampleNodes: Node[] = []
78
- private compositeBlurNodes: Node[] = []
79
- private noiseSampleNodes: Node[] = []
80
-
81
- private bloomEnabled = false
82
- private bloomNode: ReturnType<typeof bloom> | null = null
83
- private readonly bloomIntensityUniform: Node
84
- private readonly bloomRadiusUniform: Node
85
- private readonly bloomSoftnessUniform: Node
86
- private readonly bloomThresholdUniform: Node
87
-
88
- private readonly backgroundColorUniform: Node
89
- private readonly coreColorUniform: Node
90
- private readonly edgeColorUniform: Node
91
- private readonly midColorUniform: Node
92
-
93
- private readonly blurStrengthUniform: Node
94
- private readonly crispBlendUniform: Node
95
- private readonly directionXUniform: Node
96
- private readonly directionYUniform: Node
97
- private readonly dripLengthUniform: Node
98
- private readonly dripWeightUniform: Node
99
- private readonly fluidNoiseUniform: Node
100
- private readonly grainEnabledUniform: Node
101
- private readonly grainIntensityUniform: Node
102
- private readonly grainScaleUniform: Node
103
- private readonly blurSpreadUniform: Node
104
- private readonly noiseScaleUniform: Node
105
- private readonly passIndexUniform: Node
106
- private readonly resolutionWidthUniform: Node
107
- private readonly resolutionHeightUniform: Node
108
- private readonly smokeSpeedUniform: Node
109
- private readonly smokeTurbulenceUniform: Node
110
- private readonly timeUniform: Node
111
-
112
- private blurPassCount = 12
113
- private crispPassCount = 3
114
- private compositeTarget: THREE.WebGLRenderTarget
115
- private crispTarget: THREE.WebGLRenderTarget
116
- private readTarget: THREE.WebGLRenderTarget
117
- private writeTarget: THREE.WebGLRenderTarget
118
- private readonly placeholder: THREE.Texture
119
- private noiseTexture: THREE.Texture | null = null
120
- private noiseLoadStarted = false
121
- private needsRefresh = true
122
- private width = 1
123
- private height = 1
124
- private isAnimated = true
125
-
126
- constructor(layerId: string) {
127
- super(layerId)
128
-
129
- this.orthoCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1)
130
- this.blurScene = new THREE.Scene()
131
- this.compositeScene = new THREE.Scene()
132
- this.copyScene = new THREE.Scene()
133
-
134
- this.placeholder = new THREE.Texture()
135
- const flippedUv = vec2(uv().x, float(1).sub(uv().y))
136
- this.blurInputNode = tslTexture(this.placeholder, flippedUv)
137
- this.crispInputNode = tslTexture(this.placeholder, flippedUv)
138
- this.finalInputNode = tslTexture(this.placeholder, flippedUv)
139
- this.copyInputNode = tslTexture(this.placeholder, flippedUv)
140
- this.noiseInputNode = tslTexture(this.placeholder, flippedUv)
141
-
142
- this.bloomIntensityUniform = uniform(1.25)
143
- this.bloomRadiusUniform = uniform(6)
144
- this.bloomSoftnessUniform = uniform(0.35)
145
- this.bloomThresholdUniform = uniform(0.6)
146
-
147
- this.backgroundColorUniform = uniform(
148
- new THREE.Vector3(0.039, 0.043, 0.051)
149
- )
150
- this.coreColorUniform = uniform(new THREE.Vector3(1.0, 0.992, 0.91))
151
- this.midColorUniform = uniform(new THREE.Vector3(0.784, 0.961, 0.259))
152
- this.edgeColorUniform = uniform(new THREE.Vector3(0.0, 0.788, 0.655))
153
-
154
- this.blurStrengthUniform = uniform(0.02)
155
- this.crispBlendUniform = uniform(0.75)
156
- this.directionXUniform = uniform(0.3746)
157
- this.directionYUniform = uniform(0.9271)
158
- this.dripLengthUniform = uniform(7.1)
159
- this.dripWeightUniform = uniform(1.2)
160
- this.fluidNoiseUniform = uniform(0.2)
161
- this.grainEnabledUniform = uniform(1)
162
- this.grainIntensityUniform = uniform(0.3)
163
- this.grainScaleUniform = uniform(1.5)
164
- this.blurSpreadUniform = uniform(1.7)
165
- this.noiseScaleUniform = uniform(1)
166
- this.passIndexUniform = uniform(0)
167
- this.resolutionWidthUniform = uniform(1)
168
- this.resolutionHeightUniform = uniform(1)
169
- this.smokeSpeedUniform = uniform(0.2)
170
- this.smokeTurbulenceUniform = uniform(0.25)
171
- this.timeUniform = uniform(0)
172
-
173
- this.readTarget = new THREE.WebGLRenderTarget(1, 1, INTERNAL_TARGET_OPTIONS)
174
- this.writeTarget = new THREE.WebGLRenderTarget(
175
- 1,
176
- 1,
177
- INTERNAL_TARGET_OPTIONS
178
- )
179
- this.crispTarget = new THREE.WebGLRenderTarget(
180
- 1,
181
- 1,
182
- INTERNAL_TARGET_OPTIONS
183
- )
184
- this.compositeTarget = new THREE.WebGLRenderTarget(
185
- 1,
186
- 1,
187
- INTERNAL_TARGET_OPTIONS
188
- )
189
-
190
- this.blurMaterial = new THREE.MeshBasicNodeMaterial()
191
- this.blurMaterial.colorNode = this.buildBlurNode()
192
- const blurMesh = new THREE.Mesh(
193
- new THREE.PlaneGeometry(2, 2),
194
- this.blurMaterial
195
- )
196
- blurMesh.frustumCulled = false
197
- this.blurScene.add(blurMesh)
198
-
199
- this.copyMaterial = new THREE.MeshBasicNodeMaterial()
200
- this.copyMaterial.colorNode = vec4(this.copyInputNode.rgb, float(1))
201
- const copyMesh = new THREE.Mesh(
202
- new THREE.PlaneGeometry(2, 2),
203
- this.copyMaterial
204
- )
205
- copyMesh.frustumCulled = false
206
- this.copyScene.add(copyMesh)
207
-
208
- this.compositeMaterial = new THREE.MeshBasicNodeMaterial()
209
- this.compositeMaterial.colorNode = this.buildCompositeNode()
210
- const compositeMesh = new THREE.Mesh(
211
- new THREE.PlaneGeometry(2, 2),
212
- this.compositeMaterial
213
- )
214
- compositeMesh.frustumCulled = false
215
- this.compositeScene.add(compositeMesh)
216
-
217
- this.rebuildEffectNode()
218
- }
219
-
220
- override render(
221
- renderer: THREE.WebGPURenderer,
222
- inputTexture: THREE.Texture,
223
- outputTarget: THREE.WebGLRenderTarget,
224
- time: number,
225
- delta: number
226
- ): void {
227
- this.ensureNoiseTexture()
228
-
229
- this.blurInputNode.value = inputTexture
230
- this.noiseInputNode.value = this.noiseTexture ?? this.placeholder
231
- for (const node of this.blurSampleNodes) {
232
- node.value = inputTexture
233
- }
234
- for (const node of this.noiseSampleNodes) {
235
- node.value = this.noiseTexture ?? this.placeholder
236
- }
237
- this.passIndexUniform.value = 0
238
-
239
- renderer.setRenderTarget(this.readTarget)
240
- renderer.render(this.blurScene, this.orthoCamera)
241
-
242
- if (this.crispPassCount <= 1) {
243
- this.copyInputNode.value = this.readTarget.texture
244
- renderer.setRenderTarget(this.crispTarget)
245
- renderer.render(this.copyScene, this.orthoCamera)
246
- }
247
-
248
- const totalPasses = Math.max(this.blurPassCount, this.crispPassCount)
249
- let readTarget = this.readTarget
250
- let writeTarget = this.writeTarget
251
-
252
- for (let passIndex = 1; passIndex < totalPasses; passIndex += 1) {
253
- this.blurInputNode.value = readTarget.texture
254
- for (const node of this.blurSampleNodes) {
255
- node.value = readTarget.texture
256
- }
257
- this.passIndexUniform.value = passIndex
258
- renderer.setRenderTarget(writeTarget)
259
- renderer.render(this.blurScene, this.orthoCamera)
260
-
261
- if (passIndex === this.crispPassCount - 1) {
262
- this.copyInputNode.value = writeTarget.texture
263
- renderer.setRenderTarget(this.crispTarget)
264
- renderer.render(this.copyScene, this.orthoCamera)
265
- }
266
-
267
- const temp = readTarget
268
- readTarget = writeTarget
269
- writeTarget = temp
270
- }
271
-
272
- this.finalInputNode.value = readTarget.texture
273
- this.crispInputNode.value = this.crispTarget.texture
274
- for (const node of this.compositeBlurNodes) {
275
- node.value = readTarget.texture
276
- }
277
- renderer.setRenderTarget(this.compositeTarget)
278
- renderer.render(this.compositeScene, this.orthoCamera)
279
-
280
- this.finalInputNode.value = this.compositeTarget.texture
281
- super.render(renderer, inputTexture, outputTarget, time, delta)
282
- this.needsRefresh = false
283
- }
284
-
285
- protected override beforeRender(time: number): void {
286
- this.timeUniform.value = time
287
- }
288
-
289
- override needsContinuousRender(): boolean {
290
- return this.isAnimated || this.needsRefresh
291
- }
292
-
293
- override updateParams(params: LayerParameterValues): void {
294
- const angle =
295
- ((typeof params.blurDirection === "number" ? params.blurDirection : 68) *
296
- Math.PI) /
297
- 180
298
-
299
- this.directionXUniform.value = Math.cos(angle)
300
- this.directionYUniform.value = Math.sin(angle)
301
- this.blurPassCount =
302
- typeof params.blurPasses === "number"
303
- ? Math.max(1, Math.round(params.blurPasses))
304
- : 12
305
- this.crispPassCount =
306
- typeof params.crispPasses === "number"
307
- ? Math.max(1, Math.round(params.crispPasses))
308
- : 3
309
- this.blurStrengthUniform.value =
310
- typeof params.blurStrength === "number"
311
- ? Math.max(0.001, params.blurStrength)
312
- : 0.02
313
- this.crispBlendUniform.value =
314
- typeof params.crispBlend === "number" ? clamp01(params.crispBlend) : 0.75
315
- this.dripLengthUniform.value =
316
- typeof params.dripLength === "number"
317
- ? Math.max(1, params.dripLength)
318
- : 7.1
319
- this.dripWeightUniform.value =
320
- typeof params.dripWeight === "number"
321
- ? Math.max(0.2, params.dripWeight)
322
- : 1.2
323
- this.fluidNoiseUniform.value =
324
- typeof params.fluidNoise === "number"
325
- ? Math.max(0, params.fluidNoise)
326
- : 0.2
327
- this.noiseScaleUniform.value =
328
- typeof params.noiseScale === "number"
329
- ? Math.max(0.5, params.noiseScale)
330
- : 1
331
- this.smokeSpeedUniform.value =
332
- typeof params.smokeSpeed === "number"
333
- ? Math.max(0, params.smokeSpeed)
334
- : 0.2
335
- this.smokeTurbulenceUniform.value =
336
- typeof params.smokeTurbulence === "number"
337
- ? Math.max(0, params.smokeTurbulence)
338
- : 0.25
339
- this.blurSpreadUniform.value =
340
- typeof params.blurSpread === "number"
341
- ? Math.max(0.5, params.blurSpread)
342
- : 1.7
343
- this.grainEnabledUniform.value = params.grainEnabled === false ? 0 : 1
344
- this.grainIntensityUniform.value =
345
- typeof params.grainIntensity === "number"
346
- ? clamp01(params.grainIntensity)
347
- : 0.3
348
- this.grainScaleUniform.value =
349
- typeof params.grainScale === "number"
350
- ? Math.max(0.5, params.grainScale)
351
- : 1.5
352
-
353
- this.setColorUniform(
354
- this.backgroundColorUniform,
355
- typeof params.backgroundColor === "string"
356
- ? params.backgroundColor
357
- : "#0a0b0d"
358
- )
359
- this.setColorUniform(
360
- this.coreColorUniform,
361
- typeof params.coreColor === "string" ? params.coreColor : "#fffde8"
362
- )
363
- this.setColorUniform(
364
- this.midColorUniform,
365
- typeof params.midColor === "string" ? params.midColor : "#c8f542"
366
- )
367
- this.setColorUniform(
368
- this.edgeColorUniform,
369
- typeof params.edgeColor === "string" ? params.edgeColor : "#00c9a7"
370
- )
371
-
372
- const nextBloomEnabled = params.bloomEnabled === true
373
- const nextBloomIntensity =
374
- typeof params.bloomIntensity === "number"
375
- ? Math.max(0, params.bloomIntensity)
376
- : 1.25
377
- const nextBloomThreshold =
378
- typeof params.bloomThreshold === "number"
379
- ? clamp01(params.bloomThreshold)
380
- : 0.6
381
- const nextBloomRadius =
382
- typeof params.bloomRadius === "number"
383
- ? Math.max(0, params.bloomRadius)
384
- : 6
385
- const nextBloomSoftness =
386
- typeof params.bloomSoftness === "number"
387
- ? clamp01(params.bloomSoftness)
388
- : 0.35
389
-
390
- this.bloomIntensityUniform.value = nextBloomIntensity
391
- this.bloomRadiusUniform.value = nextBloomRadius
392
- this.bloomSoftnessUniform.value = nextBloomSoftness
393
- this.bloomThresholdUniform.value = nextBloomThreshold
394
-
395
- if (nextBloomEnabled !== this.bloomEnabled) {
396
- this.bloomEnabled = nextBloomEnabled
397
- this.rebuildEffectNode()
398
- } else if (this.bloomNode) {
399
- this.bloomNode.strength.value = nextBloomIntensity
400
- this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius)
401
- this.bloomNode.threshold.value = nextBloomThreshold
402
- this.bloomNode.smoothWidth.value =
403
- this.normalizeBloomSoftness(nextBloomSoftness)
404
- }
405
-
406
- this.isAnimated = (this.smokeSpeedUniform.value as number) > 0
407
- this.needsRefresh = true
408
- }
409
-
410
- override resize(width: number, height: number): void {
411
- this.width = Math.max(1, width)
412
- this.height = Math.max(1, height)
413
- this.resolutionWidthUniform.value = this.width
414
- this.resolutionHeightUniform.value = this.height
415
- this.readTarget.setSize(this.width, this.height)
416
- this.writeTarget.setSize(this.width, this.height)
417
- this.crispTarget.setSize(this.width, this.height)
418
- this.compositeTarget.setSize(this.width, this.height)
419
- this.needsRefresh = true
420
- }
421
-
422
- override dispose(): void {
423
- this.disposeBloomNode()
424
- this.noiseTexture?.dispose()
425
- this.readTarget?.dispose()
426
- this.writeTarget?.dispose()
427
- this.crispTarget?.dispose()
428
- this.compositeTarget?.dispose()
429
- this.blurMaterial?.dispose()
430
- this.copyMaterial?.dispose()
431
- this.compositeMaterial?.dispose()
432
- this.placeholder.dispose()
433
- super.dispose()
434
- }
435
-
436
- protected override buildEffectNode(): Node {
437
- if (!this.finalInputNode) {
438
- return vec4(float(0), float(0), float(0), float(1))
439
- }
440
-
441
- this.disposeBloomNode()
442
- this.bloomNode = null
443
-
444
- const baseColor = vec3(
445
- this.finalInputNode.r,
446
- this.finalInputNode.g,
447
- this.finalInputNode.b
448
- )
449
-
450
- if (!this.bloomEnabled) {
451
- return vec4(baseColor, float(1))
452
- }
453
-
454
- this.bloomNode = bloom(
455
- vec4(baseColor, float(1)),
456
- this.bloomIntensityUniform.value as number,
457
- this.normalizeBloomRadius(this.bloomRadiusUniform.value as number),
458
- this.bloomThresholdUniform.value as number
459
- )
460
- this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(
461
- this.bloomSoftnessUniform.value as number
462
- )
463
-
464
- return vec4(
465
- clamp(
466
- baseColor.add(this.getBloomTextureNode().rgb),
467
- vec3(float(0), float(0), float(0)),
468
- vec3(float(1), float(1), float(1))
469
- ),
470
- float(1)
471
- )
472
- }
473
-
474
- private buildBlurNode(): Node {
475
- this.blurSampleNodes = []
476
- this.noiseSampleNodes = []
477
-
478
- const texUv = vec2(uv().x, float(1).sub(uv().y))
479
- const texelSize = vec2(
480
- float(1).div(this.resolutionWidthUniform),
481
- float(1).div(this.resolutionHeightUniform)
482
- )
483
- const original = this.blurInputNode
484
- const originalIntensity = max(max(original.r, original.g), original.b)
485
- const rotatedUv = vec2(
486
- texUv.x
487
- .mul(float(Math.cos(0.7854)))
488
- .sub(texUv.y.mul(float(Math.sin(0.7854)))),
489
- texUv.x
490
- .mul(float(Math.sin(0.7854)))
491
- .add(texUv.y.mul(float(Math.cos(0.7854))))
492
- )
493
- const timeOffset1 = vec2(
494
- this.timeUniform.mul(this.smokeSpeedUniform).mul(0.3),
495
- this.timeUniform.mul(this.smokeSpeedUniform).mul(0.15)
496
- )
497
- const timeOffset2 = vec2(
498
- sin(this.timeUniform.mul(this.smokeSpeedUniform).mul(0.7)).mul(0.1),
499
- sin(
500
- this.timeUniform
501
- .mul(this.smokeSpeedUniform)
502
- .mul(0.5)
503
- .add(float(1.5707963))
504
- ).mul(0.08)
505
- )
506
- const noiseUv1 = texUv
507
- .mul(this.noiseScaleUniform)
508
- .add(vec2(this.passIndexUniform.mul(0.1), this.passIndexUniform.mul(0.1)))
509
- .add(timeOffset1)
510
- const noiseUv2 = rotatedUv
511
- .mul(this.noiseScaleUniform)
512
- .mul(0.8)
513
- .add(
514
- vec2(this.passIndexUniform.mul(0.15), this.passIndexUniform.mul(0.15))
515
- )
516
- .add(timeOffset1.mul(1.2))
517
- const turbulenceUv = rotatedUv
518
- .mul(this.noiseScaleUniform)
519
- .mul(0.6)
520
- .add(timeOffset2.mul(2))
521
-
522
- const noiseSample1 = this.trackNoiseSampleNode(noiseUv1)
523
- const noiseSample2 = this.trackNoiseSampleNode(noiseUv2)
524
- const turbulenceSample = this.trackNoiseSampleNode(turbulenceUv)
525
- const noiseSample = mix(noiseSample1.rgb, noiseSample2.rgb, float(0.5))
526
-
527
- const noiseX = noiseSample.r
528
- .sub(0.5)
529
- .mul(2)
530
- .mul(this.fluidNoiseUniform)
531
- .add(turbulenceSample.r.sub(0.5).mul(this.smokeTurbulenceUniform))
532
- const noiseY = noiseSample.g
533
- .sub(0.5)
534
- .mul(2)
535
- .mul(this.fluidNoiseUniform)
536
- .mul(0.4)
537
- .add(
538
- turbulenceSample.g.sub(0.5).mul(this.smokeTurbulenceUniform).mul(0.5)
539
- )
540
-
541
- const flowDir = vec2(
542
- this.directionXUniform.add(noiseX),
543
- this.directionYUniform.add(noiseY)
544
- ).normalize()
545
- const baseNoise = noiseSample.b
546
- .sub(0.5)
547
- .mul(0.03)
548
- .mul(this.fluidNoiseUniform)
549
-
550
- let result: Node = vec4(float(0), float(0), float(0), float(0))
551
- let totalWeight: Node = float(0)
552
-
553
- for (let sampleIndex = 0; sampleIndex < 10; sampleIndex += 1) {
554
- const t = float(sampleIndex / 9)
555
- const asymmetry = smoothstep(float(0), float(1), t).mul(t).add(t.mul(0.5))
556
- const sampleDist = asymmetry
557
- .mul(this.dripLengthUniform)
558
- .mul(this.blurStrengthUniform)
559
- .mul(
560
- float(1).add(
561
- this.passIndexUniform.mul(this.blurSpreadUniform).mul(0.15)
562
- )
563
- )
564
- const sampleNoise = baseNoise.mul(float(1 + sampleIndex * 0.1))
565
- const disperseTurbulence = sampleNoise
566
- .mul(t)
567
- .mul(this.smokeTurbulenceUniform)
568
- const samplePos = texUv
569
- .add(flowDir.mul(sampleDist).mul(texelSize).mul(100))
570
- .add(
571
- vec2(
572
- sampleNoise.add(disperseTurbulence),
573
- sampleNoise.add(disperseTurbulence).mul(0.3)
574
- )
575
- )
576
- const weight = mix(
577
- float(1).sub(t),
578
- float(1),
579
- smoothstep(float(0.35), float(0), t)
580
- )
581
- const sample = this.trackBlurSampleNode(samplePos)
582
- result = result.add(sample.mul(weight))
583
- totalWeight = totalWeight.add(weight)
584
- }
585
-
586
- for (let sampleIndex = 1; sampleIndex <= 2; sampleIndex += 1) {
587
- const t = float(sampleIndex / 3)
588
- const sampleDist = t
589
- .mul(this.dripLengthUniform)
590
- .mul(this.blurStrengthUniform)
591
- .mul(0.2)
592
- const samplePos = texUv.sub(
593
- flowDir.mul(sampleDist).mul(texelSize).mul(100)
594
- )
595
- const weight = float(1).sub(t).mul(0.4)
596
- const sample = this.trackBlurSampleNode(samplePos)
597
- result = result.add(sample.mul(weight))
598
- totalWeight = totalWeight.add(weight)
599
- }
600
-
601
- const blurred = result.div(max(totalWeight, float(0.0001)))
602
- const lifted = max(blurred, original)
603
- return vec4(
604
- mix(blurred.rgb, lifted.rgb, originalIntensity.mul(0.5)),
605
- float(1)
606
- )
607
- }
608
-
609
- private buildCompositeNode(): Node {
610
- this.compositeBlurNodes = []
611
-
612
- const texUv = vec2(uv().x, float(1).sub(uv().y))
613
- const blurSample = this.finalInputNode
614
- const crispSample = this.crispInputNode
615
- const blurIntensity = max(max(blurSample.r, blurSample.g), blurSample.b)
616
- const crispIntensity = max(max(crispSample.r, crispSample.g), crispSample.b)
617
- const texelSize = vec2(
618
- float(1).div(this.resolutionWidthUniform),
619
- float(1).div(this.resolutionHeightUniform)
620
- )
621
- const blurR = this.trackCompositeBlurNode(
622
- texUv.add(vec2(texelSize.x.mul(2), texelSize.y))
623
- ).r
624
- const blurB = this.trackCompositeBlurNode(
625
- texUv.sub(vec2(texelSize.x.mul(2), texelSize.y))
626
- ).b
627
-
628
- const backgroundColor = vec3(
629
- float(this.backgroundColorUniform.x),
630
- float(this.backgroundColorUniform.y),
631
- float(this.backgroundColorUniform.z)
632
- )
633
- const edgeColor = vec3(
634
- float(this.edgeColorUniform.x),
635
- float(this.edgeColorUniform.y),
636
- float(this.edgeColorUniform.z)
637
- )
638
- const midColor = vec3(
639
- float(this.midColorUniform.x),
640
- float(this.midColorUniform.y),
641
- float(this.midColorUniform.z)
642
- )
643
- const coreColor = vec3(
644
- float(this.coreColorUniform.x),
645
- float(this.coreColorUniform.y),
646
- float(this.coreColorUniform.z)
647
- )
648
-
649
- const fluidColor = this.applyColorGradient(
650
- blurIntensity,
651
- backgroundColor,
652
- edgeColor,
653
- midColor,
654
- coreColor
655
- )
656
- const crispColor = this.applyColorGradient(
657
- crispIntensity,
658
- backgroundColor,
659
- edgeColor,
660
- midColor,
661
- coreColor
662
- )
663
- const fluidColorChroma = vec3(
664
- mix(fluidColor.x, fluidColor.x.mul(1.1), blurR.mul(0.3)),
665
- fluidColor.y,
666
- mix(fluidColor.z, fluidColor.z.mul(1.15), blurB.mul(0.3))
667
- )
668
-
669
- const fluidMask = pow(clamp(blurIntensity, float(0), float(1)), float(1.2))
670
- const crispMask = pow(
671
- clamp(crispIntensity, float(0), float(1)),
672
- float(0.96)
673
- )
674
- const fluidGlow = fluidColorChroma.mul(fluidMask).mul(1.8)
675
- const crispGlow = crispColor.mul(crispMask).mul(1.95)
676
- const crispWeight = crispMask.mul(this.crispBlendUniform)
677
- let combined = mix(fluidGlow, crispGlow, crispWeight).add(
678
- fluidGlow.mul(0.15)
679
- )
680
-
681
- const grain = grainTexturePattern(
682
- texUv.mul(vec2(this.grainScaleUniform, this.grainScaleUniform))
683
- )
684
- .sub(0.5)
685
- .mul(this.grainIntensityUniform)
686
- combined = select(
687
- this.grainEnabledUniform.greaterThan(float(0.5)),
688
- combined.add(vec3(grain, grain, grain)),
689
- combined
690
- )
691
-
692
- const alpha = max(fluidMask, crispMask)
693
- let finalColor = mix(
694
- backgroundColor,
695
- combined,
696
- smoothstep(float(0.01), float(0.85), alpha)
697
- )
698
- const vignetteUv = texUv.mul(2).sub(vec2(1, 1))
699
- finalColor = finalColor.mul(
700
- float(1).sub(vignetteUv.dot(vignetteUv).mul(0.15))
701
- )
702
-
703
- return vec4(clamp(finalColor, vec3(0, 0, 0), vec3(1, 1, 1)), float(1))
704
- }
705
-
706
- private applyColorGradient(
707
- intensity: Node,
708
- bgColor: Node,
709
- edgeColor: Node,
710
- midColor: Node,
711
- coreColor: Node
712
- ): Node {
713
- const t1 = smoothstep(float(0.6), float(0.95), intensity)
714
- const t2 = smoothstep(float(0.2), float(0.65), intensity)
715
- const t3 = smoothstep(float(0), float(0.25), intensity)
716
- const edgeMixed = mix(bgColor, edgeColor, t3)
717
- const midMixed = mix(edgeMixed, midColor, t2)
718
- return mix(midMixed, coreColor, t1)
719
- }
720
-
721
- private ensureNoiseTexture(): void {
722
- if (this.noiseTexture || this.noiseLoadStarted) {
723
- return
724
- }
725
-
726
- this.noiseLoadStarted = true
727
- void loadImageTexture(BLUE_NOISE_TEXTURE_URL)
728
- .then((texture) => {
729
- texture.wrapS = THREE.RepeatWrapping
730
- texture.wrapT = THREE.RepeatWrapping
731
- this.noiseTexture = texture
732
- this.needsRefresh = true
733
- })
734
- .catch(() => {
735
- this.needsRefresh = true
736
- })
737
- }
738
-
739
- private trackBlurSampleNode(sampleUv: Node): Node {
740
- const sampleNode = tslTexture(this.placeholder, sampleUv)
741
- this.blurSampleNodes.push(sampleNode)
742
- return sampleNode
743
- }
744
-
745
- private trackCompositeBlurNode(sampleUv: Node): Node {
746
- const sampleNode = tslTexture(this.placeholder, sampleUv)
747
- this.compositeBlurNodes.push(sampleNode)
748
- return sampleNode
749
- }
750
-
751
- private trackNoiseSampleNode(sampleUv: Node): Node {
752
- const sampleNode = tslTexture(this.placeholder, sampleUv)
753
- this.noiseSampleNodes.push(sampleNode)
754
- return sampleNode
755
- }
756
-
757
- private setColorUniform(target: Node, value: string): void {
758
- const [r, g, b] = hexToRgb(value)
759
- ;(target.value as THREE.Vector3).set(r, g, b)
760
- }
761
-
762
- private normalizeBloomRadius(value: number): number {
763
- return clamp01(value / 24)
764
- }
765
-
766
- private normalizeBloomSoftness(value: number): number {
767
- return Math.max(0.001, value * 0.25)
768
- }
769
-
770
- private disposeBloomNode(): void {
771
- ;(this.bloomNode as { dispose?: () => void } | null)?.dispose?.()
772
- }
773
-
774
- private getBloomTextureNode(): Node {
775
- const bloomNode = this.bloomNode as
776
- | ({
777
- getTexture?: () => Node
778
- getTextureNode?: () => Node
779
- } & object)
780
- | null
781
-
782
- if (!bloomNode) {
783
- throw new Error("Bloom node is not initialized")
784
- }
785
-
786
- if (
787
- "getTextureNode" in bloomNode &&
788
- typeof bloomNode.getTextureNode === "function"
789
- ) {
790
- return bloomNode.getTextureNode()
791
- }
792
-
793
- if (
794
- "getTexture" in bloomNode &&
795
- typeof bloomNode.getTexture === "function"
796
- ) {
797
- return bloomNode.getTexture()
798
- }
799
-
800
- throw new Error("Bloom node does not expose a texture getter")
801
- }
802
- }