use crate::compiled::real::Real;
#[inline(always)]
pub const fn sdf_union(d1: f32, d2: f32) -> f32 {
crate::compiled::real::law_min_f32(d1, d2)
}
#[inline(always)]
pub fn sdf_union_multi(distances: &[f32]) -> f32 {
distances
.iter()
.copied()
.reduce(sdf_union_r::<f32>)
.unwrap_or(f32::MAX)
}
#[inline(always)]
pub fn sdf_union_r<R: Real>(d1: R, d2: R) -> R {
d1.min(d2)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_union() {
assert_eq!(sdf_union(1.0, 2.0), 1.0);
}
#[test]
fn test_union_multi() {
let distances = vec![3.0, 1.0, 2.0, 5.0];
assert!((sdf_union_multi(&distances) - 1.0).abs() < 0.0001);
}
#[test]
fn test_union_multi_empty() {
assert_eq!(sdf_union_multi(&[]), f32::MAX);
}
}