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