@thi.ng/shader-ast-stdlib
Version:
Function collection for modular GPGPU / shader programming with @thi.ng/shader-ast
95 lines (94 loc) • 2.19 kB
JavaScript
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";
const snoise2 = defn(F, "snoise2", [V2], (v) => {
let C;
let i;
let i1;
let x0;
let x12;
let p;
let m;
let x;
let h;
let ox;
let a0;
let g;
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)))
];
});
export {
snoise2
};