use math_vector::Vector;
pub struct Smooth {
pub sdf: Box<dyn super::SignedDistanceField>,
pub k: f64,
}
impl super::SignedDistanceField for Smooth {
fn call(&self, p: Vector<f64>) -> f64 {
self.sdf.call(p) - self.k
}
}
pub mod transforms {
use math_vector::Vector;
pub struct Translate<'a> {
pub p: Vector<f64>,
pub sdf: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Translate<'_> {
fn call(&self, p: Vector<f64>) -> f64 {
self.sdf.call(p - self.p)
}
}
pub struct Rotate<'a> {
pub alpha: f64,
pub axis: Vector<f64>,
pub sdf: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Rotate<'_> {
fn call(&self, p: Vector<f64>) -> f64 {
self.sdf.call(p.rotate(self.alpha, self.axis))
}
}
pub struct Scale<'a> {
pub scale: Vector<f64>,
pub sdf: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Scale<'_> {
fn call(&self, p: Vector<f64>) -> f64 {
self.sdf.call(Vector {
x: p.x * self.scale.x,
y: p.y * self.scale.y,
z: 0.0,
})
}
}
pub struct Matrix<'a> {
pub matrix: [[f64; 2]; 2],
pub sdf: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Matrix<'_> {
fn call(&self, p: Vector<f64>) -> f64 {
self.sdf.call(Vector {
x: self.matrix[0][0] * p.x + self.matrix[0][1] * p.y,
y: self.matrix[1][0] * p.x + self.matrix[1][1] * p.y,
z: 0.0,
})
}
}
}
pub mod boolean {
pub struct Union<'a> {
pub a: Box<&'a dyn super::super::SignedDistanceField>,
pub b: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Union<'_> {
fn call(&self, p: math_vector::Vector<f64>) -> f64 {
self.a.call(p).min(self.b.call(p))
}
}
pub struct Intersection<'a> {
pub a: Box<&'a dyn super::super::SignedDistanceField>,
pub b: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Intersection<'_> {
fn call(&self, p: math_vector::Vector<f64>) -> f64 {
self.a.call(p).max(self.b.call(p))
}
}
pub struct Difference<'a> {
pub a: Box<&'a dyn super::super::SignedDistanceField>,
pub b: Box<&'a dyn super::super::SignedDistanceField>,
}
impl super::super::SignedDistanceField for Difference<'_> {
fn call(&self, p: math_vector::Vector<f64>) -> f64 {
self.a.call(p).min(-self.b.call(p))
}
}
}