use glam::Vec3;
#[inline(always)]
pub fn transform_scale(point: Vec3, factor: f32) -> (Vec3, f32) {
(point / 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 / factors;
let min_factor = factors.x.min(factors.y.min(factors.z));
(transformed, min_factor)
}
#[allow(dead_code)]
#[inline(always)]
pub fn correct_distance_nonuniform(distance: f32, factors: Vec3, gradient: Vec3) -> f32 {
let scaled_gradient = gradient * factors;
distance * scaled_gradient.length()
}
#[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); }
#[test]
fn test_distance_correction() {
let distance = 1.0;
let factors = Vec3::new(1.0, 2.0, 1.0);
let gradient = Vec3::new(0.0, 1.0, 0.0);
let corrected = correct_distance_nonuniform(distance, factors, gradient);
assert!((corrected - 2.0).abs() < 0.0001);
}
}