c(a) : constant (for instance: c(1.5), c(time))a + b : additiona - b : subtractionmul(a, b) : multiplication (element wise)div(a, b) : division (element wise)recip(b) : reciprocal (1/b)d_sq(a) : squared (a*a)d_sqrt(a) : square rootd_sin(a)d_cos(a)d_exp(a)d_log(a)dc_mul(a, b)dc_sq(z)dc_conj(z) : conjugatedc_absSq(z) : Re(z)^2 + Im(z)^2dc_recip(z) : 1/zd_lenSq(v) : x^2 + y^2 + z^2d_cross(a, b) : cross productVAL : number (replaces float)VAL2 : 2 dimensional vector (replaces vec2)VAL3 : 3 dimensional vector (replaces vec3)VAL R(VAL3 s) - the implicit equation is: s(x, y, z) == 0time : time in seconds#define DISABLE_STOCHASTIC : runs slower but more accuratelyNOTE: don't add floats with VALs.
You can however multiply floats with VALs (or with VAL2 or VAL3)
The VAL type and the custom functions are used in order to calculate the surface function derivatives (Jacobian) efficiently and accurately, using AutoDiff.
AutoDiff requires every variable to contain the value and the derivatives, and each operation/function to calculate both the value and the derivatives based on the previous ones.
Therefore VAL is a glsl vec3 under the hood, where the x component is the value, the y component is the derivative in terms of the first parameter (parameter to the surface function), and z component is the derivative in terms of the second parameter.
VAL2 and VAL3 are mat2x3 and mat3x3 respectively.
VAL d_cosh(VAL a) { return VAL(cosh(a.x), a.yz * sinh(a.x)); }
VAL d_sinh(VAL a) { return VAL(sinh(a.x), a.yz * cosh(a.x)); }