use glam::Vec3;
#[inline(always)]
pub fn modifier_displacement(d: f32, p: Vec3, strength: f32) -> f32 {
let disp = alice_det_math::sin(p.x * 5.0)
* alice_det_math::sin(p.y * 5.0)
* alice_det_math::sin(p.z * 5.0);
d + disp * strength
}
#[inline(always)]
pub fn modifier_sine_displacement(d: f32, p: Vec3, amplitude: f32, frequency: Vec3) -> f32 {
let disp = alice_det_math::sin(p.x * frequency.x)
* alice_det_math::sin(p.y * frequency.y)
* alice_det_math::sin(p.z * frequency.z);
disp * amplitude + d
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_displacement_zero_strength() {
let d = 1.0;
let p = Vec3::new(0.3, 0.7, 1.1);
let result = modifier_displacement(d, p, 0.0);
assert!((result - 1.0).abs() < 0.001);
}
#[test]
fn test_displacement_bounded() {
for i in 0..100 {
let x = (i as f32) * 0.137;
let y = (i as f32) * 0.291;
let z = (i as f32) * 0.473;
let p = Vec3::new(x, y, z);
let strength = 0.5;
let d = 1.0;
let result = modifier_displacement(d, p, strength);
assert!(result >= d - strength, "Below bound: {}", result);
assert!(result <= d + strength, "Above bound: {}", result);
}
}
#[test]
fn test_displacement_at_origin() {
let d = 2.0;
let result = modifier_displacement(d, Vec3::ZERO, 1.0);
assert!((result - 2.0).abs() < 0.001);
}
}