@basementstudio/shader-lab 0.1.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/dist/src/easings.d.ts +3 -0
  2. package/dist/src/easings.js +3 -0
  3. package/dist/src/index.d.ts +5 -0
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/lib/editor/custom-shader/shared.d.ts +1 -0
  6. package/dist/src/lib/editor/custom-shader/shared.js +1 -0
  7. package/dist/src/renderer/ascii-atlas.d.ts +5 -0
  8. package/dist/src/renderer/ascii-atlas.js +61 -0
  9. package/dist/src/renderer/ascii-pass.d.ts +50 -0
  10. package/dist/src/renderer/ascii-pass.js +271 -0
  11. package/dist/src/renderer/asset-url.d.ts +1 -0
  12. package/dist/src/renderer/asset-url.js +3 -0
  13. package/dist/src/renderer/blend-modes.d.ts +4 -0
  14. package/dist/src/renderer/blend-modes.js +157 -0
  15. package/dist/src/renderer/contracts.d.ts +26 -0
  16. package/dist/src/renderer/contracts.js +13 -0
  17. package/dist/src/renderer/create-webgpu-renderer.d.ts +3 -0
  18. package/dist/src/renderer/create-webgpu-renderer.js +37 -0
  19. package/dist/src/renderer/crt-pass.d.ts +72 -0
  20. package/dist/src/renderer/crt-pass.js +536 -0
  21. package/dist/src/renderer/custom-shader-pass.d.ts +17 -0
  22. package/dist/src/renderer/custom-shader-pass.js +79 -0
  23. package/dist/src/renderer/custom-shader-runtime.d.ts +16 -0
  24. package/dist/src/renderer/custom-shader-runtime.js +169 -0
  25. package/dist/src/renderer/dither-textures.d.ts +8 -0
  26. package/dist/src/renderer/dither-textures.js +66 -0
  27. package/dist/src/renderer/dithering-pass.d.ts +45 -0
  28. package/dist/src/renderer/dithering-pass.js +229 -0
  29. package/dist/src/renderer/gradient-pass.d.ts +39 -0
  30. package/dist/src/renderer/gradient-pass.js +358 -0
  31. package/dist/src/renderer/halftone-pass.d.ts +65 -0
  32. package/dist/src/renderer/halftone-pass.js +530 -0
  33. package/dist/src/renderer/ink-pass.d.ts +84 -0
  34. package/dist/src/renderer/ink-pass.js +526 -0
  35. package/dist/src/renderer/live-pass.d.ts +31 -0
  36. package/dist/src/renderer/live-pass.js +136 -0
  37. package/dist/src/renderer/media-pass.d.ts +32 -0
  38. package/dist/src/renderer/media-pass.js +130 -0
  39. package/dist/src/renderer/media-texture.d.ts +8 -0
  40. package/dist/src/renderer/media-texture.js +41 -0
  41. package/dist/src/renderer/particle-grid-pass.d.ts +48 -0
  42. package/dist/src/renderer/particle-grid-pass.js +269 -0
  43. package/dist/src/renderer/pass-node.d.ts +36 -0
  44. package/dist/src/renderer/pass-node.js +120 -0
  45. package/dist/src/renderer/pattern-atlas.d.ts +8 -0
  46. package/dist/src/renderer/pattern-atlas.js +79 -0
  47. package/dist/src/renderer/pattern-pass.d.ts +58 -0
  48. package/dist/src/renderer/pattern-pass.js +316 -0
  49. package/dist/src/renderer/pipeline-manager.d.ts +39 -0
  50. package/dist/src/renderer/pipeline-manager.js +287 -0
  51. package/dist/src/renderer/pixel-sorting-pass.d.ts +33 -0
  52. package/dist/src/renderer/pixel-sorting-pass.js +179 -0
  53. package/dist/src/renderer/shaders/tsl/color/tonemapping.d.ts +9 -0
  54. package/dist/src/renderer/shaders/tsl/color/tonemapping.js +59 -0
  55. package/dist/src/renderer/shaders/tsl/cosine-palette.d.ts +4 -0
  56. package/{packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts → dist/src/renderer/shaders/tsl/cosine-palette.js} +3 -4
  57. package/dist/src/renderer/shaders/tsl/noise/common.d.ts +5 -0
  58. package/dist/src/renderer/shaders/tsl/noise/common.js +24 -0
  59. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.d.ts +1 -0
  60. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.js +27 -0
  61. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.d.ts +1 -0
  62. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.js +27 -0
  63. package/dist/src/renderer/shaders/tsl/noise/fbm.d.ts +1 -0
  64. package/dist/src/renderer/shaders/tsl/noise/fbm.js +11 -0
  65. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.d.ts +5 -0
  66. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.js +66 -0
  67. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.d.ts +1 -0
  68. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.js +19 -0
  69. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.d.ts +1 -0
  70. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.js +44 -0
  71. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.d.ts +1 -0
  72. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.js +51 -0
  73. package/dist/src/renderer/shaders/tsl/noise/turbulence.d.ts +7 -0
  74. package/dist/src/renderer/shaders/tsl/noise/turbulence.js +34 -0
  75. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.d.ts +1 -0
  76. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.js +27 -0
  77. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.d.ts +1 -0
  78. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.js +45 -0
  79. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.d.ts +4 -0
  80. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.js +13 -0
  81. package/dist/src/renderer/shaders/tsl/patterns/bloom.d.ts +4 -0
  82. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts → dist/src/renderer/shaders/tsl/patterns/bloom.js} +4 -6
  83. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.d.ts +4 -0
  84. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.js +16 -0
  85. package/dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.d.ts +4 -0
  86. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts → dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.js} +3 -4
  87. package/dist/src/renderer/shaders/tsl/patterns/repeating-pattern.d.ts +4 -0
  88. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts → dist/src/renderer/shaders/tsl/patterns/repeating-pattern.js} +4 -6
  89. package/dist/src/renderer/shaders/tsl/utils/atan2.d.ts +1 -0
  90. package/dist/src/renderer/shaders/tsl/utils/atan2.js +7 -0
  91. package/dist/src/renderer/shaders/tsl/utils/complex-conj.d.ts +4 -0
  92. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts → dist/src/renderer/shaders/tsl/utils/complex-conj.js} +3 -4
  93. package/dist/src/renderer/shaders/tsl/utils/complex-cos.d.ts +4 -0
  94. package/dist/src/renderer/shaders/tsl/utils/complex-cos.js +9 -0
  95. package/dist/src/renderer/shaders/tsl/utils/complex-div.d.ts +1 -0
  96. package/dist/src/renderer/shaders/tsl/utils/complex-div.js +6 -0
  97. package/dist/src/renderer/shaders/tsl/utils/complex-log.d.ts +1 -0
  98. package/dist/src/renderer/shaders/tsl/utils/complex-log.js +6 -0
  99. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.d.ts +4 -0
  100. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.js +10 -0
  101. package/dist/src/renderer/shaders/tsl/utils/complex-mul.d.ts +4 -0
  102. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts → dist/src/renderer/shaders/tsl/utils/complex-mul.js} +3 -4
  103. package/dist/src/renderer/shaders/tsl/utils/complex-pow.d.ts +5 -0
  104. package/dist/src/renderer/shaders/tsl/utils/complex-pow.js +14 -0
  105. package/dist/src/renderer/shaders/tsl/utils/complex-sin.d.ts +4 -0
  106. package/dist/src/renderer/shaders/tsl/utils/complex-sin.js +9 -0
  107. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.d.ts +5 -0
  108. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.js +12 -0
  109. package/dist/src/renderer/shaders/tsl/utils/complex-tan.d.ts +4 -0
  110. package/dist/src/renderer/shaders/tsl/utils/complex-tan.js +11 -0
  111. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.d.ts +4 -0
  112. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.js +9 -0
  113. package/dist/src/renderer/shaders/tsl/utils/hyperbolic.d.ts +8 -0
  114. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts → dist/src/renderer/shaders/tsl/utils/hyperbolic.js} +7 -11
  115. package/dist/src/renderer/shaders/tsl/utils/index.d.ts +38 -0
  116. package/dist/src/renderer/shaders/tsl/utils/index.js +39 -0
  117. package/dist/src/renderer/shaders/tsl/utils/rotate.d.ts +2 -0
  118. package/dist/src/renderer/shaders/tsl/utils/rotate.js +7 -0
  119. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.d.ts +2 -0
  120. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.js +6 -0
  121. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.d.ts +1 -0
  122. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.js +5 -0
  123. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.d.ts +1 -0
  124. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.js +5 -0
  125. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.d.ts +1 -0
  126. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.js +14 -0
  127. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.d.ts +1 -0
  128. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.js +5 -0
  129. package/dist/src/renderer/shaders/tsl/utils/smax.d.ts +1 -0
  130. package/dist/src/renderer/shaders/tsl/utils/smax.js +6 -0
  131. package/dist/src/renderer/shaders/tsl/utils/smin.d.ts +1 -0
  132. package/dist/src/renderer/shaders/tsl/utils/smin.js +6 -0
  133. package/dist/src/renderer/text-pass.d.ts +23 -0
  134. package/dist/src/renderer/text-pass.js +129 -0
  135. package/dist/src/runtime-clock.d.ts +9 -0
  136. package/dist/src/runtime-clock.js +20 -0
  137. package/dist/src/runtime-frame.d.ts +11 -0
  138. package/dist/src/runtime-frame.js +12 -0
  139. package/dist/src/shader-lab-composition.d.ts +9 -0
  140. package/dist/src/shader-lab-composition.js +96 -0
  141. package/dist/src/timeline.d.ts +8 -0
  142. package/dist/src/timeline.js +179 -0
  143. package/dist/src/types/editor.d.ts +3 -0
  144. package/dist/src/types/editor.js +1 -0
  145. package/dist/src/types.d.ts +81 -0
  146. package/dist/src/types.js +1 -0
  147. package/package.json +28 -65
  148. package/.biome/plugins/README.md +0 -21
  149. package/.biome/plugins/no-anchor-element.grit +0 -12
  150. package/.biome/plugins/no-relative-parent-imports.grit +0 -10
  151. package/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  152. package/.changeset/README.md +0 -17
  153. package/.changeset/config.json +0 -11
  154. package/.editorconfig +0 -40
  155. package/.env.example +0 -81
  156. package/.gitattributes +0 -19
  157. package/.github/workflows/canary.yml +0 -80
  158. package/.github/workflows/ci.yml +0 -37
  159. package/.github/workflows/release.yml +0 -56
  160. package/.tldrignore +0 -84
  161. package/.vscode/extensions.json +0 -20
  162. package/.vscode/settings.json +0 -105
  163. package/biome.json +0 -249
  164. package/bun.lock +0 -1224
  165. package/next.config.ts +0 -131
  166. package/packages/shader-lab-react/CHANGELOG.md +0 -9
  167. package/packages/shader-lab-react/README.md +0 -119
  168. package/packages/shader-lab-react/package.json +0 -36
  169. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +0 -57
  170. package/packages/shader-lab-react/scripts/prepare-dist.mjs +0 -4
  171. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +0 -146
  172. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +0 -51
  173. package/packages/shader-lab-react/src/easings.ts +0 -4
  174. package/packages/shader-lab-react/src/index.ts +0 -35
  175. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +0 -2
  176. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +0 -83
  177. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +0 -416
  178. package/packages/shader-lab-react/src/renderer/asset-url.ts +0 -3
  179. package/packages/shader-lab-react/src/renderer/blend-modes.ts +0 -229
  180. package/packages/shader-lab-react/src/renderer/contracts.ts +0 -54
  181. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +0 -48
  182. package/packages/shader-lab-react/src/renderer/crt-pass.ts +0 -1040
  183. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +0 -108
  184. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +0 -309
  185. package/packages/shader-lab-react/src/renderer/dither-textures.ts +0 -99
  186. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +0 -322
  187. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +0 -521
  188. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +0 -932
  189. package/packages/shader-lab-react/src/renderer/ink-pass.ts +0 -802
  190. package/packages/shader-lab-react/src/renderer/live-pass.ts +0 -194
  191. package/packages/shader-lab-react/src/renderer/media-pass.ts +0 -187
  192. package/packages/shader-lab-react/src/renderer/media-texture.ts +0 -66
  193. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +0 -389
  194. package/packages/shader-lab-react/src/renderer/pass-node.ts +0 -209
  195. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +0 -133
  196. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +0 -552
  197. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +0 -369
  198. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +0 -277
  199. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +0 -87
  200. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +0 -31
  201. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -36
  202. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -36
  203. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +0 -13
  204. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -96
  205. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -24
  206. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -79
  207. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -89
  208. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +0 -56
  209. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -32
  210. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -60
  211. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -15
  212. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -24
  213. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +0 -9
  214. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -10
  215. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +0 -11
  216. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +0 -7
  217. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -12
  218. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -16
  219. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -10
  220. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -18
  221. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -12
  222. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -10
  223. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +0 -48
  224. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +0 -15
  225. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -15
  226. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -6
  227. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -6
  228. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -27
  229. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -6
  230. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  231. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +0 -7
  232. package/packages/shader-lab-react/src/renderer/text-pass.ts +0 -176
  233. package/packages/shader-lab-react/src/runtime-clock.ts +0 -42
  234. package/packages/shader-lab-react/src/runtime-frame.ts +0 -29
  235. package/packages/shader-lab-react/src/shader-lab-composition.tsx +0 -163
  236. package/packages/shader-lab-react/src/timeline.ts +0 -283
  237. package/packages/shader-lab-react/src/types/editor.ts +0 -5
  238. package/packages/shader-lab-react/src/types.ts +0 -141
  239. package/packages/shader-lab-react/tsconfig.build.json +0 -8
  240. package/packages/shader-lab-react/tsconfig.json +0 -21
  241. package/postcss.config.mjs +0 -5
  242. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  243. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +0 -1412
  244. package/public/assets/patterns/bars/1.svg +0 -3
  245. package/public/assets/patterns/bars/2.svg +0 -3
  246. package/public/assets/patterns/bars/3.svg +0 -3
  247. package/public/assets/patterns/bars/4.svg +0 -3
  248. package/public/assets/patterns/bars/5.svg +0 -3
  249. package/public/assets/patterns/bars/6.svg +0 -3
  250. package/public/assets/patterns/candles/1.svg +0 -3
  251. package/public/assets/patterns/candles/2.svg +0 -3
  252. package/public/assets/patterns/candles/3.svg +0 -3
  253. package/public/assets/patterns/candles/4.svg +0 -3
  254. package/public/assets/patterns/shapes/1.svg +0 -3
  255. package/public/assets/patterns/shapes/2.svg +0 -3
  256. package/public/assets/patterns/shapes/3.svg +0 -3
  257. package/public/assets/patterns/shapes/4.svg +0 -4
  258. package/public/assets/patterns/shapes/5.svg +0 -3
  259. package/public/assets/patterns/shapes/6.svg +0 -4
  260. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  261. package/public/textures/blue-noise.png +0 -0
  262. package/public/textures/crt-mask.png +0 -0
  263. package/src/app/design/page.tsx +0 -398
  264. package/src/app/favicon.ico +0 -0
  265. package/src/app/globals.css +0 -280
  266. package/src/app/layout.tsx +0 -89
  267. package/src/app/page.tsx +0 -20
  268. package/src/app/robots.ts +0 -13
  269. package/src/app/sitemap.ts +0 -13
  270. package/src/components/editor/editor-canvas-viewport.tsx +0 -116
  271. package/src/components/editor/editor-export-dialog.tsx +0 -1177
  272. package/src/components/editor/editor-timeline-overlay.tsx +0 -983
  273. package/src/components/editor/editor-topbar.tsx +0 -287
  274. package/src/components/editor/layer-sidebar.tsx +0 -738
  275. package/src/components/editor/properties-sidebar-content.tsx +0 -574
  276. package/src/components/editor/properties-sidebar-fields.tsx +0 -389
  277. package/src/components/editor/properties-sidebar-utils.ts +0 -178
  278. package/src/components/editor/properties-sidebar.tsx +0 -421
  279. package/src/components/ui/button/index.tsx +0 -57
  280. package/src/components/ui/color-picker/index.tsx +0 -358
  281. package/src/components/ui/glass-panel/index.tsx +0 -45
  282. package/src/components/ui/icon-button/index.tsx +0 -46
  283. package/src/components/ui/select/index.tsx +0 -136
  284. package/src/components/ui/slider/index.tsx +0 -192
  285. package/src/components/ui/toggle/index.tsx +0 -34
  286. package/src/components/ui/typography/index.tsx +0 -61
  287. package/src/components/ui/xy-pad/index.tsx +0 -160
  288. package/src/features/editor/components/editor-export-dialog.module.css +0 -271
  289. package/src/hooks/use-editor-renderer.ts +0 -182
  290. package/src/lib/app.ts +0 -6
  291. package/src/lib/cn.ts +0 -7
  292. package/src/lib/easings.ts +0 -240
  293. package/src/lib/editor/config/layer-registry.ts +0 -2434
  294. package/src/lib/editor/custom-shader/shared.ts +0 -28
  295. package/src/lib/editor/export.ts +0 -420
  296. package/src/lib/editor/history.ts +0 -71
  297. package/src/lib/editor/layers.ts +0 -76
  298. package/src/lib/editor/parameter-schema.ts +0 -75
  299. package/src/lib/editor/project-file.ts +0 -145
  300. package/src/lib/editor/shader-export-snippet.ts +0 -37
  301. package/src/lib/editor/shader-export.ts +0 -315
  302. package/src/lib/editor/timeline/evaluate.ts +0 -252
  303. package/src/lib/editor/view-transform.ts +0 -58
  304. package/src/lib/fonts.ts +0 -28
  305. package/src/renderer/ascii-atlas.ts +0 -83
  306. package/src/renderer/ascii-pass.ts +0 -416
  307. package/src/renderer/blend-modes.ts +0 -229
  308. package/src/renderer/contracts.ts +0 -161
  309. package/src/renderer/create-webgpu-renderer.ts +0 -48
  310. package/src/renderer/crt-pass.ts +0 -1040
  311. package/src/renderer/custom-shader-pass.ts +0 -117
  312. package/src/renderer/custom-shader-runtime.ts +0 -309
  313. package/src/renderer/dither-textures.ts +0 -99
  314. package/src/renderer/dithering-pass.ts +0 -322
  315. package/src/renderer/gradient-pass.ts +0 -520
  316. package/src/renderer/halftone-pass.ts +0 -932
  317. package/src/renderer/ink-pass.ts +0 -683
  318. package/src/renderer/live-pass.ts +0 -194
  319. package/src/renderer/media-pass.ts +0 -187
  320. package/src/renderer/media-texture.ts +0 -66
  321. package/src/renderer/particle-grid-pass.ts +0 -389
  322. package/src/renderer/pass-node-factory.ts +0 -33
  323. package/src/renderer/pass-node.ts +0 -209
  324. package/src/renderer/pattern-atlas.ts +0 -97
  325. package/src/renderer/pattern-pass.ts +0 -552
  326. package/src/renderer/pipeline-manager.ts +0 -343
  327. package/src/renderer/pixel-sorting-pass.ts +0 -277
  328. package/src/renderer/project-clock.ts +0 -57
  329. package/src/renderer/shaders/tsl/color/tonemapping.ts +0 -86
  330. package/src/renderer/shaders/tsl/cosine-palette.ts +0 -8
  331. package/src/renderer/shaders/tsl/noise/common.ts +0 -30
  332. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -35
  333. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -35
  334. package/src/renderer/shaders/tsl/noise/fbm.ts +0 -12
  335. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -97
  336. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -23
  337. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -78
  338. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -88
  339. package/src/renderer/shaders/tsl/noise/turbulence.ts +0 -55
  340. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -31
  341. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -59
  342. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -14
  343. package/src/renderer/shaders/tsl/patterns/bloom.ts +0 -10
  344. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -23
  345. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +0 -8
  346. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +0 -10
  347. package/src/renderer/shaders/tsl/utils/atan2.ts +0 -8
  348. package/src/renderer/shaders/tsl/utils/complex-conj.ts +0 -8
  349. package/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -9
  350. package/src/renderer/shaders/tsl/utils/complex-div.ts +0 -10
  351. package/src/renderer/shaders/tsl/utils/complex-log.ts +0 -6
  352. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -11
  353. package/src/renderer/shaders/tsl/utils/complex-mul.ts +0 -8
  354. package/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -15
  355. package/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -9
  356. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -17
  357. package/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -11
  358. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -9
  359. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +0 -19
  360. package/src/renderer/shaders/tsl/utils/index.ts +0 -47
  361. package/src/renderer/shaders/tsl/utils/rotate.ts +0 -14
  362. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -14
  363. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -5
  364. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -5
  365. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -26
  366. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -5
  367. package/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  368. package/src/renderer/shaders/tsl/utils/smin.ts +0 -6
  369. package/src/renderer/text-pass.ts +0 -176
  370. package/src/store/asset-store.ts +0 -193
  371. package/src/store/editor-store.ts +0 -223
  372. package/src/store/history-store.ts +0 -172
  373. package/src/store/index.ts +0 -31
  374. package/src/store/layer-store.ts +0 -675
  375. package/src/store/timeline-store.ts +0 -572
  376. package/src/types/assets.d.ts +0 -6
  377. package/src/types/css.d.ts +0 -21
  378. package/src/types/editor.ts +0 -357
  379. package/src/types/react.d.ts +0 -15
  380. package/src/types/three-tsl.d.ts +0 -146
  381. package/src/types/three-webgpu.d.ts +0 -51
  382. package/tsconfig.json +0 -49
  383. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/1.svg +0 -0
  384. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/2.svg +0 -0
  385. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/3.svg +0 -0
  386. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/4.svg +0 -0
  387. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/5.svg +0 -0
  388. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/6.svg +0 -0
  389. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/1.svg +0 -0
  390. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/2.svg +0 -0
  391. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/3.svg +0 -0
  392. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/4.svg +0 -0
  393. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/1.svg +0 -0
  394. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/2.svg +0 -0
  395. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/3.svg +0 -0
  396. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/4.svg +0 -0
  397. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/5.svg +0 -0
  398. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/6.svg +0 -0
  399. /package/{packages/shader-lab-react/assets → assets}/textures/blue-noise.png +0 -0
@@ -0,0 +1,3 @@
1
+ export declare const easings: {
2
+ easeInOutCubic: (x: number) => number;
3
+ };
@@ -0,0 +1,3 @@
1
+ export const easings = {
2
+ easeInOutCubic: (x) => x < 0.5 ? 4 * x * x * x : 1 - ((-2 * x + 2) ** 3) / 2,
3
+ };
@@ -0,0 +1,5 @@
1
+ export { ShaderLabComposition, type ShaderLabCompositionProps, } from "./shader-lab-composition";
2
+ export { advanceRuntimeClock, createRuntimeClock, type ShaderLabRuntimeClock, } from "./runtime-clock";
3
+ export { buildRuntimeFrame, type ShaderLabRuntimeFrame } from "./runtime-frame";
4
+ export { evaluateTimelineForLayers, resolveEvaluatedLayers, type EvaluatedLayerState, } from "./timeline";
5
+ export type { ShaderLabBlendMode, ShaderLabAnimatedPropertyBinding, ShaderLabAssetSource, ShaderLabCompositeMode, ShaderLabConfig, ShaderLabEffectLayerType, ShaderLabInlineSketchSource, ShaderLabLayerKind, ShaderLabLayerConfig, ShaderLabLayerType, ShaderLabModuleSketchSource, ShaderLabParameterValue, ShaderLabSketchSource, ShaderLabSourceLayerType, ShaderLabTimelineConfig, ShaderLabTimelineInterpolation, ShaderLabTimelineKeyframe, ShaderLabTimelineTrack, } from "./types";
@@ -0,0 +1,4 @@
1
+ export { ShaderLabComposition, } from "./shader-lab-composition.js";
2
+ export { advanceRuntimeClock, createRuntimeClock, } from "./runtime-clock.js";
3
+ export { buildRuntimeFrame } from "./runtime-frame.js";
4
+ export { evaluateTimelineForLayers, resolveEvaluatedLayers, } from "./timeline.js";
@@ -0,0 +1 @@
1
+ export declare const CUSTOM_SHADER_ENTRY_EXPORT = "sketch";
@@ -0,0 +1 @@
1
+ export const CUSTOM_SHADER_ENTRY_EXPORT = "sketch";
@@ -0,0 +1,5 @@
1
+ import * as THREE from "three/webgpu";
2
+ export declare const ASCII_CHARSETS: Record<string, string>;
3
+ export type AsciiFontWeight = "thin" | "regular" | "bold";
4
+ export declare const DEFAULT_ASCII_CHARS = " .:-=+*#%@";
5
+ export declare function buildAsciiAtlas(chars: string, fontWeight?: AsciiFontWeight, cellPx?: number): THREE.CanvasTexture;
@@ -0,0 +1,61 @@
1
+ import * as THREE from "three/webgpu";
2
+ export const ASCII_CHARSETS = {
3
+ binary: "01",
4
+ blocks: " ░▒▓█",
5
+ dense: " .',:;!|({#@",
6
+ hatching: " ╱╲╳░▒",
7
+ light: " .:-=+*#%@",
8
+ };
9
+ export const DEFAULT_ASCII_CHARS = " .:-=+*#%@";
10
+ function normalizeChars(chars) {
11
+ return chars.length > 0 ? chars : " ";
12
+ }
13
+ export function buildAsciiAtlas(chars, fontWeight = "regular", cellPx = 16) {
14
+ const normalizedChars = normalizeChars(chars);
15
+ const cellSize = Math.max(4, Math.round(cellPx));
16
+ const fontSize = Math.max(4, Math.floor(cellSize * 0.9));
17
+ const canvas = document.createElement("canvas");
18
+ canvas.width = normalizedChars.length * cellSize;
19
+ canvas.height = cellSize;
20
+ const context = canvas.getContext("2d");
21
+ if (!context) {
22
+ throw new Error("Unable to create 2D context for ASCII atlas");
23
+ }
24
+ context.imageSmoothingEnabled = false;
25
+ context.fillStyle = "#000";
26
+ context.fillRect(0, 0, canvas.width, canvas.height);
27
+ const weightMap = {
28
+ bold: "700",
29
+ regular: "400",
30
+ thin: "100",
31
+ };
32
+ context.fillStyle = "#fff";
33
+ context.font = `${weightMap[fontWeight]} ${fontSize}px "Geist Mono", monospace`;
34
+ context.textAlign = "center";
35
+ context.textBaseline = "alphabetic";
36
+ for (const [index, char] of [...normalizedChars].entries()) {
37
+ const metrics = context.measureText(char);
38
+ const x = Math.round((index + 0.5) * cellSize);
39
+ const y = Math.round((cellSize + metrics.actualBoundingBoxAscent - metrics.actualBoundingBoxDescent) * 0.5);
40
+ context.fillText(char, x, y);
41
+ }
42
+ const image = context.getImageData(0, 0, canvas.width, canvas.height);
43
+ const { data } = image;
44
+ for (let index = 0; index < data.length; index += 4) {
45
+ const mask = (data[index] ?? 0) > 96 ? 255 : 0;
46
+ data[index] = mask;
47
+ data[index + 1] = mask;
48
+ data[index + 2] = mask;
49
+ data[index + 3] = 255;
50
+ }
51
+ context.putImageData(image, 0, 0);
52
+ const texture = new THREE.CanvasTexture(canvas);
53
+ texture.flipY = false;
54
+ texture.generateMipmaps = false;
55
+ texture.magFilter = THREE.NearestFilter;
56
+ texture.minFilter = THREE.NearestFilter;
57
+ texture.wrapS = THREE.ClampToEdgeWrapping;
58
+ texture.wrapT = THREE.ClampToEdgeWrapping;
59
+ texture.needsUpdate = true;
60
+ return texture;
61
+ }
@@ -0,0 +1,50 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { type TSLNode } from "three/tsl";
3
+ import { PassNode } from "./pass-node";
4
+ import type { LayerParameterValues } from "../types/editor";
5
+ type Node = TSLNode;
6
+ export declare class AsciiPass extends PassNode {
7
+ private atlasTexture;
8
+ private atlasTextureNodes;
9
+ private bloomEnabled;
10
+ private bloomNode;
11
+ private readonly bloomIntensityUniform;
12
+ private readonly bloomRadiusUniform;
13
+ private readonly bloomSoftnessUniform;
14
+ private readonly bloomThresholdUniform;
15
+ private readonly cellSizeUniform;
16
+ private readonly bgOpacityUniform;
17
+ private readonly colorModeUniform;
18
+ private readonly invertUniform;
19
+ private readonly monoBlueUniform;
20
+ private readonly monoGreenUniform;
21
+ private readonly logicalHeightUniform;
22
+ private readonly logicalWidthUniform;
23
+ private readonly monoRedUniform;
24
+ private readonly numCharsUniform;
25
+ private readonly placeholder;
26
+ private sourceTextureNodes;
27
+ private currentCellSize;
28
+ private currentCharset;
29
+ private currentCustomChars;
30
+ private currentFontWeight;
31
+ constructor(layerId: string);
32
+ render(renderer: THREE.WebGPURenderer, inputTexture: THREE.Texture, outputTarget: THREE.WebGLRenderTarget, time: number, delta: number): void;
33
+ updateParams(params: LayerParameterValues): void;
34
+ dispose(): void;
35
+ updateLogicalSize(width: number, height: number): void;
36
+ protected buildEffectNode(): Node;
37
+ private getActiveChars;
38
+ private getColorModeValue;
39
+ private rebuildAtlas;
40
+ private resolveCharset;
41
+ private resolveColorMode;
42
+ private resolveFontWeight;
43
+ private normalizeBloomRadius;
44
+ private normalizeBloomSoftness;
45
+ private disposeBloomNode;
46
+ private getBloomTextureNode;
47
+ private trackAtlasTextureNode;
48
+ private trackSourceTextureNode;
49
+ }
50
+ export {};
@@ -0,0 +1,271 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
3
+ import { clamp, float, floor, mix, mod, select, texture as tslTexture, uniform, uv, vec2, vec3, vec4, } from "three/tsl";
4
+ import { ASCII_CHARSETS, buildAsciiAtlas, DEFAULT_ASCII_CHARS, } from "./ascii-atlas.js";
5
+ import { PassNode } from "./pass-node.js";
6
+ function clamp01(value) {
7
+ return Math.max(0, Math.min(1, value));
8
+ }
9
+ function parseCssColorRgb(value) {
10
+ const rgba = value.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*[\d.]+)?\s*\)/i);
11
+ if (rgba) {
12
+ return [
13
+ clamp01(Number.parseFloat(rgba[1] ?? "0") / 255),
14
+ clamp01(Number.parseFloat(rgba[2] ?? "0") / 255),
15
+ clamp01(Number.parseFloat(rgba[3] ?? "0") / 255),
16
+ ];
17
+ }
18
+ const hex = value.trim().replace("#", "");
19
+ if (hex.length === 6) {
20
+ return [
21
+ Number.parseInt(hex.slice(0, 2), 16) / 255,
22
+ Number.parseInt(hex.slice(2, 4), 16) / 255,
23
+ Number.parseInt(hex.slice(4, 6), 16) / 255,
24
+ ];
25
+ }
26
+ if (hex.length === 3) {
27
+ return [
28
+ Number.parseInt(`${hex[0] ?? "0"}${hex[0] ?? "0"}`, 16) / 255,
29
+ Number.parseInt(`${hex[1] ?? "0"}${hex[1] ?? "0"}`, 16) / 255,
30
+ Number.parseInt(`${hex[2] ?? "0"}${hex[2] ?? "0"}`, 16) / 255,
31
+ ];
32
+ }
33
+ return [1, 1, 1];
34
+ }
35
+ export class AsciiPass extends PassNode {
36
+ atlasTexture = null;
37
+ atlasTextureNodes = [];
38
+ bloomEnabled = false;
39
+ bloomNode = null;
40
+ bloomIntensityUniform;
41
+ bloomRadiusUniform;
42
+ bloomSoftnessUniform;
43
+ bloomThresholdUniform;
44
+ cellSizeUniform;
45
+ bgOpacityUniform;
46
+ colorModeUniform;
47
+ invertUniform;
48
+ monoBlueUniform;
49
+ monoGreenUniform;
50
+ logicalHeightUniform;
51
+ logicalWidthUniform;
52
+ monoRedUniform;
53
+ numCharsUniform;
54
+ placeholder;
55
+ sourceTextureNodes = [];
56
+ currentCellSize = 12;
57
+ currentCharset = "light";
58
+ currentCustomChars = DEFAULT_ASCII_CHARS;
59
+ currentFontWeight = "regular";
60
+ constructor(layerId) {
61
+ super(layerId);
62
+ this.placeholder = new THREE.Texture();
63
+ this.bloomIntensityUniform = uniform(1.25);
64
+ this.bloomRadiusUniform = uniform(6);
65
+ this.bloomSoftnessUniform = uniform(0.35);
66
+ this.bloomThresholdUniform = uniform(0.6);
67
+ this.cellSizeUniform = uniform(12);
68
+ this.logicalWidthUniform = uniform(1);
69
+ this.logicalHeightUniform = uniform(1);
70
+ this.numCharsUniform = uniform(DEFAULT_ASCII_CHARS.length);
71
+ this.colorModeUniform = uniform(1);
72
+ this.monoRedUniform = uniform(0.96);
73
+ this.monoGreenUniform = uniform(0.96);
74
+ this.monoBlueUniform = uniform(0.94);
75
+ this.bgOpacityUniform = uniform(0);
76
+ this.invertUniform = uniform(0);
77
+ this.atlasTexture = buildAsciiAtlas(DEFAULT_ASCII_CHARS, "regular", this.currentCellSize);
78
+ this.rebuildEffectNode();
79
+ }
80
+ render(renderer, inputTexture, outputTarget, time, delta) {
81
+ for (const sourceTextureNode of this.sourceTextureNodes) {
82
+ sourceTextureNode.value = inputTexture;
83
+ }
84
+ if (this.atlasTexture) {
85
+ for (const atlasTextureNode of this.atlasTextureNodes) {
86
+ atlasTextureNode.value = this.atlasTexture;
87
+ }
88
+ }
89
+ super.render(renderer, inputTexture, outputTarget, time, delta);
90
+ }
91
+ updateParams(params) {
92
+ const nextCellSize = typeof params.cellSize === "number" ? Math.max(4, Math.round(params.cellSize)) : 12;
93
+ const nextCharset = this.resolveCharset(params.charset);
94
+ const nextCustomChars = typeof params.customChars === "string" ? params.customChars : DEFAULT_ASCII_CHARS;
95
+ const nextFontWeight = this.resolveFontWeight(params.fontWeight);
96
+ const nextColorMode = this.resolveColorMode(params.colorMode);
97
+ const nextBgOpacity = typeof params.bgOpacity === "number" ? clamp01(params.bgOpacity) : 0;
98
+ const nextBloomEnabled = params.bloomEnabled === true;
99
+ const nextBloomIntensity = typeof params.bloomIntensity === "number" ? Math.max(0, params.bloomIntensity) : 1.25;
100
+ const nextBloomThreshold = typeof params.bloomThreshold === "number" ? clamp01(params.bloomThreshold) : 0.6;
101
+ const nextBloomRadius = typeof params.bloomRadius === "number" ? Math.max(0, params.bloomRadius) : 6;
102
+ const nextBloomSoftness = typeof params.bloomSoftness === "number" ? clamp01(params.bloomSoftness) : 0.35;
103
+ const [red, green, blue] = parseCssColorRgb(typeof params.monoColor === "string" ? params.monoColor : "#f5f5f0");
104
+ this.cellSizeUniform.value = nextCellSize;
105
+ this.bgOpacityUniform.value = nextBgOpacity;
106
+ this.bloomIntensityUniform.value = nextBloomIntensity;
107
+ this.bloomRadiusUniform.value = nextBloomRadius;
108
+ this.bloomSoftnessUniform.value = nextBloomSoftness;
109
+ this.bloomThresholdUniform.value = nextBloomThreshold;
110
+ this.invertUniform.value = params.invert === true ? 1 : 0;
111
+ this.monoRedUniform.value = red;
112
+ this.monoGreenUniform.value = green;
113
+ this.monoBlueUniform.value = blue;
114
+ this.colorModeUniform.value = this.getColorModeValue(nextColorMode);
115
+ const needsAtlasRebuild = nextCellSize !== this.currentCellSize ||
116
+ nextCharset !== this.currentCharset ||
117
+ nextFontWeight !== this.currentFontWeight ||
118
+ (nextCharset === "custom" && nextCustomChars !== this.currentCustomChars);
119
+ this.currentCellSize = nextCellSize;
120
+ this.currentCharset = nextCharset;
121
+ this.currentCustomChars = nextCustomChars;
122
+ this.currentFontWeight = nextFontWeight;
123
+ if (nextBloomEnabled !== this.bloomEnabled) {
124
+ this.bloomEnabled = nextBloomEnabled;
125
+ this.rebuildEffectNode();
126
+ return;
127
+ }
128
+ if (this.bloomNode) {
129
+ this.bloomNode.strength.value = nextBloomIntensity;
130
+ this.bloomNode.radius.value = this.normalizeBloomRadius(nextBloomRadius);
131
+ this.bloomNode.threshold.value = nextBloomThreshold;
132
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(nextBloomSoftness);
133
+ }
134
+ if (needsAtlasRebuild) {
135
+ this.rebuildAtlas();
136
+ }
137
+ }
138
+ dispose() {
139
+ this.disposeBloomNode();
140
+ this.placeholder.dispose();
141
+ this.atlasTexture?.dispose();
142
+ super.dispose();
143
+ }
144
+ updateLogicalSize(width, height) {
145
+ this.logicalWidthUniform.value = Math.max(1, width);
146
+ this.logicalHeightUniform.value = Math.max(1, height);
147
+ }
148
+ buildEffectNode() {
149
+ if (!(this.cellSizeUniform && this.numCharsUniform && this.placeholder)) {
150
+ return this.inputNode;
151
+ }
152
+ this.disposeBloomNode();
153
+ this.bloomNode = null;
154
+ this.sourceTextureNodes = [];
155
+ this.atlasTextureNodes = [];
156
+ const renderTargetUv = vec2(uv().x, float(1).sub(uv().y));
157
+ const logicalScreenSize = vec2(this.logicalWidthUniform, this.logicalHeightUniform);
158
+ const normalizedCellSize = vec2(this.cellSizeUniform, this.cellSizeUniform).div(logicalScreenSize);
159
+ const sampleAscii = (sampleUv) => {
160
+ const safeUv = clamp(sampleUv, vec2(float(0), float(0)), vec2(float(1), float(1)));
161
+ const screenPixel = floor(safeUv.mul(logicalScreenSize));
162
+ const cellCenterUv = floor(safeUv.div(normalizedCellSize))
163
+ .add(vec2(0.5, 0.5))
164
+ .mul(normalizedCellSize);
165
+ const localCellPixel = vec2(mod(screenPixel.x, this.cellSizeUniform), mod(screenPixel.y, this.cellSizeUniform));
166
+ const sampledColor = this.trackSourceTextureNode(cellCenterUv);
167
+ const luma = float(sampledColor.r)
168
+ .mul(float(0.2126))
169
+ .add(float(sampledColor.g).mul(float(0.7152)))
170
+ .add(float(sampledColor.b).mul(float(0.0722)));
171
+ const adjustedLuma = select(this.invertUniform.greaterThan(float(0.5)), float(1).sub(luma), luma);
172
+ const charIndex = floor(clamp(adjustedLuma.mul(this.numCharsUniform.sub(float(1))), float(0), this.numCharsUniform.sub(float(1))));
173
+ const atlasUv = vec2(charIndex
174
+ .mul(this.cellSizeUniform)
175
+ .add(localCellPixel.x)
176
+ .add(float(0.5))
177
+ .div(this.numCharsUniform.mul(this.cellSizeUniform)), localCellPixel.y.add(float(0.5)).div(this.cellSizeUniform));
178
+ const characterMask = float(this.trackAtlasTextureNode(atlasUv).r);
179
+ const sourceColor = vec3(float(sampledColor.r), float(sampledColor.g), float(sampledColor.b));
180
+ const monoTint = vec3(this.monoRedUniform, this.monoGreenUniform, this.monoBlueUniform);
181
+ const monochromeColor = monoTint.mul(adjustedLuma);
182
+ const greenTerminalColor = vec3(float(0), adjustedLuma, float(0));
183
+ const glyphColor = select(this.colorModeUniform.lessThan(float(0.5)), sourceColor, select(this.colorModeUniform.lessThan(float(1.5)), monochromeColor, greenTerminalColor));
184
+ const sourceBackground = sourceColor.mul(this.bgOpacityUniform);
185
+ const backgroundColor = select(this.colorModeUniform.lessThan(float(0.5)), sourceBackground, vec3(float(0), float(0), float(0)));
186
+ return {
187
+ baseColor: mix(backgroundColor, glyphColor, characterMask),
188
+ emissiveColor: glyphColor.mul(characterMask),
189
+ };
190
+ };
191
+ const baseSample = sampleAscii(renderTargetUv);
192
+ if (!this.bloomEnabled) {
193
+ return vec4(baseSample.baseColor, float(1));
194
+ }
195
+ const bloomInput = vec4(baseSample.emissiveColor, float(1));
196
+ this.bloomNode = bloom(bloomInput, this.bloomIntensityUniform.value, this.normalizeBloomRadius(this.bloomRadiusUniform.value), this.bloomThresholdUniform.value);
197
+ this.bloomNode.smoothWidth.value = this.normalizeBloomSoftness(this.bloomSoftnessUniform.value);
198
+ return vec4(clamp(baseSample.baseColor.add(this.getBloomTextureNode().rgb), vec3(float(0), float(0), float(0)), vec3(float(1), float(1), float(1))), float(1));
199
+ }
200
+ getActiveChars() {
201
+ return this.currentCharset === "custom"
202
+ ? this.currentCustomChars || " "
203
+ : ASCII_CHARSETS[this.currentCharset] ?? DEFAULT_ASCII_CHARS;
204
+ }
205
+ getColorModeValue(colorMode) {
206
+ switch (colorMode) {
207
+ case "source":
208
+ return 0;
209
+ case "green-terminal":
210
+ return 2;
211
+ default:
212
+ return 1;
213
+ }
214
+ }
215
+ rebuildAtlas() {
216
+ const chars = this.getActiveChars();
217
+ this.atlasTexture?.dispose();
218
+ this.atlasTexture = buildAsciiAtlas(chars, this.currentFontWeight, this.currentCellSize);
219
+ this.numCharsUniform.value = chars.length;
220
+ this.rebuildEffectNode();
221
+ }
222
+ resolveCharset(value) {
223
+ return value === "binary" ||
224
+ value === "blocks" ||
225
+ value === "custom" ||
226
+ value === "dense" ||
227
+ value === "hatching" ||
228
+ value === "light"
229
+ ? value
230
+ : "light";
231
+ }
232
+ resolveColorMode(value) {
233
+ return value === "green-terminal" || value === "source" ? value : "monochrome";
234
+ }
235
+ resolveFontWeight(value) {
236
+ return value === "bold" || value === "thin" ? value : "regular";
237
+ }
238
+ normalizeBloomRadius(value) {
239
+ return clamp01(value / 24);
240
+ }
241
+ normalizeBloomSoftness(value) {
242
+ return Math.max(0.001, value * 0.25);
243
+ }
244
+ disposeBloomNode() {
245
+ ;
246
+ this.bloomNode?.dispose?.();
247
+ }
248
+ getBloomTextureNode() {
249
+ const bloomNode = this.bloomNode;
250
+ if (!bloomNode) {
251
+ throw new Error("Bloom node is not initialized");
252
+ }
253
+ if ("getTextureNode" in bloomNode && typeof bloomNode.getTextureNode === "function") {
254
+ return bloomNode.getTextureNode();
255
+ }
256
+ if ("getTexture" in bloomNode && typeof bloomNode.getTexture === "function") {
257
+ return bloomNode.getTexture();
258
+ }
259
+ throw new Error("Bloom node does not expose a texture getter");
260
+ }
261
+ trackAtlasTextureNode(uvNode) {
262
+ const atlasTextureNode = tslTexture(this.atlasTexture ?? new THREE.Texture(), uvNode);
263
+ this.atlasTextureNodes.push(atlasTextureNode);
264
+ return atlasTextureNode;
265
+ }
266
+ trackSourceTextureNode(uvNode) {
267
+ const sourceTextureNode = tslTexture(this.placeholder, uvNode);
268
+ this.sourceTextureNodes.push(sourceTextureNode);
269
+ return sourceTextureNode;
270
+ }
271
+ }
@@ -0,0 +1 @@
1
+ export declare function resolvePackageAssetUrl(relativePath: string): string;
@@ -0,0 +1,3 @@
1
+ export function resolvePackageAssetUrl(relativePath) {
2
+ return new URL(`../../../assets/${relativePath}`, import.meta.url).toString();
3
+ }
@@ -0,0 +1,4 @@
1
+ import { type TSLNode } from "three/tsl";
2
+ type Node = TSLNode;
3
+ export declare function buildBlendNode(mode: string, base: Node, blend: Node, opacity: Node, compositeMode?: "filter" | "mask"): Node;
4
+ export {};
@@ -0,0 +1,157 @@
1
+ import { abs, clamp, dot, float, max, min, mix, select, sqrt, vec3, vec4, } from "three/tsl";
2
+ function normal(_base, blend) {
3
+ return blend;
4
+ }
5
+ function multiply(base, blend) {
6
+ return base.mul(blend);
7
+ }
8
+ function screen(base, blend) {
9
+ return float(1).sub(float(1).sub(base).mul(float(1).sub(blend)));
10
+ }
11
+ function overlay(base, blend) {
12
+ const dark = float(2).mul(base).mul(blend);
13
+ const light = float(1).sub(float(2).mul(float(1).sub(base)).mul(float(1).sub(blend)));
14
+ return select(base.lessThan(float(0.5)), dark, light);
15
+ }
16
+ function darken(base, blend) {
17
+ return min(base, blend);
18
+ }
19
+ function lighten(base, blend) {
20
+ return max(base, blend);
21
+ }
22
+ function colorDodge(base, blend) {
23
+ return clamp(base.div(max(float(1).sub(blend), float(1e-6))), vec3(0), vec3(1));
24
+ }
25
+ function colorBurn(base, blend) {
26
+ return clamp(float(1).sub(float(1).sub(base).div(max(blend, float(1e-6)))), vec3(0), vec3(1));
27
+ }
28
+ function hardLight(base, blend) {
29
+ return overlay(blend, base);
30
+ }
31
+ function softLight(base, blend) {
32
+ const darkResult = base.sub(float(1).sub(float(2).mul(blend)).mul(base).mul(float(1).sub(base)));
33
+ const twoBlendMinusOne = float(2).mul(blend).sub(float(1));
34
+ const dLow = float(16).mul(base).sub(float(12)).mul(base).add(float(4)).mul(base);
35
+ const dHigh = sqrt(base);
36
+ const d = select(base.lessThanEqual(float(0.25)), dLow, dHigh);
37
+ const lightResult = base.add(twoBlendMinusOne.mul(d.sub(base)));
38
+ return select(blend.lessThanEqual(float(0.5)), darkResult, lightResult);
39
+ }
40
+ function difference(base, blend) {
41
+ return abs(base.sub(blend));
42
+ }
43
+ function exclusion(base, blend) {
44
+ return base.add(blend).sub(float(2).mul(base).mul(blend));
45
+ }
46
+ function lum(color) {
47
+ return dot(color, vec3(0.2126, 0.7152, 0.0722));
48
+ }
49
+ function clipColor(color) {
50
+ const luma = lum(color);
51
+ const colorMin = min(color.x, min(color.y, color.z));
52
+ const lowClipped = color
53
+ .sub(luma)
54
+ .mul(luma.div(max(luma.sub(colorMin), float(1e-6))))
55
+ .add(luma);
56
+ const lowAdjusted = select(colorMin.lessThan(float(0)), lowClipped, color);
57
+ const maxAfterLow = max(lowAdjusted.x, max(lowAdjusted.y, lowAdjusted.z));
58
+ const excess = maxAfterLow.sub(float(1));
59
+ const highClipped = lowAdjusted
60
+ .sub(luma)
61
+ .mul(float(1).sub(luma).div(max(excess, float(1e-6))))
62
+ .add(luma);
63
+ return select(maxAfterLow.greaterThan(float(1)), highClipped, lowAdjusted);
64
+ }
65
+ function setLum(color, nextLum) {
66
+ return clipColor(color.add(nextLum.sub(lum(color))));
67
+ }
68
+ function sat(color) {
69
+ return max(color.x, max(color.y, color.z)).sub(min(color.x, min(color.y, color.z)));
70
+ }
71
+ function setSat(color, nextSat) {
72
+ const red = color.x;
73
+ const green = color.y;
74
+ const blue = color.z;
75
+ const colorMin = min(red, min(green, blue));
76
+ const colorMax = max(red, max(green, blue));
77
+ const delta = colorMax.sub(colorMin);
78
+ const scale = select(delta.greaterThan(float(0)), nextSat.div(delta), float(0));
79
+ const redOut = select(red.lessThanEqual(colorMin), float(0), select(red.greaterThanEqual(colorMax), nextSat, red.sub(colorMin).mul(scale)));
80
+ const greenOut = select(green.lessThanEqual(colorMin), float(0), select(green.greaterThanEqual(colorMax), nextSat, green.sub(colorMin).mul(scale)));
81
+ const blueOut = select(blue.lessThanEqual(colorMin), float(0), select(blue.greaterThanEqual(colorMax), nextSat, blue.sub(colorMin).mul(scale)));
82
+ return vec3(redOut, greenOut, blueOut);
83
+ }
84
+ function hue(base, blend) {
85
+ return setLum(setSat(blend, sat(base)), lum(base));
86
+ }
87
+ function saturation(base, blend) {
88
+ return setLum(setSat(base, sat(blend)), lum(base));
89
+ }
90
+ function color(base, blend) {
91
+ return setLum(blend, lum(base));
92
+ }
93
+ function luminosity(base, blend) {
94
+ return setLum(base, lum(blend));
95
+ }
96
+ export function buildBlendNode(mode, base, blend, opacity, compositeMode = "filter") {
97
+ const baseRgb = base.rgb;
98
+ const blendRgb = blend.rgb;
99
+ const normalizedOpacity = float(clamp(opacity, float(0), float(1)));
100
+ let composited;
101
+ switch (mode) {
102
+ case "multiply":
103
+ composited = multiply(baseRgb, blendRgb);
104
+ break;
105
+ case "screen":
106
+ composited = screen(baseRgb, blendRgb);
107
+ break;
108
+ case "overlay":
109
+ composited = overlay(baseRgb, blendRgb);
110
+ break;
111
+ case "darken":
112
+ composited = darken(baseRgb, blendRgb);
113
+ break;
114
+ case "lighten":
115
+ composited = lighten(baseRgb, blendRgb);
116
+ break;
117
+ case "color-dodge":
118
+ composited = colorDodge(baseRgb, blendRgb);
119
+ break;
120
+ case "color-burn":
121
+ composited = colorBurn(baseRgb, blendRgb);
122
+ break;
123
+ case "hard-light":
124
+ composited = hardLight(baseRgb, blendRgb);
125
+ break;
126
+ case "soft-light":
127
+ composited = softLight(baseRgb, blendRgb);
128
+ break;
129
+ case "difference":
130
+ composited = difference(baseRgb, blendRgb);
131
+ break;
132
+ case "exclusion":
133
+ composited = exclusion(baseRgb, blendRgb);
134
+ break;
135
+ case "hue":
136
+ composited = hue(baseRgb, blendRgb);
137
+ break;
138
+ case "saturation":
139
+ composited = saturation(baseRgb, blendRgb);
140
+ break;
141
+ case "color":
142
+ composited = color(baseRgb, blendRgb);
143
+ break;
144
+ case "luminosity":
145
+ composited = luminosity(baseRgb, blendRgb);
146
+ break;
147
+ default:
148
+ composited = normal(baseRgb, blendRgb);
149
+ break;
150
+ }
151
+ if (compositeMode === "filter") {
152
+ return vec4(mix(baseRgb, composited, normalizedOpacity), float(1));
153
+ }
154
+ const maskLuma = float(dot(blendRgb, vec3(0.2126, 0.7152, 0.0722)));
155
+ const maskStrength = mix(float(1), clamp(maskLuma, float(0), float(1)), normalizedOpacity);
156
+ return vec4(baseRgb.mul(maskStrength), float(1));
157
+ }
@@ -0,0 +1,26 @@
1
+ import type { ShaderLabConfig, ShaderLabLayerConfig } from "../types";
2
+ export interface RendererSize {
3
+ height: number;
4
+ width: number;
5
+ }
6
+ export interface ProjectClock {
7
+ delta: number;
8
+ duration: number;
9
+ loop: boolean;
10
+ time: number;
11
+ }
12
+ export interface RendererFrame {
13
+ clock: ProjectClock;
14
+ layers: ShaderLabLayerConfig[];
15
+ logicalSize: ShaderLabConfig["composition"];
16
+ outputSize: RendererSize;
17
+ pixelRatio: number;
18
+ viewportSize: RendererSize;
19
+ }
20
+ export interface RuntimeRenderer {
21
+ dispose(): void;
22
+ initialize(): Promise<void>;
23
+ render(frame: RendererFrame): boolean;
24
+ resize(size: RendererSize, pixelRatio: number): void;
25
+ }
26
+ export declare function buildRendererFrame(config: ShaderLabConfig, time: number, delta: number, pixelRatio: number, viewportSize: RendererSize): RendererFrame;
@@ -0,0 +1,13 @@
1
+ import { createRuntimeClock } from "../runtime-clock.js";
2
+ import { resolveEvaluatedLayers } from "../timeline.js";
3
+ export function buildRendererFrame(config, time, delta, pixelRatio, viewportSize) {
4
+ const layers = resolveEvaluatedLayers(config.layers, config.timeline.tracks, time).filter((layer) => layer.visible);
5
+ return {
6
+ clock: createRuntimeClock(config.timeline, time, delta),
7
+ layers,
8
+ logicalSize: viewportSize,
9
+ outputSize: viewportSize,
10
+ pixelRatio,
11
+ viewportSize,
12
+ };
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { RuntimeRenderer } from "./contracts";
2
+ export declare function browserSupportsWebGPU(): boolean;
3
+ export declare function createWebGPURenderer(canvas: HTMLCanvasElement, onRuntimeError?: (message: string | null) => void): Promise<RuntimeRenderer>;
@@ -0,0 +1,37 @@
1
+ import * as THREE from "three/webgpu";
2
+ import { PipelineManager } from "./pipeline-manager.js";
3
+ export function browserSupportsWebGPU() {
4
+ return typeof navigator !== "undefined" && "gpu" in navigator;
5
+ }
6
+ export async function createWebGPURenderer(canvas, onRuntimeError) {
7
+ const renderer = new THREE.WebGPURenderer({
8
+ alpha: false,
9
+ antialias: true,
10
+ canvas,
11
+ });
12
+ let pipeline = null;
13
+ return {
14
+ async initialize() {
15
+ await renderer.init();
16
+ renderer.setClearColor("#0a0d10", 1);
17
+ },
18
+ resize(size, pixelRatio) {
19
+ renderer.setPixelRatio(pixelRatio);
20
+ renderer.setSize(size.width, size.height, false);
21
+ pipeline?.resize(size);
22
+ },
23
+ render(frame) {
24
+ if (!pipeline) {
25
+ pipeline = new PipelineManager(renderer, frame.viewportSize, onRuntimeError);
26
+ }
27
+ pipeline.updateLogicalSize(frame.logicalSize);
28
+ pipeline.syncLayers([...frame.layers].reverse());
29
+ return pipeline.render(frame.clock.time, frame.clock.delta);
30
+ },
31
+ dispose() {
32
+ renderer.setAnimationLoop(null);
33
+ pipeline?.dispose();
34
+ renderer.dispose();
35
+ },
36
+ };
37
+ }