-
-
Notifications
You must be signed in to change notification settings - Fork 150
/
Copy pathsimplex2.ts
100 lines (99 loc) · 2.38 KB
/
simplex2.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// SPDX-License-Identifier: Apache-2.0
import type { Vec2Sym, Vec3Sym, Vec4Sym } from "@thi.ng/shader-ast";
import { F, V2 } from "@thi.ng/shader-ast/api/types";
import { assign } from "@thi.ng/shader-ast/ast/assign";
import { ternary } from "@thi.ng/shader-ast/ast/controlflow";
import { defn, ret } from "@thi.ng/shader-ast/ast/function";
import {
FLOAT05,
FLOAT1,
VEC3_0,
float,
vec2,
vec3,
vec4,
} from "@thi.ng/shader-ast/ast/lit";
import { add, gt, mul, mulSelf, sub } from "@thi.ng/shader-ast/ast/ops";
import { $, $x, $xy, $y } from "@thi.ng/shader-ast/ast/swizzle";
import { sym } from "@thi.ng/shader-ast/ast/sym";
import {
abs,
dot,
floor,
fract,
max,
mod,
} from "@thi.ng/shader-ast/builtin/math";
import { magSq2 } from "../math/magsq.js";
import { permute3 } from "./permute.js";
/**
* Array and textureless GLSL 2D simplex noise function. Ported from original
* GLSL implementation by Ian McEwan & Ashima Arts.
*
* https://github.com/ashima/webgl-noise
*/
export const snoise2 = defn(F, "snoise2", [V2], (v) => {
let C: Vec4Sym;
let i: Vec2Sym;
let i1: Vec2Sym;
let x0: Vec2Sym;
let x12: Vec4Sym;
let p: Vec3Sym;
let m: Vec3Sym;
let x: Vec3Sym;
let h: Vec3Sym;
let ox: Vec3Sym;
let a0: Vec3Sym;
let g: Vec3Sym;
return [
(C = sym(
vec4(
0.211324865405187,
0.366025403784439,
-0.577350269189626,
0.024390243902439
)
)),
(i = sym(floor(add(v, dot(v, $(C, "yy")))))),
(x0 = sym(add(sub(v, i), dot(i, $(C, "xx"))))),
(i1 = sym(ternary(gt($x(x0), $y(x0)), vec2(1, 0), vec2(0, 1)))),
(x12 = sym(sub(add($(x0, "xyxy"), $(C, "xxzz")), vec4(i1, 0, 0)))),
assign(i, mod(i, float(289))),
(p = sym(
permute3(
add(
permute3(add(vec3(0, $y(i1), 1), $y(i))),
add(vec3(0, $x(i1), 1), $x(i))
)
)
)),
(m = sym(
max(
sub(
FLOAT05,
vec3(magSq2(x0), magSq2($xy(x12)), magSq2($(x12, "zw")))
),
VEC3_0
)
)),
mulSelf(m, m),
mulSelf(m, m),
(x = sym(sub(mul(2, fract(mul(p, $(C, "www")))), FLOAT1))),
(h = sym(sub(abs(x), FLOAT05))),
(ox = sym(floor(add(x, FLOAT05)))),
(a0 = sym(sub(x, ox))),
mulSelf(
m,
sub(
1.79284291400159,
mul(0.85373472095314, add(mul(a0, a0), mul(h, h)))
)
),
(g = sym(vec3(add(mul($x(a0), $x(x0)), mul($x(h), $y(x0)))))),
assign(
$(g, "yz"),
add(mul($(a0, "yz"), $(x12, "xz")), mul($(h, "yz"), $(x12, "yw")))
),
ret(mul(130, dot(m, g))),
];
});