diff options
author | pommicket <pommicket@gmail.com> | 2022-12-15 20:22:31 -0500 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2022-12-15 20:22:31 -0500 |
commit | d7f810524a30843417253f80e454f1d9173aaeb3 (patch) | |
tree | c50b51b813039c1f393656a678a00cf2caba9d29 /src/sdf.rs | |
parent | 35cbbb40298389efcd2fe87a9c6458d49c1c567e (diff) |
more functions
Diffstat (limited to 'src/sdf.rs')
-rw-r--r-- | src/sdf.rs | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -102,16 +102,26 @@ pub enum R3ToR3 { #[prob(1)] Translate(Constant3), #[prob(2)] - Sin(Constant), + #[bias(0.01)] // prevent division by 0 + Sin(Constant), // 1/c sin(cx) #[prob(2)] + #[bias(0.01)] InfiniteMirrors(Constant), #[prob(2)] #[scale(2 * std::f32::consts::PI)] Rotate(Constant3), #[prob(2)] - Arctan(Constant) // arctan(c x) / c + Arctan(Constant), // arctan(c x) / c + #[prob(2)] + #[bias(0.01)] + SqSin(Constant), // based on 1/x² sin(x²) + #[prob(2)] + #[bias(0.01)] + Sigmoid //based on sigmoid(x) = 1 / (1 + e^-x) } +// note : i dont think R → R transformations really accomplish that much +// that can't be done with R³ → R³. #[derive(GenRandom, Debug)] pub enum RToR { #[prob(1)] @@ -374,6 +384,19 @@ impl Function for R3ToR3 { write_str!(code, "vec3 {output} = {m} * {input};\n"); output } + SqSin(c) => { + let output = var.next(); + let a = var.next(); + write_str!(code, "vec3 {a} = 0.1 + abs({input});\n"); + write_str!(code, "{a} *= {a};\n"); + write_str!(code, "vec3 {output} = 0.7593/(pow({c},1.5)*{a}) * sin({c}*{a});\n"); + output + } + Sigmoid => { + let output = var.next(); + write_str!(code, "vec3 {output} = 2.0 - abs(4.0 / (1.0 + exp(-{input})) - 2.0);\n"); + output + } } } } |