UNPKG

@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
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 };