use glam::Vec3;
#[inline(always)]
pub fn modifier_taper(p: Vec3, factor: f32) -> Vec3 {
let s = 1.0 / p.y.mul_add(-factor, 1.0);
Vec3::new(p.x * s, p.y, p.z * s)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_taper_at_origin() {
let p = Vec3::new(1.0, 0.0, 2.0);
let q = modifier_taper(p, 0.5);
assert!((q.x - 1.0).abs() < 0.001);
assert!((q.y - 0.0).abs() < 0.001);
assert!((q.z - 2.0).abs() < 0.001);
}
#[test]
fn test_taper_positive_y() {
let p = Vec3::new(1.0, 1.0, 1.0);
let q = modifier_taper(p, 0.5);
assert!((q.x - 2.0).abs() < 0.001);
assert!((q.y - 1.0).abs() < 0.001);
assert!((q.z - 2.0).abs() < 0.001);
}
#[test]
fn test_taper_zero_factor() {
let p = Vec3::new(3.0, 5.0, 7.0);
let q = modifier_taper(p, 0.0);
assert!((q - p).length() < 0.001);
}
}