@basementstudio/shader-lab 0.1.0

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 (261) hide show
  1. package/.biome/plugins/README.md +21 -0
  2. package/.biome/plugins/no-anchor-element.grit +12 -0
  3. package/.biome/plugins/no-relative-parent-imports.grit +10 -0
  4. package/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  5. package/.changeset/README.md +17 -0
  6. package/.changeset/config.json +11 -0
  7. package/.editorconfig +40 -0
  8. package/.env.example +81 -0
  9. package/.gitattributes +19 -0
  10. package/.github/workflows/canary.yml +80 -0
  11. package/.github/workflows/ci.yml +37 -0
  12. package/.github/workflows/release.yml +56 -0
  13. package/.tldrignore +84 -0
  14. package/.vscode/extensions.json +20 -0
  15. package/.vscode/settings.json +105 -0
  16. package/README.md +119 -0
  17. package/biome.json +249 -0
  18. package/bun.lock +1224 -0
  19. package/next.config.ts +131 -0
  20. package/package.json +73 -0
  21. package/packages/shader-lab-react/CHANGELOG.md +9 -0
  22. package/packages/shader-lab-react/README.md +119 -0
  23. package/packages/shader-lab-react/assets/patterns/bars/1.svg +3 -0
  24. package/packages/shader-lab-react/assets/patterns/bars/2.svg +3 -0
  25. package/packages/shader-lab-react/assets/patterns/bars/3.svg +3 -0
  26. package/packages/shader-lab-react/assets/patterns/bars/4.svg +3 -0
  27. package/packages/shader-lab-react/assets/patterns/bars/5.svg +3 -0
  28. package/packages/shader-lab-react/assets/patterns/bars/6.svg +3 -0
  29. package/packages/shader-lab-react/assets/patterns/candles/1.svg +3 -0
  30. package/packages/shader-lab-react/assets/patterns/candles/2.svg +3 -0
  31. package/packages/shader-lab-react/assets/patterns/candles/3.svg +3 -0
  32. package/packages/shader-lab-react/assets/patterns/candles/4.svg +3 -0
  33. package/packages/shader-lab-react/assets/patterns/shapes/1.svg +3 -0
  34. package/packages/shader-lab-react/assets/patterns/shapes/2.svg +3 -0
  35. package/packages/shader-lab-react/assets/patterns/shapes/3.svg +3 -0
  36. package/packages/shader-lab-react/assets/patterns/shapes/4.svg +4 -0
  37. package/packages/shader-lab-react/assets/patterns/shapes/5.svg +3 -0
  38. package/packages/shader-lab-react/assets/patterns/shapes/6.svg +4 -0
  39. package/packages/shader-lab-react/assets/textures/blue-noise.png +0 -0
  40. package/packages/shader-lab-react/package.json +36 -0
  41. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +57 -0
  42. package/packages/shader-lab-react/scripts/prepare-dist.mjs +4 -0
  43. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +146 -0
  44. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +51 -0
  45. package/packages/shader-lab-react/src/easings.ts +4 -0
  46. package/packages/shader-lab-react/src/index.ts +35 -0
  47. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +2 -0
  48. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +83 -0
  49. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +416 -0
  50. package/packages/shader-lab-react/src/renderer/asset-url.ts +3 -0
  51. package/packages/shader-lab-react/src/renderer/blend-modes.ts +229 -0
  52. package/packages/shader-lab-react/src/renderer/contracts.ts +54 -0
  53. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +48 -0
  54. package/packages/shader-lab-react/src/renderer/crt-pass.ts +1040 -0
  55. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +108 -0
  56. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +309 -0
  57. package/packages/shader-lab-react/src/renderer/dither-textures.ts +99 -0
  58. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +322 -0
  59. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +521 -0
  60. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +932 -0
  61. package/packages/shader-lab-react/src/renderer/ink-pass.ts +802 -0
  62. package/packages/shader-lab-react/src/renderer/live-pass.ts +194 -0
  63. package/packages/shader-lab-react/src/renderer/media-pass.ts +187 -0
  64. package/packages/shader-lab-react/src/renderer/media-texture.ts +66 -0
  65. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +389 -0
  66. package/packages/shader-lab-react/src/renderer/pass-node.ts +209 -0
  67. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +133 -0
  68. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +552 -0
  69. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +369 -0
  70. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +277 -0
  71. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +87 -0
  72. package/packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts +9 -0
  73. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +31 -0
  74. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +36 -0
  75. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +36 -0
  76. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +13 -0
  77. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +96 -0
  78. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +24 -0
  79. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +79 -0
  80. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +89 -0
  81. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +56 -0
  82. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +32 -0
  83. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +60 -0
  84. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +15 -0
  85. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts +11 -0
  86. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +24 -0
  87. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +9 -0
  88. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +11 -0
  89. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +9 -0
  90. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts +9 -0
  91. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +10 -0
  92. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +11 -0
  93. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +7 -0
  94. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +12 -0
  95. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts +9 -0
  96. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +16 -0
  97. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +10 -0
  98. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +18 -0
  99. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +12 -0
  100. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +10 -0
  101. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts +20 -0
  102. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +48 -0
  103. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +15 -0
  104. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +15 -0
  105. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +6 -0
  106. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +6 -0
  107. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +27 -0
  108. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +6 -0
  109. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +7 -0
  110. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +7 -0
  111. package/packages/shader-lab-react/src/renderer/text-pass.ts +176 -0
  112. package/packages/shader-lab-react/src/runtime-clock.ts +42 -0
  113. package/packages/shader-lab-react/src/runtime-frame.ts +29 -0
  114. package/packages/shader-lab-react/src/shader-lab-composition.tsx +163 -0
  115. package/packages/shader-lab-react/src/timeline.ts +283 -0
  116. package/packages/shader-lab-react/src/types/editor.ts +5 -0
  117. package/packages/shader-lab-react/src/types.ts +141 -0
  118. package/packages/shader-lab-react/tsconfig.build.json +8 -0
  119. package/packages/shader-lab-react/tsconfig.json +21 -0
  120. package/postcss.config.mjs +5 -0
  121. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  122. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +1412 -0
  123. package/public/assets/patterns/bars/1.svg +3 -0
  124. package/public/assets/patterns/bars/2.svg +3 -0
  125. package/public/assets/patterns/bars/3.svg +3 -0
  126. package/public/assets/patterns/bars/4.svg +3 -0
  127. package/public/assets/patterns/bars/5.svg +3 -0
  128. package/public/assets/patterns/bars/6.svg +3 -0
  129. package/public/assets/patterns/candles/1.svg +3 -0
  130. package/public/assets/patterns/candles/2.svg +3 -0
  131. package/public/assets/patterns/candles/3.svg +3 -0
  132. package/public/assets/patterns/candles/4.svg +3 -0
  133. package/public/assets/patterns/shapes/1.svg +3 -0
  134. package/public/assets/patterns/shapes/2.svg +3 -0
  135. package/public/assets/patterns/shapes/3.svg +3 -0
  136. package/public/assets/patterns/shapes/4.svg +4 -0
  137. package/public/assets/patterns/shapes/5.svg +3 -0
  138. package/public/assets/patterns/shapes/6.svg +4 -0
  139. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  140. package/public/textures/blue-noise.png +0 -0
  141. package/public/textures/crt-mask.png +0 -0
  142. package/src/app/design/page.tsx +398 -0
  143. package/src/app/favicon.ico +0 -0
  144. package/src/app/globals.css +280 -0
  145. package/src/app/layout.tsx +89 -0
  146. package/src/app/page.tsx +20 -0
  147. package/src/app/robots.ts +13 -0
  148. package/src/app/sitemap.ts +13 -0
  149. package/src/components/editor/editor-canvas-viewport.tsx +116 -0
  150. package/src/components/editor/editor-export-dialog.tsx +1177 -0
  151. package/src/components/editor/editor-timeline-overlay.tsx +983 -0
  152. package/src/components/editor/editor-topbar.tsx +287 -0
  153. package/src/components/editor/layer-sidebar.tsx +738 -0
  154. package/src/components/editor/properties-sidebar-content.tsx +574 -0
  155. package/src/components/editor/properties-sidebar-fields.tsx +389 -0
  156. package/src/components/editor/properties-sidebar-utils.ts +178 -0
  157. package/src/components/editor/properties-sidebar.tsx +421 -0
  158. package/src/components/ui/button/index.tsx +57 -0
  159. package/src/components/ui/color-picker/index.tsx +358 -0
  160. package/src/components/ui/glass-panel/index.tsx +45 -0
  161. package/src/components/ui/icon-button/index.tsx +46 -0
  162. package/src/components/ui/select/index.tsx +136 -0
  163. package/src/components/ui/slider/index.tsx +192 -0
  164. package/src/components/ui/toggle/index.tsx +34 -0
  165. package/src/components/ui/typography/index.tsx +61 -0
  166. package/src/components/ui/xy-pad/index.tsx +160 -0
  167. package/src/features/editor/components/editor-export-dialog.module.css +271 -0
  168. package/src/hooks/use-editor-renderer.ts +182 -0
  169. package/src/lib/app.ts +6 -0
  170. package/src/lib/cn.ts +7 -0
  171. package/src/lib/easings.ts +240 -0
  172. package/src/lib/editor/config/layer-registry.ts +2434 -0
  173. package/src/lib/editor/custom-shader/shared.ts +28 -0
  174. package/src/lib/editor/export.ts +420 -0
  175. package/src/lib/editor/history.ts +71 -0
  176. package/src/lib/editor/layers.ts +76 -0
  177. package/src/lib/editor/parameter-schema.ts +75 -0
  178. package/src/lib/editor/project-file.ts +145 -0
  179. package/src/lib/editor/shader-export-snippet.ts +37 -0
  180. package/src/lib/editor/shader-export.ts +315 -0
  181. package/src/lib/editor/timeline/evaluate.ts +252 -0
  182. package/src/lib/editor/view-transform.ts +58 -0
  183. package/src/lib/fonts.ts +28 -0
  184. package/src/renderer/ascii-atlas.ts +83 -0
  185. package/src/renderer/ascii-pass.ts +416 -0
  186. package/src/renderer/blend-modes.ts +229 -0
  187. package/src/renderer/contracts.ts +161 -0
  188. package/src/renderer/create-webgpu-renderer.ts +48 -0
  189. package/src/renderer/crt-pass.ts +1040 -0
  190. package/src/renderer/custom-shader-pass.ts +117 -0
  191. package/src/renderer/custom-shader-runtime.ts +309 -0
  192. package/src/renderer/dither-textures.ts +99 -0
  193. package/src/renderer/dithering-pass.ts +322 -0
  194. package/src/renderer/gradient-pass.ts +520 -0
  195. package/src/renderer/halftone-pass.ts +932 -0
  196. package/src/renderer/ink-pass.ts +683 -0
  197. package/src/renderer/live-pass.ts +194 -0
  198. package/src/renderer/media-pass.ts +187 -0
  199. package/src/renderer/media-texture.ts +66 -0
  200. package/src/renderer/particle-grid-pass.ts +389 -0
  201. package/src/renderer/pass-node-factory.ts +33 -0
  202. package/src/renderer/pass-node.ts +209 -0
  203. package/src/renderer/pattern-atlas.ts +97 -0
  204. package/src/renderer/pattern-pass.ts +552 -0
  205. package/src/renderer/pipeline-manager.ts +343 -0
  206. package/src/renderer/pixel-sorting-pass.ts +277 -0
  207. package/src/renderer/project-clock.ts +57 -0
  208. package/src/renderer/shaders/tsl/color/tonemapping.ts +86 -0
  209. package/src/renderer/shaders/tsl/cosine-palette.ts +8 -0
  210. package/src/renderer/shaders/tsl/noise/common.ts +30 -0
  211. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +35 -0
  212. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +35 -0
  213. package/src/renderer/shaders/tsl/noise/fbm.ts +12 -0
  214. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +97 -0
  215. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +23 -0
  216. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +78 -0
  217. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +88 -0
  218. package/src/renderer/shaders/tsl/noise/turbulence.ts +55 -0
  219. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +31 -0
  220. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +59 -0
  221. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +14 -0
  222. package/src/renderer/shaders/tsl/patterns/bloom.ts +10 -0
  223. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +23 -0
  224. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +8 -0
  225. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +10 -0
  226. package/src/renderer/shaders/tsl/utils/atan2.ts +8 -0
  227. package/src/renderer/shaders/tsl/utils/complex-conj.ts +8 -0
  228. package/src/renderer/shaders/tsl/utils/complex-cos.ts +9 -0
  229. package/src/renderer/shaders/tsl/utils/complex-div.ts +10 -0
  230. package/src/renderer/shaders/tsl/utils/complex-log.ts +6 -0
  231. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +11 -0
  232. package/src/renderer/shaders/tsl/utils/complex-mul.ts +8 -0
  233. package/src/renderer/shaders/tsl/utils/complex-pow.ts +15 -0
  234. package/src/renderer/shaders/tsl/utils/complex-sin.ts +9 -0
  235. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +17 -0
  236. package/src/renderer/shaders/tsl/utils/complex-tan.ts +11 -0
  237. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +9 -0
  238. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +19 -0
  239. package/src/renderer/shaders/tsl/utils/index.ts +47 -0
  240. package/src/renderer/shaders/tsl/utils/rotate.ts +14 -0
  241. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +14 -0
  242. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +5 -0
  243. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +5 -0
  244. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +26 -0
  245. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +5 -0
  246. package/src/renderer/shaders/tsl/utils/smax.ts +7 -0
  247. package/src/renderer/shaders/tsl/utils/smin.ts +6 -0
  248. package/src/renderer/text-pass.ts +176 -0
  249. package/src/store/asset-store.ts +193 -0
  250. package/src/store/editor-store.ts +223 -0
  251. package/src/store/history-store.ts +172 -0
  252. package/src/store/index.ts +31 -0
  253. package/src/store/layer-store.ts +675 -0
  254. package/src/store/timeline-store.ts +572 -0
  255. package/src/types/assets.d.ts +6 -0
  256. package/src/types/css.d.ts +21 -0
  257. package/src/types/editor.ts +357 -0
  258. package/src/types/react.d.ts +15 -0
  259. package/src/types/three-tsl.d.ts +146 -0
  260. package/src/types/three-webgpu.d.ts +51 -0
  261. package/tsconfig.json +49 -0
@@ -0,0 +1,86 @@
1
+ import { Fn, dot, exp, mix, pow, smoothstep, vec3 } from "three/tsl"
2
+
3
+ export const reinhardTonemap = Fn(([color]) => {
4
+ return color.div(color.add(1.0))
5
+ })
6
+
7
+ export const totosTonemap = Fn(([color]) => {
8
+ const compressed = color
9
+ .mul(vec3(1.18, 1.04, 0.94))
10
+ .div(color.mul(vec3(0.82, 0.9, 0.98)).add(vec3(0.78, 0.68, 0.6)))
11
+ const lum = dot(compressed, vec3(0.2126, 0.7152, 0.0722))
12
+ const shadowLift = smoothstep(0.0, 0.38, lum)
13
+ const highlightRoll = smoothstep(0.42, 1.0, lum)
14
+ const toneMix = smoothstep(0.16, 0.82, lum)
15
+ const cool = vec3(
16
+ compressed.x.mul(0.82),
17
+ compressed.y.mul(0.98).add(shadowLift.mul(0.04)),
18
+ compressed.z.mul(1.24).add(shadowLift.mul(0.08)),
19
+ )
20
+ const warm = vec3(
21
+ compressed.x.mul(1.14).add(highlightRoll.mul(0.08)),
22
+ compressed.y.mul(1.03).add(highlightRoll.mul(0.03)),
23
+ compressed.z.mul(0.84),
24
+ )
25
+ const splitToned = mix(cool, warm, toneMix)
26
+ const curved = vec3(
27
+ pow(splitToned.x, 0.86),
28
+ pow(splitToned.y, 0.95),
29
+ pow(splitToned.z, 1.12),
30
+ )
31
+ const bleach = mix(curved, vec3(lum), highlightRoll.mul(0.06))
32
+
33
+ return bleach.clamp(0.0, 1.0)
34
+ })
35
+
36
+ export const acesTonemap = Fn(([color]) => {
37
+ const a = 2.51
38
+ const b = 0.03
39
+ const c = 2.43
40
+ const d = 0.59
41
+ const e = 0.14
42
+
43
+ return color
44
+ .mul(color.mul(a).add(b))
45
+ .div(color.mul(color.mul(c).add(d)).add(e))
46
+ .clamp(0.0, 1.0)
47
+ })
48
+
49
+ export const crossProcessTonemap = Fn(([color]) => {
50
+ const r = pow(color.x, 0.8)
51
+ const g = pow(color.y, 1.2)
52
+ const b = pow(color.z, 1.5)
53
+
54
+ return vec3(r, g, b).clamp(0.0, 1.0)
55
+ })
56
+
57
+ export const bleachBypassTonemap = Fn(([color]) => {
58
+ const lum = dot(color, vec3(0.2126, 0.7152, 0.0722))
59
+ const mixAmount = 0.7
60
+
61
+ return mix(vec3(lum), color, mixAmount).mul(1.2).clamp(0.0, 1.0)
62
+ })
63
+
64
+ export const technicolorTonemap = Fn(([color]) => {
65
+ const r = color.x.mul(1.5)
66
+ const g = color.y.mul(1.2)
67
+ const b = color.z.mul(0.8).add(color.x.mul(0.2))
68
+
69
+ return vec3(r, g, b).clamp(0.0, 1.0)
70
+ })
71
+
72
+ export const cinematicTonemap = Fn(([color]) => {
73
+ const r = smoothstep(0.05, 0.95, color.x.mul(0.95).add(0.02))
74
+ const g = smoothstep(0.05, 0.95, color.y.mul(1.05))
75
+ const b = smoothstep(0.05, 0.95, color.z.mul(1.1))
76
+
77
+ return vec3(r, g, b).clamp(0.0, 1.0)
78
+ })
79
+
80
+ export const tanh = Fn(([x]) => {
81
+ const e2x = exp(x.mul(2.0))
82
+
83
+ return e2x.sub(1.0).div(e2x.add(1.0))
84
+ })
85
+
86
+ export const uncharted2Tonemap = totosTonemap
@@ -0,0 +1,8 @@
1
+ import { Fn, cos, float } from "three/tsl"
2
+
3
+ /**
4
+ * Generates a palette of colors using a cosine-based function.
5
+ */
6
+ export const cosinePalette = Fn(([t, a, b, c, d, e = float(6.28318)]) => {
7
+ return a.add(b.mul(cos(e.mul(c.mul(t).add(d)))))
8
+ })
@@ -0,0 +1,30 @@
1
+ import { Fn, abs, add, dot, floor, fract, mod, mul, step, sub, vec3, vec4 } from "three/tsl"
2
+
3
+ export const permute = Fn(([x]) => {
4
+ return mod(mul(add(mul(x, 34.0), 10.0), x), 289.0)
5
+ })
6
+
7
+ export const taylorInvSqrt = Fn(([r]) => {
8
+ return sub(1.79284291400159, mul(0.85373472095314, r))
9
+ })
10
+
11
+ export const mod289 = Fn(([x]) => {
12
+ return mod(mul(add(mul(x, 34.0), 10.0), x), 289.0)
13
+ })
14
+
15
+ export const fade = Fn(([t]) => {
16
+ return t.mul(t).mul(t).mul(t.mul(t).mul(6.0).sub(t.mul(15.0)).add(10.0))
17
+ })
18
+
19
+ export const grad4 = Fn(([j, ip]) => {
20
+ const ones = vec4(1.0, 1.0, 1.0, -1.0)
21
+ const p = vec4().toVar()
22
+ const s = vec4().toVar()
23
+
24
+ p.xyz.assign(floor(fract(vec3(j).mul(ip.xyz)).mul(7.0)).mul(ip.z).sub(1.0))
25
+ p.w.assign(sub(1.5, dot(abs(p.xyz), ones.xyz)))
26
+ s.assign(step(p, vec4(0.0)))
27
+ p.xyz.assign(p.xyz.add(s.xyz.mul(2.0).sub(1.0).mul(s.www)))
28
+
29
+ return p
30
+ })
@@ -0,0 +1,35 @@
1
+ import { EPSILON, Fn, cross, vec3 } from "three/tsl"
2
+ import { simplexNoise3d } from "./simplex-noise-3d"
3
+
4
+ export const curlNoise3d = Fn(([inputA]) => {
5
+ const aXPos = simplexNoise3d(inputA.add(vec3(EPSILON, 0, 0)))
6
+ const aXNeg = simplexNoise3d(inputA.sub(vec3(EPSILON, 0, 0)))
7
+ const aXAverage = aXPos.sub(aXNeg).div(EPSILON.mul(2))
8
+
9
+ const aYPos = simplexNoise3d(inputA.add(vec3(0, EPSILON, 0)))
10
+ const aYNeg = simplexNoise3d(inputA.sub(vec3(0, EPSILON, 0)))
11
+ const aYAverage = aYPos.sub(aYNeg).div(EPSILON.mul(2))
12
+
13
+ const aZPos = simplexNoise3d(inputA.add(vec3(0, 0, EPSILON)))
14
+ const aZNeg = simplexNoise3d(inputA.sub(vec3(0, 0, EPSILON)))
15
+ const aZAverage = aZPos.sub(aZNeg).div(EPSILON.mul(2))
16
+
17
+ const aGrabNoise = vec3(aXAverage, aYAverage, aZAverage).normalize()
18
+ const inputB = inputA.add(3.5)
19
+
20
+ const bXPos = simplexNoise3d(inputB.add(vec3(EPSILON, 0, 0)))
21
+ const bXNeg = simplexNoise3d(inputB.sub(vec3(EPSILON, 0, 0)))
22
+ const bXAverage = bXPos.sub(bXNeg).div(EPSILON.mul(2))
23
+
24
+ const bYPos = simplexNoise3d(inputB.add(vec3(0, EPSILON, 0)))
25
+ const bYNeg = simplexNoise3d(inputB.sub(vec3(0, EPSILON, 0)))
26
+ const bYAverage = bYPos.sub(bYNeg).div(EPSILON.mul(2))
27
+
28
+ const bZPos = simplexNoise3d(inputB.add(vec3(0, 0, EPSILON)))
29
+ const bZNeg = simplexNoise3d(inputB.sub(vec3(0, 0, EPSILON)))
30
+ const bZAverage = bZPos.sub(bZNeg).div(EPSILON.mul(2))
31
+
32
+ const bGrabNoise = vec3(bXAverage, bYAverage, bZAverage).normalize()
33
+
34
+ return cross(aGrabNoise, bGrabNoise).normalize()
35
+ })
@@ -0,0 +1,35 @@
1
+ import { EPSILON, Fn, cross, vec3, vec4 } from "three/tsl"
2
+ import { simplexNoise4d } from "./simplex-noise-4d"
3
+
4
+ export const curlNoise4d = Fn(([inputA]) => {
5
+ const aXPos = simplexNoise4d(inputA.add(vec4(EPSILON, 0, 0, 0)))
6
+ const aXNeg = simplexNoise4d(inputA.sub(vec4(EPSILON, 0, 0, 0)))
7
+ const aXAverage = aXPos.sub(aXNeg).div(EPSILON.mul(2))
8
+
9
+ const aYPos = simplexNoise4d(inputA.add(vec4(0, EPSILON, 0, 0)))
10
+ const aYNeg = simplexNoise4d(inputA.sub(vec4(0, EPSILON, 0, 0)))
11
+ const aYAverage = aYPos.sub(aYNeg).div(EPSILON.mul(2))
12
+
13
+ const aZPos = simplexNoise4d(inputA.add(vec4(0, 0, EPSILON, 0)))
14
+ const aZNeg = simplexNoise4d(inputA.sub(vec4(0, 0, EPSILON, 0)))
15
+ const aZAverage = aZPos.sub(aZNeg).div(EPSILON.mul(2))
16
+
17
+ const aGrabNoise = vec3(aXAverage, aYAverage, aZAverage).normalize()
18
+ const inputB = inputA.add(3.5)
19
+
20
+ const bXPos = simplexNoise4d(inputB.add(vec4(EPSILON, 0, 0, 0)))
21
+ const bXNeg = simplexNoise4d(inputB.sub(vec4(EPSILON, 0, 0, 0)))
22
+ const bXAverage = bXPos.sub(bXNeg).div(EPSILON.mul(2))
23
+
24
+ const bYPos = simplexNoise4d(inputB.add(vec4(0, EPSILON, 0, 0)))
25
+ const bYNeg = simplexNoise4d(inputB.sub(vec4(0, EPSILON, 0, 0)))
26
+ const bYAverage = bYPos.sub(bYNeg).div(EPSILON.mul(2))
27
+
28
+ const bZPos = simplexNoise4d(inputB.add(vec4(0, 0, EPSILON, 0)))
29
+ const bZNeg = simplexNoise4d(inputB.sub(vec4(0, 0, EPSILON, 0)))
30
+ const bZAverage = bZPos.sub(bZNeg).div(EPSILON.mul(2))
31
+
32
+ const bGrabNoise = vec3(bXAverage, bYAverage, bZAverage).normalize()
33
+
34
+ return cross(aGrabNoise, bGrabNoise).normalize()
35
+ })
@@ -0,0 +1,12 @@
1
+ import { Fn, vec3 } from "three/tsl"
2
+ import { simplexNoise3d } from "./simplex-noise-3d"
3
+
4
+ export const fbm = Fn(([pImmutable]) => {
5
+ const p = vec3(pImmutable).toVar()
6
+ const n1 = simplexNoise3d(p).mul(0.5).add(0.5)
7
+ const n2 = simplexNoise3d(p.mul(2.02).add(vec3(19.1, 7.3, 13.7)))
8
+ .mul(0.5)
9
+ .add(0.5)
10
+
11
+ return n1.mul(0.7).add(n2.mul(0.3))
12
+ })
@@ -0,0 +1,97 @@
1
+ import {
2
+ abs,
3
+ dot,
4
+ Fn,
5
+ floor,
6
+ fract,
7
+ mix,
8
+ mod,
9
+ mul,
10
+ step,
11
+ sub,
12
+ vec2,
13
+ vec3,
14
+ vec4,
15
+ } from "three/tsl"
16
+ import { fade, permute, taylorInvSqrt } from "./common"
17
+
18
+ export const perlinNoise3d = Fn(([pImmutable]) => {
19
+ const P = vec3(pImmutable).toVar()
20
+
21
+ const Pi0 = vec3(mod(floor(P), 289.0)).toVar()
22
+ const Pi1 = vec3(mod(Pi0.add(1.0), 289.0)).toVar()
23
+ const Pf0 = vec3(fract(P)).toVar()
24
+ const Pf1 = vec3(Pf0.sub(1.0)).toVar()
25
+
26
+ const ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x)
27
+ const iy = vec4(Pi0.y, Pi0.y, Pi1.y, Pi1.y)
28
+ const iz0 = vec4(Pi0.z, Pi0.z, Pi0.z, Pi0.z)
29
+ const iz1 = vec4(Pi1.z, Pi1.z, Pi1.z, Pi1.z)
30
+
31
+ const ixy = vec4(permute(permute(ix).add(iy))).toVar()
32
+ const ixy0 = vec4(permute(ixy.add(iz0))).toVar()
33
+ const ixy1 = vec4(permute(ixy.add(iz1))).toVar()
34
+
35
+ const gx0 = vec4(ixy0.div(7.0)).toVar()
36
+ const gy0 = vec4(fract(floor(gx0).div(7.0)).sub(0.5)).toVar()
37
+ gx0.assign(fract(gx0))
38
+ const gz0 = vec4(sub(0.5, abs(gx0)).sub(abs(gy0))).toVar()
39
+ const sz0 = vec4(step(gz0, vec4(0.0))).toVar()
40
+ gx0.assign(gx0.sub(sz0.mul(step(0.0, gx0).sub(0.5))))
41
+ gy0.assign(gy0.sub(sz0.mul(step(0.0, gy0).sub(0.5))))
42
+
43
+ const gx1 = vec4(ixy1.div(7.0)).toVar()
44
+ const gy1 = vec4(fract(floor(gx1).div(7.0)).sub(0.5)).toVar()
45
+ gx1.assign(fract(gx1))
46
+ const gz1 = vec4(sub(0.5, abs(gx1)).sub(abs(gy1))).toVar()
47
+ const sz1 = vec4(step(gz1, vec4(0.0))).toVar()
48
+ gx1.assign(gx1.sub(sz1.mul(step(0.0, gx1).sub(0.5))))
49
+ gy1.assign(gy1.sub(sz1.mul(step(0.0, gy1).sub(0.5))))
50
+
51
+ const g000 = vec3(gx0.x, gy0.x, gz0.x).toVar()
52
+ const g100 = vec3(gx0.y, gy0.y, gz0.y).toVar()
53
+ const g010 = vec3(gx0.z, gy0.z, gz0.z).toVar()
54
+ const g110 = vec3(gx0.w, gy0.w, gz0.w).toVar()
55
+ const g001 = vec3(gx1.x, gy1.x, gz1.x).toVar()
56
+ const g101 = vec3(gx1.y, gy1.y, gz1.y).toVar()
57
+ const g011 = vec3(gx1.z, gy1.z, gz1.z).toVar()
58
+ const g111 = vec3(gx1.w, gy1.w, gz1.w).toVar()
59
+
60
+ const norm0 = vec4(
61
+ taylorInvSqrt(
62
+ vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))
63
+ )
64
+ ).toVar()
65
+ g000.mulAssign(norm0.x)
66
+ g010.mulAssign(norm0.y)
67
+ g100.mulAssign(norm0.z)
68
+ g110.mulAssign(norm0.w)
69
+
70
+ const norm1 = vec4(
71
+ taylorInvSqrt(
72
+ vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))
73
+ )
74
+ ).toVar()
75
+ g001.mulAssign(norm1.x)
76
+ g011.mulAssign(norm1.y)
77
+ g101.mulAssign(norm1.z)
78
+ g111.mulAssign(norm1.w)
79
+
80
+ const n000 = dot(g000, Pf0)
81
+ const n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z))
82
+ const n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z))
83
+ const n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z))
84
+ const n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z))
85
+ const n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z))
86
+ const n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z))
87
+ const n111 = dot(g111, Pf1)
88
+
89
+ const fadeXyz = vec3(fade(Pf0)).toVar()
90
+ const nZ = vec4(
91
+ mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fadeXyz.z)
92
+ )
93
+ const nYz = vec2(mix(nZ.xy, nZ.zw, fadeXyz.y))
94
+ const nXyz = mix(nYz.x, nYz.y, fadeXyz.x)
95
+
96
+ return mul(2.2, nXyz)
97
+ })
@@ -0,0 +1,23 @@
1
+ import { abs, clamp, Fn, float, Loop } from "three/tsl"
2
+ import { simplexNoise3d } from "./simplex-noise-3d"
3
+
4
+ export const ridgeNoise = Fn(([pImmutable]) => {
5
+ const p = pImmutable.toVar()
6
+ const value = float(0).toVar()
7
+ const amplitude = float(0.5).toVar()
8
+ const frequency = float(1).toVar()
9
+ const weight = float(1).toVar()
10
+
11
+ Loop({ end: 6, start: 0, type: "int" }, () => {
12
+ const n = float(1).sub(abs(simplexNoise3d(p.mul(frequency)).mul(2)))
13
+ const signal = n.mul(n).mul(weight)
14
+
15
+ value.addAssign(signal.mul(amplitude))
16
+ weight.assign(clamp(signal, 0, 1))
17
+
18
+ frequency.mulAssign(2.0)
19
+ amplitude.mulAssign(0.5)
20
+ })
21
+
22
+ return value
23
+ })
@@ -0,0 +1,78 @@
1
+ import {
2
+ Fn,
3
+ abs,
4
+ dot,
5
+ float,
6
+ floor,
7
+ max,
8
+ min,
9
+ mod,
10
+ mul,
11
+ step,
12
+ sub,
13
+ vec2,
14
+ vec3,
15
+ vec4,
16
+ } from "three/tsl"
17
+ import { permute, taylorInvSqrt } from "./common"
18
+
19
+ export const simplexNoise3d = Fn(([vImmutable]) => {
20
+ const v = vec3(vImmutable).toVar()
21
+ const c = vec2(1.0 / 6.0, 1.0 / 3.0)
22
+ const d = vec4(0.0, 0.5, 1.0, 2.0)
23
+ const i = vec3(floor(v.add(dot(v, c.yyy)))).toVar()
24
+ const x0 = vec3(v.sub(i).add(dot(i, c.xxx))).toVar()
25
+ const g = vec3(step(x0.yzx, x0.xyz)).toVar()
26
+ const l = vec3(sub(1.0, g)).toVar()
27
+ const i1 = vec3(min(g.xyz, l.zxy)).toVar()
28
+ const i2 = vec3(max(g.xyz, l.zxy)).toVar()
29
+ const x1 = vec3(x0.sub(i1).add(mul(1.0, c.xxx))).toVar()
30
+ const x2 = vec3(x0.sub(i2).add(mul(2.0, c.xxx))).toVar()
31
+ const x3 = vec3(x0.sub(1).add(mul(3.0, c.xxx))).toVar()
32
+
33
+ i.assign(mod(i, 289.0))
34
+
35
+ const p = vec4(
36
+ permute(
37
+ permute(
38
+ permute(i.z.add(vec4(0.0, i1.z, i2.z, 1.0))).add(i.y.add(vec4(0.0, i1.y, i2.y, 1.0))),
39
+ ).add(i.x.add(vec4(0.0, i1.x, i2.x, 1.0))),
40
+ ),
41
+ ).toVar()
42
+
43
+ const n = float(1.0 / 7.0).toVar()
44
+ const ns = vec3(n.mul(d.wyz).sub(d.xzx)).toVar()
45
+ const j = vec4(p.sub(mul(49.0, floor(p.mul(ns.z.mul(ns.z)))))).toVar()
46
+ const x = vec4(floor(j.mul(ns.z)).mul(ns.x).add(ns.yyyy)).toVar()
47
+ const y = vec4(floor(j.sub(mul(7.0, floor(j.mul(ns.z))))).mul(ns.x).add(ns.yyyy)).toVar()
48
+ const h = vec4(sub(1.0, abs(x).sub(abs(y)))).toVar()
49
+ const b0 = vec4(x.xy, y.xy).toVar()
50
+ const b1 = vec4(x.zw, y.zw).toVar()
51
+ const s0 = vec4(floor(b0).mul(2.0).add(1.0)).toVar()
52
+ const s1 = vec4(floor(b1).mul(2.0).add(1.0)).toVar()
53
+ const sh = vec4(step(h, vec4(0.0)).negate()).toVar()
54
+ const a0 = vec4(b0.xzyw.add(s0.xzyw.mul(sh.xxyy))).toVar()
55
+ const a1 = vec4(b1.xzyw.add(s1.xzyw.mul(sh.zzww))).toVar()
56
+ const p0 = vec3(a0.xy, h.x).toVar()
57
+ const p1 = vec3(a0.zw, h.y).toVar()
58
+ const p2 = vec3(a1.xy, h.z).toVar()
59
+ const p3 = vec3(a1.zw, h.w).toVar()
60
+ const norm = vec4(
61
+ taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))),
62
+ ).toVar()
63
+
64
+ p0.mulAssign(norm.x)
65
+ p1.mulAssign(norm.y)
66
+ p2.mulAssign(norm.z)
67
+ p3.mulAssign(norm.w)
68
+
69
+ const m = vec4(
70
+ max(sub(0.6, vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3))), 0.0),
71
+ ).toVar()
72
+ m.assign(m.mul(m))
73
+
74
+ return mul(
75
+ 42.0,
76
+ dot(m.mul(m), vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))),
77
+ )
78
+ })
@@ -0,0 +1,88 @@
1
+ import {
2
+ Fn,
3
+ clamp,
4
+ dot,
5
+ float,
6
+ floor,
7
+ max,
8
+ mod,
9
+ mul,
10
+ step,
11
+ sub,
12
+ vec2,
13
+ vec3,
14
+ vec4,
15
+ } from "three/tsl"
16
+ import { grad4, permute, taylorInvSqrt } from "./common"
17
+
18
+ export const simplexNoise4d = Fn(([vImmutable]) => {
19
+ const v = vec4(vImmutable).toVar()
20
+ const c = vec2(0.1381966011250105, 0.30901699437494745)
21
+ const i = vec4(floor(v.add(dot(v, c.yyyy)))).toVar()
22
+ const x0 = vec4(v.sub(i).add(dot(i, c.xxxx))).toVar()
23
+ const i0 = vec4().toVar()
24
+ const isX = vec3(step(x0.yzw, x0.xxx)).toVar()
25
+ const isYZ = vec3(step(x0.zww, x0.yyz)).toVar()
26
+
27
+ i0.x.assign(isX.x.add(isX.y).add(isX.z))
28
+ i0.yzw.assign(sub(1.0, isX))
29
+ i0.y.addAssign(isYZ.x.add(isYZ.y))
30
+ i0.zw.addAssign(sub(1.0, isYZ.xy))
31
+ i0.z.addAssign(isYZ.z)
32
+ i0.w.addAssign(sub(1.0, isYZ.z))
33
+
34
+ const i3 = vec4(clamp(i0, 0.0, 1.0)).toVar()
35
+ const i2 = vec4(clamp(i0.sub(1.0), 0.0, 1.0)).toVar()
36
+ const i1 = vec4(clamp(i0.sub(2.0), 0.0, 1.0)).toVar()
37
+ const x1 = vec4(x0.sub(i1).add(mul(1.0, c.xxxx))).toVar()
38
+ const x2 = vec4(x0.sub(i2).add(mul(2.0, c.xxxx))).toVar()
39
+ const x3 = vec4(x0.sub(i3).add(mul(3.0, c.xxxx))).toVar()
40
+ const x4 = vec4(x0.sub(1.0).add(mul(4.0, c.xxxx))).toVar()
41
+
42
+ i.assign(mod(i, 289.0))
43
+
44
+ const j0 = float(permute(permute(permute(permute(i.w).add(i.z)).add(i.y)).add(i.x))).toVar()
45
+ const j1 = vec4(
46
+ permute(
47
+ permute(
48
+ permute(
49
+ permute(i.w.add(vec4(i1.w, i2.w, i3.w, 1.0)))
50
+ .add(i.z)
51
+ .add(vec4(i1.z, i2.z, i3.z, 1.0)),
52
+ )
53
+ .add(i.y)
54
+ .add(vec4(i1.y, i2.y, i3.y, 1.0)),
55
+ )
56
+ .add(i.x)
57
+ .add(vec4(i1.x, i2.x, i3.x, 1.0)),
58
+ ),
59
+ ).toVar()
60
+
61
+ const ip = vec4(1.0 / 294.0, 1.0 / 49.0, 1.0 / 7.0, 0.0).toVar()
62
+ const p0 = vec4(grad4(j0, ip)).toVar()
63
+ const p1 = vec4(grad4(j1.x, ip)).toVar()
64
+ const p2 = vec4(grad4(j1.y, ip)).toVar()
65
+ const p3 = vec4(grad4(j1.z, ip)).toVar()
66
+ const p4 = vec4(grad4(j1.w, ip)).toVar()
67
+ const norm = vec4(
68
+ taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))),
69
+ ).toVar()
70
+
71
+ p0.mulAssign(norm.x)
72
+ p1.mulAssign(norm.y)
73
+ p2.mulAssign(norm.z)
74
+ p3.mulAssign(norm.w)
75
+ p4.mulAssign(taylorInvSqrt(dot(p4, p4)))
76
+
77
+ const m0 = vec3(max(sub(0.6, vec3(dot(x0, x0), dot(x1, x1), dot(x2, x2))), 0.0)).toVar()
78
+ const m1 = vec2(max(sub(0.6, vec2(dot(x3, x3), dot(x4, x4))), 0.0)).toVar()
79
+ m0.assign(m0.mul(m0))
80
+ m1.assign(m1.mul(m1))
81
+
82
+ return mul(
83
+ 49.0,
84
+ dot(m0.mul(m0), vec3(dot(p0, x0), dot(p1, x1), dot(p2, x2))).add(
85
+ dot(m1.mul(m1), vec2(dot(p3, x3), dot(p4, x4))),
86
+ ),
87
+ )
88
+ })
@@ -0,0 +1,55 @@
1
+ import { Fn, float, Loop, sin, vec2 } from "three/tsl"
2
+
3
+ interface TurbulenceOptions {
4
+ _amp?: number
5
+ _exp?: number
6
+ _freq?: number
7
+ _num?: number
8
+ _speed?: number
9
+ }
10
+
11
+ const HALF_PI = 1.5707963267948966
12
+ const THETA = 0.9272952180016122
13
+
14
+ /**
15
+ * Turbulence based on XorDev's "Turbulent Dark" technique.
16
+ * Displaces coordinates by layering rotated sine waves at increasing frequencies
17
+ *
18
+ * @see https://mini.gmshaders.com/p/turbulence
19
+ */
20
+ export const turbulence = Fn(([pInput, time, rawOptions]) => {
21
+ const options = (rawOptions as TurbulenceOptions | undefined) ?? {}
22
+ const {
23
+ _num = 10,
24
+ _amp = 0.7,
25
+ _speed = 0.3,
26
+ _freq = 2.0,
27
+ _exp = 1.4,
28
+ } = options
29
+
30
+ const p = vec2(pInput.xy).toVar()
31
+ const t = time.mul(float(_speed))
32
+ const freq = float(_freq).toVar()
33
+ const angle = float(0.0).toVar()
34
+ const iter = float(0.0).toVar()
35
+
36
+ Loop({ end: _num, start: 0, type: "int" }, () => {
37
+ const c = sin(angle.add(HALF_PI))
38
+ const s = sin(angle)
39
+
40
+ const phase = freq
41
+ .mul(p.x.mul(s).add(p.y.mul(c)))
42
+ .add(t)
43
+ .add(iter)
44
+
45
+ const scale = float(_amp).mul(sin(phase)).div(freq)
46
+ p.x.addAssign(scale.mul(c))
47
+ p.y.addAssign(scale.mul(s.negate()))
48
+
49
+ angle.addAssign(THETA)
50
+ freq.mulAssign(float(_exp))
51
+ iter.addAssign(1.0)
52
+ })
53
+
54
+ return p.sub(pInput.xy)
55
+ })
@@ -0,0 +1,31 @@
1
+ import { dot, Fn, floor, fract, mix, sin, vec3 } from "three/tsl"
2
+ import { fade } from "./common"
3
+
4
+ const hash31 = Fn(([p]) => {
5
+ return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))).mul(43758.5453123))
6
+ })
7
+
8
+ export const valueNoise3d = Fn(([pImmutable]) => {
9
+ const p = vec3(pImmutable).toVar()
10
+ const cell = vec3(floor(p)).toVar()
11
+ const local = vec3(fract(p)).toVar()
12
+ const eased = vec3(fade(local)).toVar()
13
+
14
+ const n000 = hash31(cell)
15
+ const n100 = hash31(cell.add(vec3(1, 0, 0)))
16
+ const n010 = hash31(cell.add(vec3(0, 1, 0)))
17
+ const n110 = hash31(cell.add(vec3(1, 1, 0)))
18
+ const n001 = hash31(cell.add(vec3(0, 0, 1)))
19
+ const n101 = hash31(cell.add(vec3(1, 0, 1)))
20
+ const n011 = hash31(cell.add(vec3(0, 1, 1)))
21
+ const n111 = hash31(cell.add(vec3(1, 1, 1)))
22
+
23
+ const nx00 = mix(n000, n100, eased.x)
24
+ const nx10 = mix(n010, n110, eased.x)
25
+ const nx01 = mix(n001, n101, eased.x)
26
+ const nx11 = mix(n011, n111, eased.x)
27
+ const nxy0 = mix(nx00, nx10, eased.y)
28
+ const nxy1 = mix(nx01, nx11, eased.y)
29
+
30
+ return mix(nxy0, nxy1, eased.z).mul(2).sub(1)
31
+ })
@@ -0,0 +1,59 @@
1
+ import { dot, Fn, float, floor, fract, length, min, sin, vec3 } from "three/tsl"
2
+
3
+ const random3 = Fn(([p]) => {
4
+ return fract(
5
+ sin(
6
+ vec3(
7
+ dot(p, vec3(127.1, 311.7, 74.7)),
8
+ dot(p, vec3(269.5, 183.3, 246.1)),
9
+ dot(p, vec3(113.5, 271.9, 124.6))
10
+ )
11
+ ).mul(43758.5453)
12
+ )
13
+ })
14
+
15
+ const checkNeighbor = Fn(([i, f, neighbor, currentMin]) => {
16
+ const point = random3(i.add(neighbor))
17
+ const diff = neighbor.add(point).sub(f)
18
+
19
+ return min(currentMin, length(diff))
20
+ })
21
+
22
+ export const voronoiNoise3d = Fn(([pImmutable]) => {
23
+ const p = vec3(pImmutable).toVar()
24
+ const i = vec3(floor(p)).toVar()
25
+ const f = vec3(fract(p)).toVar()
26
+
27
+ const d = float(1).toVar()
28
+
29
+ // Unrolled 3x3x3 neighbor search
30
+ d.assign(checkNeighbor(i, f, vec3(-1, -1, -1), d))
31
+ d.assign(checkNeighbor(i, f, vec3(-1, -1, 0), d))
32
+ d.assign(checkNeighbor(i, f, vec3(-1, -1, 1), d))
33
+ d.assign(checkNeighbor(i, f, vec3(-1, 0, -1), d))
34
+ d.assign(checkNeighbor(i, f, vec3(-1, 0, 0), d))
35
+ d.assign(checkNeighbor(i, f, vec3(-1, 0, 1), d))
36
+ d.assign(checkNeighbor(i, f, vec3(-1, 1, -1), d))
37
+ d.assign(checkNeighbor(i, f, vec3(-1, 1, 0), d))
38
+ d.assign(checkNeighbor(i, f, vec3(-1, 1, 1), d))
39
+ d.assign(checkNeighbor(i, f, vec3(0, -1, -1), d))
40
+ d.assign(checkNeighbor(i, f, vec3(0, -1, 0), d))
41
+ d.assign(checkNeighbor(i, f, vec3(0, -1, 1), d))
42
+ d.assign(checkNeighbor(i, f, vec3(0, 0, -1), d))
43
+ d.assign(checkNeighbor(i, f, vec3(0, 0, 0), d))
44
+ d.assign(checkNeighbor(i, f, vec3(0, 0, 1), d))
45
+ d.assign(checkNeighbor(i, f, vec3(0, 1, -1), d))
46
+ d.assign(checkNeighbor(i, f, vec3(0, 1, 0), d))
47
+ d.assign(checkNeighbor(i, f, vec3(0, 1, 1), d))
48
+ d.assign(checkNeighbor(i, f, vec3(1, -1, -1), d))
49
+ d.assign(checkNeighbor(i, f, vec3(1, -1, 0), d))
50
+ d.assign(checkNeighbor(i, f, vec3(1, -1, 1), d))
51
+ d.assign(checkNeighbor(i, f, vec3(1, 0, -1), d))
52
+ d.assign(checkNeighbor(i, f, vec3(1, 0, 0), d))
53
+ d.assign(checkNeighbor(i, f, vec3(1, 0, 1), d))
54
+ d.assign(checkNeighbor(i, f, vec3(1, 1, -1), d))
55
+ d.assign(checkNeighbor(i, f, vec3(1, 1, 0), d))
56
+ d.assign(checkNeighbor(i, f, vec3(1, 1, 1), d))
57
+
58
+ return d
59
+ })
@@ -0,0 +1,14 @@
1
+ import { Fn, abs, float } from "three/tsl"
2
+ import { bloom } from "./bloom"
3
+ import { repeatingPattern } from "./repeating-pattern"
4
+
5
+ /**
6
+ * Returns a repeating pattern of lines with a bloom effect.
7
+ */
8
+ export const bloomEdgePattern = Fn(([pattern, repeat, edge, exponent, time = float(0)]) => {
9
+ pattern.assign(repeatingPattern(pattern, repeat, time))
10
+ pattern.assign(abs(pattern))
11
+ pattern.assign(bloom(pattern, edge, exponent))
12
+
13
+ return pattern
14
+ })
@@ -0,0 +1,10 @@
1
+ import { Fn, pow } from "three/tsl"
2
+
3
+ /**
4
+ * Returns a bloomed edge based on a given edge and pattern.
5
+ */
6
+ export const bloom = Fn(([pattern, edge, exponent]) => {
7
+ pattern.assign(pow(edge.div(pattern), exponent))
8
+
9
+ return pattern
10
+ })