UNPKG

@thi.ng/shader-ast-stdlib

Version:

Function collection for modular GPGPU / shader programming with @thi.ng/shader-ast

83 lines (82 loc) 2.31 kB
import { F, V2, V3 } 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 { gensym } from "@thi.ng/shader-ast/ast/idgen"; import { float, vec3 } from "@thi.ng/shader-ast/ast/lit"; import { add, lt, mul, sub } from "@thi.ng/shader-ast/ast/ops"; import { $, $x, $xy, $y, $z } from "@thi.ng/shader-ast/ast/swizzle"; import { sym } from "@thi.ng/shader-ast/ast/sym"; import { abs, floor, fract, max, min, mod, sqrt } from "@thi.ng/shader-ast/builtin/math"; import { permute3 } from "./permute.js"; const worleyDist = defn(V3, "worleyDist", [V3, V3], (a, b) => [ ret(add(mul(a, a), mul(b, b))) ]); const worleyDistManhattan = defn( V3, "worleyDistManhatten", [V3, V3], (a, b) => [ret(add(abs(a), abs(b)))] ); const worley2 = (distFn, name = gensym("worley2_")) => defn(V2, name, [V2, F], (P, jitter) => { const K = float(1 / 7); const Ko = float(3 / 7); const oI = sym(vec3(-1, 0, 1)); const oF = sym(vec3(-0.5, 0.5, 1.5)); let pI; let pF; let px; let p; let d1; let d2; let d3; let d1a; const $dist = (x) => distFn( add(add($x(pF), x), mul(sub(fract(mul(p, K)), Ko), jitter)), add( sub($y(pF), oF), mul( sub(mul(mod(floor(mul(p, K)), float(7)), K), Ko), jitter ) ) ); return [ oI, oF, pI = sym(mod(floor(P), float(289))), pF = sym(fract(P)), px = sym(permute3(add(oI, $x(pI)))), p = sym(permute3(add(add(oI, $y(pI)), $x(px)))), d1 = sym($dist(0.5)), assign(p, permute3(add(oI, add($y(pI), $y(px))))), d2 = sym($dist(-0.5)), assign(p, permute3(add(oI, add($y(pI), $z(px))))), d3 = sym($dist(-1.5)), d1a = sym(min(d1, d2)), assign(d2, min(max(d1, d2), d3)), assign(d1, min(d2, d1a)), assign(d2, max(d2, d1a)), assign($xy(d1), ternary(lt($x(d1), $y(d1)), $xy(d1), $(d1, "yx"))), assign( $(d1, "xz"), ternary(lt($x(d1), $z(d1)), $(d1, "xz"), $(d1, "zx")) ), assign($(d1, "yz"), min($(d1, "yz"), $(d2, "yz"))), assign($y(d1), min(min($y(d1), $z(d1)), $x(d2))), ret(sqrt($xy(d1))) ]; }); export { worley2, worleyDist, worleyDistManhattan };