summaryrefslogtreecommitdiff
path: root/src/sdf.rs
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-12-21 22:07:54 -0500
committerpommicket <pommicket@gmail.com>2022-12-21 22:07:54 -0500
commita8a49dac55b5daa43adac2fc4756e7bf388564a6 (patch)
treeeb6579e686c500017430ad086fcd20b01fc6c0d0 /src/sdf.rs
parent7bde2ed24256f6216b6c910b3e1f70532be0d941 (diff)
more functions
Diffstat (limited to 'src/sdf.rs')
-rw-r--r--src/sdf.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/sdf.rs b/src/sdf.rs
index 87643cb..be9c470 100644
--- a/src/sdf.rs
+++ b/src/sdf.rs
@@ -176,6 +176,9 @@ pub enum R3ToR3 {
#[prob(8)]
#[only_if(params.max_depth >= 0)]
Compose(Box<R3ToR3>, Box<R3ToR3>),
+ #[prob(4)]
+ #[only_if(params.max_depth >= 0)]
+ Mix(Box<R3ToR3>, Box<R3ToR3>, Constant),
#[prob(1)]
Translate(Constant3),
#[prob(4)]
@@ -250,6 +253,9 @@ pub enum R3ToR {
#[prob(4)]
#[only_if(params.max_depth >= 0)]
Mix(Box<R3ToR>, Box<R3ToR>, Constant),
+ #[prob(4)]
+ #[only_if(params.max_depth >= 0)]
+ SinCos(Box<R3ToR>, Box<R3ToR>),
#[prob(2)]
#[only_if(params.max_depth >= 0)]
SmoothMin(Box<R3ToR>, Box<R3ToR>),
@@ -486,6 +492,16 @@ impl Function for R3ToR3 {
let a_output = a.to_glsl(input, code, var);
b.to_glsl(a_output, code, var)
}
+ Mix(a, b, t) => {
+ let a_output = a.to_glsl(input, code, var);
+ let b_output = b.to_glsl(input, code, var);
+ let output = var.next();
+ write_str!(
+ code,
+ "vec3 {output} = mix({a_output}, {b_output}, clamp({t}, 0.0, 1.0));\n"
+ );
+ output
+ }
Arctan(c) => {
let output = var.next();
// we need to scale arctan(cx) so it doesn't break the SDF
@@ -671,6 +687,16 @@ impl Function for R3ToR {
);
output
}
+ SinCos(a, b) => {
+ let a = a.to_glsl(input, code, var);
+ let b = b.to_glsl(input, code, var);
+ let output = var.next();
+ write_str!(
+ code,
+ "float {output} = sin({a}) * cos({b});\n"
+ );
+ output
+ }
Compose(pre, f, post) => {
let pre_output = pre.to_glsl(input, code, var);
let f_output = f.to_glsl(pre_output, code, var);