@thi.ng/shader-ast-stdlib
Version:
Function collection for modular GPGPU / shader programming with @thi.ng/shader-ast
84 lines (83 loc) • 1.68 kB
JavaScript
import { F, V2 } from "@thi.ng/shader-ast/api/types";
import { forLoop } from "@thi.ng/shader-ast/ast/controlflow";
import { defn, ret } from "@thi.ng/shader-ast/ast/function";
import {
FLOAT0,
SQRT2,
float,
int,
vec2,
vec3
} from "@thi.ng/shader-ast/ast/lit";
import {
add,
addSelf,
div,
inc,
lte,
mul,
sub
} from "@thi.ng/shader-ast/ast/ops";
import { $xy, $z } from "@thi.ng/shader-ast/ast/swizzle";
import { sym } from "@thi.ng/shader-ast/ast/sym";
import {
dot,
floor,
fract,
pow,
smoothstep,
sqrt
} from "@thi.ng/shader-ast/builtin/math";
import { hash32 } from "./hash.js";
const voronoise2 = defn(F, "voronoise2", [V2, F, F], (x, u, v) => {
let p;
let f;
let coeff;
let k;
let va;
let wt;
let g;
let o;
let r;
let w;
return [
p = sym(floor(x)),
f = sym(fract(x)),
coeff = sym(vec3(u, u, 1)),
k = sym(add(1, mul(63, pow(sub(1, v), float(4))))),
va = sym(FLOAT0),
wt = sym(FLOAT0),
forLoop(
sym(int(-2)),
(i) => lte(i, int(2)),
inc,
(i) => [
forLoop(
sym(int(-2)),
(j) => lte(j, int(2)),
inc,
(j) => [
g = sym(vec2(float(i), float(j))),
o = sym(mul(hash32(add(p, g)), coeff)),
r = sym(add(sub(g, f), $xy(o))),
w = sym(
pow(
sub(
1,
smoothstep(FLOAT0, SQRT2, sqrt(dot(r, r)))
),
k
)
),
addSelf(va, mul(w, $z(o))),
addSelf(wt, w)
]
)
]
),
ret(div(va, wt))
];
});
export {
voronoise2
};