use crate::compiled::real::LawMinMax;
use glam::Vec3;
#[inline(always)]
pub fn transform_scale(point: Vec3, factor: f32) -> (Vec3, f32) {
(point * (1.0 / factor), factor)
}
#[inline(always)]
pub fn transform_scale_inverse(point: Vec3, factor: f32) -> Vec3 {
point * factor
}
#[inline(always)]
pub fn transform_scale_nonuniform(point: Vec3, factors: Vec3) -> (Vec3, f32) {
let transformed = point * Vec3::new(1.0 / factors.x, 1.0 / factors.y, 1.0 / factors.z);
let min_factor = factors.x.law_min(factors.y.law_min(factors.z));
(transformed, min_factor)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_scale_uniform() {
let point = Vec3::new(2.0, 4.0, 6.0);
let (transformed, mult) = transform_scale(point, 2.0);
assert!((transformed - Vec3::new(1.0, 2.0, 3.0)).length() < 0.0001);
assert!((mult - 2.0).abs() < 0.0001);
}
#[test]
fn test_scale_inverse() {
let point = Vec3::new(1.0, 2.0, 3.0);
let factor = 2.0;
let (transformed, _) = transform_scale(point, factor);
let restored = transform_scale_inverse(transformed, factor);
assert!((restored - point).length() < 0.0001);
}
#[test]
fn test_scale_identity() {
let point = Vec3::new(1.0, 2.0, 3.0);
let (transformed, mult) = transform_scale(point, 1.0);
assert!((transformed - point).length() < 0.0001);
assert!((mult - 1.0).abs() < 0.0001);
}
#[test]
fn test_scale_nonuniform() {
let point = Vec3::new(2.0, 4.0, 6.0);
let factors = Vec3::new(2.0, 2.0, 3.0);
let (transformed, mult) = transform_scale_nonuniform(point, factors);
assert!((transformed - Vec3::new(1.0, 2.0, 2.0)).length() < 0.0001);
assert!((mult - 2.0).abs() < 0.0001); }
}