UNPKG

@thi.ng/shader-ast-stdlib

Version:

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

48 lines (47 loc) 1.38 kB
import { F, V2 } from "@thi.ng/shader-ast/api/types"; import { defn, ret } from "@thi.ng/shader-ast/ast/function"; import { vec2 } from "@thi.ng/shader-ast/ast/lit"; import { div, mul, neg, sub } from "@thi.ng/shader-ast/ast/ops"; import { $x, $y } from "@thi.ng/shader-ast/ast/swizzle"; import { sym } from "@thi.ng/shader-ast/ast/sym"; import { dot, min, sign, sqrt } from "@thi.ng/shader-ast/builtin/math"; import { clamp01 } from "../math/clamp.js"; import { cross2 } from "../math/cross2.js"; const sdfTriangle2 = defn( F, "sdTriangle", [V2, V2, V2, V2], (p, a, b, c) => { let e0, e1, e2; let v0, v1, v2; let pq0, pq1, pq2; let s; let d; const $pq = (v, e) => sub(v, mul(e, clamp01(div(dot(v, e), dot(e, e))))); return [ e0 = sym(sub(b, a)), e1 = sym(sub(c, b)), e2 = sym(sub(a, c)), v0 = sym(sub(p, a)), v1 = sym(sub(p, b)), v2 = sym(sub(p, c)), pq0 = sym($pq(v0, e0)), pq1 = sym($pq(v1, e1)), pq2 = sym($pq(v2, e2)), s = sym(sign(cross2(e0, e2))), d = sym( min( min( vec2(dot(pq0, pq0), mul(s, cross2(v0, e0))), vec2(dot(pq1, pq1), mul(s, cross2(v1, e1))) ), vec2(dot(pq2, pq2), mul(s, cross2(v2, e2))) ) ), ret(mul(neg(sqrt($x(d))), sign($y(d)))) ]; } ); export { sdfTriangle2 };