noise/core/
spheres.rs

1use crate::math::vectors::{Vector2, Vector3, Vector4};
2
3macro_rules! impl_sphere {
4    ($name:ident, $vector:ty) => {
5        #[inline(always)]
6        pub fn $name(point: $vector, frequency: f64) -> f64 {
7            let point = point * frequency;
8
9            let dist_from_center = point.magnitude();
10
11            let dist_from_smaller_sphere = dist_from_center - dist_from_center.floor();
12            let dist_from_larger_sphere = 1.0 - dist_from_smaller_sphere;
13            let nearest_dist = dist_from_smaller_sphere.min(dist_from_larger_sphere);
14
15            1.0 - (nearest_dist * 4.0)
16        }
17    };
18}
19
20impl_sphere!(spheres_2d, Vector2<f64>);
21impl_sphere!(spheres_3d, Vector3<f64>);
22impl_sphere!(spheres_4d, Vector4<f64>);