noise_functions/base/
cell_distance_sq.rs

1use crate::{base::impl_noise, cellular::DistanceFn, from_fast_noise_lite::cell_distance_euclidean_squared};
2
3#[cfg(feature = "nightly-simd")]
4use core::simd::{f32x2, f32x4};
5
6use super::CustomCellDistance;
7
8/// 2/3/4 dimensional noise of the squared distance to the closest cell.
9#[derive(Debug, Clone, Copy, PartialEq)]
10pub struct CellDistanceSq {
11    pub jitter: f32,
12}
13
14impl CellDistanceSq {
15    pub const fn jitter(mut self, jitter: f32) -> Self {
16        self.jitter = jitter;
17        self
18    }
19}
20
21impl Default for CellDistanceSq {
22    fn default() -> Self {
23        Self { jitter: 1.0 }
24    }
25}
26
27impl_noise!(234 CellDistanceSq);
28
29impl CellDistanceSq {
30    #[inline]
31    fn gen2(self, point: [f32; 2], seed: i32) -> f32 {
32        // implementation from FastNoiseLite
33        cell_distance_euclidean_squared::gen2(self.jitter, point, seed) * 2.0 - 1.0
34    }
35
36    #[inline]
37    fn gen3(self, point: [f32; 3], seed: i32) -> f32 {
38        // implementation from FastNoiseLite
39        cell_distance_euclidean_squared::gen3(self.jitter, point, seed) * 2.0 - 1.0
40    }
41
42    #[inline]
43    fn gen4(self, point: [f32; 4], seed: i32) -> f32 {
44        CustomCellDistance::default().jitter(self.jitter).distance_fn(DistanceFn::EuclideanSquared).gen4(point, seed) * 2.0 - 1.0
45    }
46
47    #[inline]
48    #[cfg(feature = "nightly-simd")]
49    fn gen2a(self, point: f32x2, seed: i32) -> f32 {
50        // implementation from FastNoiseLite
51        cell_distance_euclidean_squared::gen2a(self.jitter, point, seed) * 2.0 - 1.0
52    }
53
54    #[inline]
55    #[cfg(feature = "nightly-simd")]
56    fn gen3a(self, point: f32x4, seed: i32) -> f32 {
57        // implementation from FastNoiseLite
58        cell_distance_euclidean_squared::gen3a(self.jitter, point, seed) * 2.0 - 1.0
59    }
60
61    #[inline]
62    #[cfg(feature = "nightly-simd")]
63    fn gen4a(self, point: f32x4, seed: i32) -> f32 {
64        CustomCellDistance::default().jitter(self.jitter).distance_fn(DistanceFn::EuclideanSquared).gen4a(point, seed) * 2.0 - 1.0
65    }
66}