@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,416 +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
- ASCII_CHARSETS,
20
- buildAsciiAtlas,
21
- type AsciiFontWeight,
22
- DEFAULT_ASCII_CHARS,
23
- } from "@/renderer/ascii-atlas"
24
- import { PassNode } from "@/renderer/pass-node"
25
- import type { LayerParameterValues } from "@/types/editor"
26
-
27
- type Node = TSLNode
28
- type AsciiColorMode = "green-terminal" | "monochrome" | "source"
29
- type AsciiCharset = keyof typeof ASCII_CHARSETS | "custom"
30
-
31
- function clamp01(value: number): number {
32
- return Math.max(0, Math.min(1, value))
33
- }
34
-
35
- function parseCssColorRgb(value: string): [number, number, number] {
36
- const rgba = value.match(
37
- /rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*[\d.]+)?\s*\)/i,
38
- )
39
-
40
- if (rgba) {
41
- return [
42
- clamp01(Number.parseFloat(rgba[1] ?? "0") / 255),
43
- clamp01(Number.parseFloat(rgba[2] ?? "0") / 255),
44
- clamp01(Number.parseFloat(rgba[3] ?? "0") / 255),
45
- ]
46
- }
47
-
48
- const hex = value.trim().replace("#", "")
49
-
50
- if (hex.length === 6) {
51
- return [
52
- Number.parseInt(hex.slice(0, 2), 16) / 255,
53
- Number.parseInt(hex.slice(2, 4), 16) / 255,
54
- Number.parseInt(hex.slice(4, 6), 16) / 255,
55
- ]
56
- }
57
-
58
- if (hex.length === 3) {
59
- return [
60
- Number.parseInt(`${hex[0] ?? "0"}${hex[0] ?? "0"}`, 16) / 255,
61
- Number.parseInt(`${hex[1] ?? "0"}${hex[1] ?? "0"}`, 16) / 255,
62
- Number.parseInt(`${hex[2] ?? "0"}${hex[2] ?? "0"}`, 16) / 255,
63
- ]
64
- }
65
-
66
- return [1, 1, 1]
67
- }
68
-
69
- export class AsciiPass extends PassNode {
70
- private atlasTexture: THREE.CanvasTexture | null = null
71
- private atlasTextureNodes: Node[] = []
72
- private bloomEnabled = false
73
- private bloomNode: ReturnType<typeof bloom> | null = null
74
- private readonly bloomIntensityUniform: Node
75
- private readonly bloomRadiusUniform: Node
76
- private readonly bloomSoftnessUniform: Node
77
- private readonly bloomThresholdUniform: Node
78
- private readonly cellSizeUniform: Node
79
- private readonly bgOpacityUniform: Node
80
- private readonly colorModeUniform: Node
81
- private readonly invertUniform: Node
82
- private readonly monoBlueUniform: Node
83
- private readonly monoGreenUniform: Node
84
- private readonly logicalHeightUniform: Node
85
- private readonly logicalWidthUniform: Node
86
- private readonly monoRedUniform: Node
87
- private readonly numCharsUniform: Node
88
- private readonly placeholder: THREE.Texture
89
- private sourceTextureNodes: Node[] = []
90
-
91
- private currentCellSize = 12
92
- private currentCharset: AsciiCharset = "light"
93
- private currentCustomChars = DEFAULT_ASCII_CHARS
94
- private currentFontWeight: AsciiFontWeight = "regular"
95
-
96
- constructor(layerId: string) {
97
- super(layerId)
98
- this.placeholder = new THREE.Texture()
99
- this.bloomIntensityUniform = uniform(1.25)
100
- this.bloomRadiusUniform = uniform(6)
101
- this.bloomSoftnessUniform = uniform(0.35)
102
- this.bloomThresholdUniform = uniform(0.6)
103
- this.cellSizeUniform = uniform(12)
104
- this.logicalWidthUniform = uniform(1)
105
- this.logicalHeightUniform = uniform(1)
106
- this.numCharsUniform = uniform(DEFAULT_ASCII_CHARS.length)
107
- this.colorModeUniform = uniform(1)
108
- this.monoRedUniform = uniform(0.96)
109
- this.monoGreenUniform = uniform(0.96)
110
- this.monoBlueUniform = uniform(0.94)
111
- this.bgOpacityUniform = uniform(0)
112
- this.invertUniform = uniform(0)
113
- this.atlasTexture = buildAsciiAtlas(DEFAULT_ASCII_CHARS, "regular", this.currentCellSize)
114
- this.rebuildEffectNode()
115
- }
116
-
117
- override render(
118
- renderer: THREE.WebGPURenderer,
119
- inputTexture: THREE.Texture,
120
- outputTarget: THREE.WebGLRenderTarget,
121
- time: number,
122
- delta: number,
123
- ): void {
124
- for (const sourceTextureNode of this.sourceTextureNodes) {
125
- sourceTextureNode.value = inputTexture
126
- }
127
-
128
- if (this.atlasTexture) {
129
- for (const atlasTextureNode of this.atlasTextureNodes) {
130
- atlasTextureNode.value = this.atlasTexture
131
- }
132
- }
133
-
134
- super.render(renderer, inputTexture, outputTarget, time, delta)
135
- }
136
-
137
- override updateParams(params: LayerParameterValues): void {
138
- const nextCellSize =
139
- typeof params.cellSize === "number" ? Math.max(4, Math.round(params.cellSize)) : 12
140
- const nextCharset = this.resolveCharset(params.charset)
141
- const nextCustomChars =
142
- typeof params.customChars === "string" ? params.customChars : DEFAULT_ASCII_CHARS
143
- const nextFontWeight = this.resolveFontWeight(params.fontWeight)
144
- const nextColorMode = this.resolveColorMode(params.colorMode)
145
- const nextBgOpacity =
146
- typeof params.bgOpacity === "number" ? clamp01(params.bgOpacity) : 0
147
- const nextBloomEnabled = params.bloomEnabled === true
148
- const nextBloomIntensity =
149
- typeof params.bloomIntensity === "number" ? Math.max(0, params.bloomIntensity) : 1.25
150
- const nextBloomThreshold =
151
- typeof params.bloomThreshold === "number" ? clamp01(params.bloomThreshold) : 0.6
152
- const nextBloomRadius =
153
- typeof params.bloomRadius === "number" ? Math.max(0, params.bloomRadius) : 6
154
- const nextBloomSoftness =
155
- typeof params.bloomSoftness === "number" ? clamp01(params.bloomSoftness) : 0.35
156
- const [red, green, blue] = parseCssColorRgb(
157
- typeof params.monoColor === "string" ? params.monoColor : "#f5f5f0",
158
- )
159
-
160
- this.cellSizeUniform.value = nextCellSize
161
- this.bgOpacityUniform.value = nextBgOpacity
162
- this.bloomIntensityUniform.value = nextBloomIntensity
163
- this.bloomRadiusUniform.value = nextBloomRadius
164
- this.bloomSoftnessUniform.value = nextBloomSoftness
165
- this.bloomThresholdUniform.value = nextBloomThreshold
166
- this.invertUniform.value = params.invert === true ? 1 : 0
167
- this.monoRedUniform.value = red
168
- this.monoGreenUniform.value = green
169
- this.monoBlueUniform.value = blue
170
-
171
- this.colorModeUniform.value = this.getColorModeValue(nextColorMode)
172
-
173
- const needsAtlasRebuild =
174
- nextCellSize !== this.currentCellSize ||
175
- nextCharset !== this.currentCharset ||
176
- nextFontWeight !== this.currentFontWeight ||
177
- (nextCharset === "custom" && nextCustomChars !== this.currentCustomChars)
178
-
179
- this.currentCellSize = nextCellSize
180
- this.currentCharset = nextCharset
181
- this.currentCustomChars = nextCustomChars
182
- this.currentFontWeight = nextFontWeight
183
-
184
- if (nextBloomEnabled !== this.bloomEnabled) {
185
- this.bloomEnabled = nextBloomEnabled
186
- this.rebuildEffectNode()
187
- return
188
- }
189
-
190
- if (this.bloomNode) {
191
- this.bloomNode.strength.value = nextBloomIntensity
192
- this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius)
193
- this.bloomNode.threshold.value = nextBloomThreshold
194
- this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(nextBloomSoftness)
195
- }
196
-
197
- if (needsAtlasRebuild) {
198
- this.rebuildAtlas()
199
- }
200
- }
201
-
202
- override dispose(): void {
203
- this.disposeBloomNode()
204
- this.placeholder.dispose()
205
- this.atlasTexture?.dispose()
206
- super.dispose()
207
- }
208
-
209
- override updateLogicalSize(width: number, height: number): void {
210
- this.logicalWidthUniform.value = Math.max(1, width)
211
- this.logicalHeightUniform.value = Math.max(1, height)
212
- }
213
-
214
- protected override buildEffectNode(): Node {
215
- if (!(this.cellSizeUniform && this.numCharsUniform && this.placeholder)) {
216
- return this.inputNode
217
- }
218
-
219
- this.disposeBloomNode()
220
- this.bloomNode = null
221
- this.sourceTextureNodes = []
222
- this.atlasTextureNodes = []
223
-
224
- const renderTargetUv = vec2(uv().x, float(1).sub(uv().y))
225
- const logicalScreenSize = vec2(this.logicalWidthUniform, this.logicalHeightUniform)
226
- const normalizedCellSize = vec2(this.cellSizeUniform, this.cellSizeUniform).div(
227
- logicalScreenSize,
228
- )
229
- const sampleAscii = (sampleUv: Node) => {
230
- const safeUv = clamp(sampleUv, vec2(float(0), float(0)), vec2(float(1), float(1)))
231
- const screenPixel = floor(safeUv.mul(logicalScreenSize))
232
- const cellCenterUv = floor(safeUv.div(normalizedCellSize))
233
- .add(vec2(0.5, 0.5))
234
- .mul(normalizedCellSize)
235
- const localCellPixel = vec2(
236
- mod(screenPixel.x, this.cellSizeUniform),
237
- mod(screenPixel.y, this.cellSizeUniform),
238
- )
239
- const sampledColor = this.trackSourceTextureNode(cellCenterUv)
240
- const luma = float(sampledColor.r)
241
- .mul(float(0.2126))
242
- .add(float(sampledColor.g).mul(float(0.7152)))
243
- .add(float(sampledColor.b).mul(float(0.0722)))
244
- const adjustedLuma = select(
245
- this.invertUniform.greaterThan(float(0.5)),
246
- float(1).sub(luma),
247
- luma,
248
- )
249
- const charIndex = floor(
250
- clamp(
251
- adjustedLuma.mul(this.numCharsUniform.sub(float(1))),
252
- float(0),
253
- this.numCharsUniform.sub(float(1)),
254
- ),
255
- )
256
- const atlasUv = vec2(
257
- charIndex
258
- .mul(this.cellSizeUniform)
259
- .add(localCellPixel.x)
260
- .add(float(0.5))
261
- .div(this.numCharsUniform.mul(this.cellSizeUniform)),
262
- localCellPixel.y.add(float(0.5)).div(this.cellSizeUniform),
263
- )
264
- const characterMask = float(this.trackAtlasTextureNode(atlasUv).r)
265
- const sourceColor = vec3(
266
- float(sampledColor.r),
267
- float(sampledColor.g),
268
- float(sampledColor.b),
269
- )
270
- const monoTint = vec3(
271
- this.monoRedUniform,
272
- this.monoGreenUniform,
273
- this.monoBlueUniform,
274
- )
275
- const monochromeColor = monoTint.mul(adjustedLuma)
276
- const greenTerminalColor = vec3(float(0), adjustedLuma, float(0))
277
- const glyphColor = select(
278
- this.colorModeUniform.lessThan(float(0.5)),
279
- sourceColor,
280
- select(
281
- this.colorModeUniform.lessThan(float(1.5)),
282
- monochromeColor,
283
- greenTerminalColor,
284
- ),
285
- )
286
- const sourceBackground = sourceColor.mul(this.bgOpacityUniform)
287
- const backgroundColor = select(
288
- this.colorModeUniform.lessThan(float(0.5)),
289
- sourceBackground,
290
- vec3(float(0), float(0), float(0)),
291
- )
292
-
293
- return {
294
- baseColor: mix(backgroundColor, glyphColor, characterMask),
295
- emissiveColor: glyphColor.mul(characterMask),
296
- }
297
- }
298
-
299
- const baseSample = sampleAscii(renderTargetUv)
300
-
301
- if (!this.bloomEnabled) {
302
- return vec4(baseSample.baseColor, float(1))
303
- }
304
-
305
- const bloomInput = vec4(baseSample.emissiveColor, float(1))
306
- this.bloomNode = bloom(
307
- bloomInput,
308
- this.bloomIntensityUniform.value as number,
309
- this.normalizeBloomRadius(this.bloomRadiusUniform.value as number),
310
- this.bloomThresholdUniform.value as number,
311
- )
312
- this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(
313
- this.bloomSoftnessUniform.value as number,
314
- )
315
-
316
- return vec4(
317
- clamp(
318
- baseSample.baseColor.add(this.getBloomTextureNode().rgb),
319
- vec3(float(0), float(0), float(0)),
320
- vec3(float(1), float(1), float(1)),
321
- ),
322
- float(1),
323
- )
324
- }
325
-
326
- private getActiveChars(): string {
327
- return this.currentCharset === "custom"
328
- ? this.currentCustomChars || " "
329
- : ASCII_CHARSETS[this.currentCharset] ?? DEFAULT_ASCII_CHARS
330
- }
331
-
332
- private getColorModeValue(colorMode: AsciiColorMode): number {
333
- switch (colorMode) {
334
- case "source":
335
- return 0
336
- case "green-terminal":
337
- return 2
338
- default:
339
- return 1
340
- }
341
- }
342
-
343
- private rebuildAtlas(): void {
344
- const chars = this.getActiveChars()
345
- this.atlasTexture?.dispose()
346
- this.atlasTexture = buildAsciiAtlas(chars, this.currentFontWeight, this.currentCellSize)
347
- this.numCharsUniform.value = chars.length
348
- this.rebuildEffectNode()
349
- }
350
-
351
- private resolveCharset(value: unknown): AsciiCharset {
352
- return value === "binary" ||
353
- value === "blocks" ||
354
- value === "custom" ||
355
- value === "dense" ||
356
- value === "hatching" ||
357
- value === "light"
358
- ? value
359
- : "light"
360
- }
361
-
362
- private resolveColorMode(value: unknown): AsciiColorMode {
363
- return value === "green-terminal" || value === "source" ? value : "monochrome"
364
- }
365
-
366
- private resolveFontWeight(value: unknown): AsciiFontWeight {
367
- return value === "bold" || value === "thin" ? value : "regular"
368
- }
369
-
370
- private normalizeBloomRadius(value: number): number {
371
- return clamp01(value / 24)
372
- }
373
-
374
- private normalizeBloomSoftness(value: number): number {
375
- return Math.max(0.001, value * 0.25)
376
- }
377
-
378
- private disposeBloomNode(): void {
379
- ;(this.bloomNode as { dispose?: () => void } | null)?.dispose?.()
380
- }
381
-
382
- private getBloomTextureNode(): Node {
383
- const bloomNode = this.bloomNode as
384
- | ({
385
- getTexture?: () => Node
386
- getTextureNode?: () => Node
387
- } & object)
388
- | null
389
-
390
- if (!bloomNode) {
391
- throw new Error("Bloom node is not initialized")
392
- }
393
-
394
- if ("getTextureNode" in bloomNode && typeof bloomNode.getTextureNode === "function") {
395
- return bloomNode.getTextureNode()
396
- }
397
-
398
- if ("getTexture" in bloomNode && typeof bloomNode.getTexture === "function") {
399
- return bloomNode.getTexture()
400
- }
401
-
402
- throw new Error("Bloom node does not expose a texture getter")
403
- }
404
-
405
- private trackAtlasTextureNode(uvNode: Node): Node {
406
- const atlasTextureNode = tslTexture(this.atlasTexture ?? new THREE.Texture(), uvNode)
407
- this.atlasTextureNodes.push(atlasTextureNode)
408
- return atlasTextureNode
409
- }
410
-
411
- private trackSourceTextureNode(uvNode: Node): Node {
412
- const sourceTextureNode = tslTexture(this.placeholder, uvNode)
413
- this.sourceTextureNodes.push(sourceTextureNode)
414
- return sourceTextureNode
415
- }
416
- }
@@ -1,229 +0,0 @@
1
- import {
2
- abs,
3
- clamp,
4
- dot,
5
- float,
6
- max,
7
- min,
8
- mix,
9
- select,
10
- sqrt,
11
- type TSLNode,
12
- vec3,
13
- vec4,
14
- } from "three/tsl"
15
-
16
- type Node = TSLNode
17
-
18
- function normal(_base: Node, blend: Node): Node {
19
- return blend
20
- }
21
-
22
- function multiply(base: Node, blend: Node): Node {
23
- return base.mul(blend)
24
- }
25
-
26
- function screen(base: Node, blend: Node): Node {
27
- return float(1).sub(float(1).sub(base).mul(float(1).sub(blend)))
28
- }
29
-
30
- function overlay(base: Node, blend: Node): Node {
31
- const dark = float(2).mul(base).mul(blend)
32
- const light = float(1).sub(
33
- float(2).mul(float(1).sub(base)).mul(float(1).sub(blend)),
34
- )
35
-
36
- return select(base.lessThan(float(0.5)), dark, light)
37
- }
38
-
39
- function darken(base: Node, blend: Node): Node {
40
- return min(base, blend)
41
- }
42
-
43
- function lighten(base: Node, blend: Node): Node {
44
- return max(base, blend)
45
- }
46
-
47
- function colorDodge(base: Node, blend: Node): Node {
48
- return clamp(base.div(max(float(1).sub(blend), float(1e-6))), vec3(0), vec3(1))
49
- }
50
-
51
- function colorBurn(base: Node, blend: Node): Node {
52
- return clamp(
53
- float(1).sub(float(1).sub(base).div(max(blend, float(1e-6)))),
54
- vec3(0),
55
- vec3(1),
56
- )
57
- }
58
-
59
- function hardLight(base: Node, blend: Node): Node {
60
- return overlay(blend, base)
61
- }
62
-
63
- function softLight(base: Node, blend: Node): Node {
64
- const darkResult = base.sub(
65
- float(1).sub(float(2).mul(blend)).mul(base).mul(float(1).sub(base)),
66
- )
67
- const twoBlendMinusOne = float(2).mul(blend).sub(float(1))
68
- const dLow = float(16).mul(base).sub(float(12)).mul(base).add(float(4)).mul(base)
69
- const dHigh = sqrt(base)
70
- const d = select(base.lessThanEqual(float(0.25)), dLow, dHigh)
71
- const lightResult = base.add(twoBlendMinusOne.mul(d.sub(base)))
72
-
73
- return select(blend.lessThanEqual(float(0.5)), darkResult, lightResult)
74
- }
75
-
76
- function difference(base: Node, blend: Node): Node {
77
- return abs(base.sub(blend))
78
- }
79
-
80
- function exclusion(base: Node, blend: Node): Node {
81
- return base.add(blend).sub(float(2).mul(base).mul(blend))
82
- }
83
-
84
- function lum(color: Node): Node {
85
- return dot(color, vec3(0.2126, 0.7152, 0.0722))
86
- }
87
-
88
- function clipColor(color: Node): Node {
89
- const luma = lum(color)
90
- const colorMin = min(color.x, min(color.y, color.z))
91
- const lowClipped = color
92
- .sub(luma)
93
- .mul(luma.div(max(luma.sub(colorMin), float(1e-6))))
94
- .add(luma)
95
- const lowAdjusted = select(colorMin.lessThan(float(0)), lowClipped, color)
96
- const maxAfterLow = max(lowAdjusted.x, max(lowAdjusted.y, lowAdjusted.z))
97
- const excess = maxAfterLow.sub(float(1))
98
- const highClipped = lowAdjusted
99
- .sub(luma)
100
- .mul(float(1).sub(luma).div(max(excess, float(1e-6))))
101
- .add(luma)
102
-
103
- return select(maxAfterLow.greaterThan(float(1)), highClipped, lowAdjusted)
104
- }
105
-
106
- function setLum(color: Node, nextLum: Node): Node {
107
- return clipColor(color.add(nextLum.sub(lum(color))))
108
- }
109
-
110
- function sat(color: Node): Node {
111
- return max(color.x, max(color.y, color.z)).sub(min(color.x, min(color.y, color.z)))
112
- }
113
-
114
- function setSat(color: Node, nextSat: Node): Node {
115
- const red = color.x
116
- const green = color.y
117
- const blue = color.z
118
- const colorMin = min(red, min(green, blue))
119
- const colorMax = max(red, max(green, blue))
120
- const delta = colorMax.sub(colorMin)
121
- const scale = select(delta.greaterThan(float(0)), nextSat.div(delta), float(0))
122
- const redOut = select(
123
- red.lessThanEqual(colorMin),
124
- float(0),
125
- select(red.greaterThanEqual(colorMax), nextSat, red.sub(colorMin).mul(scale)),
126
- )
127
- const greenOut = select(
128
- green.lessThanEqual(colorMin),
129
- float(0),
130
- select(green.greaterThanEqual(colorMax), nextSat, green.sub(colorMin).mul(scale)),
131
- )
132
- const blueOut = select(
133
- blue.lessThanEqual(colorMin),
134
- float(0),
135
- select(blue.greaterThanEqual(colorMax), nextSat, blue.sub(colorMin).mul(scale)),
136
- )
137
-
138
- return vec3(redOut, greenOut, blueOut)
139
- }
140
-
141
- function hue(base: Node, blend: Node): Node {
142
- return setLum(setSat(blend, sat(base)), lum(base))
143
- }
144
-
145
- function saturation(base: Node, blend: Node): Node {
146
- return setLum(setSat(base, sat(blend)), lum(base))
147
- }
148
-
149
- function color(base: Node, blend: Node): Node {
150
- return setLum(blend, lum(base))
151
- }
152
-
153
- function luminosity(base: Node, blend: Node): Node {
154
- return setLum(base, lum(blend))
155
- }
156
-
157
- export function buildBlendNode(
158
- mode: string,
159
- base: Node,
160
- blend: Node,
161
- opacity: Node,
162
- compositeMode: "filter" | "mask" = "filter",
163
- ): Node {
164
- const baseRgb = base.rgb
165
- const blendRgb = blend.rgb
166
- const normalizedOpacity = float(clamp(opacity, float(0), float(1)))
167
-
168
- let composited: Node
169
-
170
- switch (mode) {
171
- case "multiply":
172
- composited = multiply(baseRgb, blendRgb)
173
- break
174
- case "screen":
175
- composited = screen(baseRgb, blendRgb)
176
- break
177
- case "overlay":
178
- composited = overlay(baseRgb, blendRgb)
179
- break
180
- case "darken":
181
- composited = darken(baseRgb, blendRgb)
182
- break
183
- case "lighten":
184
- composited = lighten(baseRgb, blendRgb)
185
- break
186
- case "color-dodge":
187
- composited = colorDodge(baseRgb, blendRgb)
188
- break
189
- case "color-burn":
190
- composited = colorBurn(baseRgb, blendRgb)
191
- break
192
- case "hard-light":
193
- composited = hardLight(baseRgb, blendRgb)
194
- break
195
- case "soft-light":
196
- composited = softLight(baseRgb, blendRgb)
197
- break
198
- case "difference":
199
- composited = difference(baseRgb, blendRgb)
200
- break
201
- case "exclusion":
202
- composited = exclusion(baseRgb, blendRgb)
203
- break
204
- case "hue":
205
- composited = hue(baseRgb, blendRgb)
206
- break
207
- case "saturation":
208
- composited = saturation(baseRgb, blendRgb)
209
- break
210
- case "color":
211
- composited = color(baseRgb, blendRgb)
212
- break
213
- case "luminosity":
214
- composited = luminosity(baseRgb, blendRgb)
215
- break
216
- default:
217
- composited = normal(baseRgb, blendRgb)
218
- break
219
- }
220
-
221
- if (compositeMode === "filter") {
222
- return vec4(mix(baseRgb, composited, normalizedOpacity), float(1))
223
- }
224
-
225
- const maskLuma = float(dot(blendRgb, vec3(0.2126, 0.7152, 0.0722)))
226
- const maskStrength = mix(float(1), clamp(maskLuma, float(0), float(1)), normalizedOpacity)
227
-
228
- return vec4(baseRgb.mul(maskStrength), float(1))
229
- }