noise_functions/modifiers/
translate_xyzw.rs

1use core::ops::IndexMut;
2
3use crate::{Noise, Sample};
4
5/// Translates the point before it is being sampled by the base noise.
6pub struct TranslateXyzw<Noise, X, Y, Z, W> {
7    pub noise: Noise,
8    pub x: X,
9    pub y: Y,
10    pub z: Z,
11    pub w: W,
12}
13
14impl<N, X, Y, Z, W> Noise for TranslateXyzw<N, X, Y, Z, W> {}
15
16impl<const DIM: usize, Point, N, X, Y, Z, W> Sample<DIM, Point> for TranslateXyzw<N, X, Y, Z, W>
17where
18    Point: IndexMut<usize, Output = f32> + Copy,
19    N: Sample<DIM, Point>,
20    X: Sample<DIM, Point>,
21    Y: Sample<DIM, Point>,
22    Z: Sample<DIM, Point>,
23    W: Sample<DIM, Point>,
24{
25    fn sample_with_seed(&self, point: Point, seed: i32) -> f32 {
26        let mut translated = point;
27
28        if DIM > 0 {
29            translated[0] += self.x.sample_with_seed(point, seed);
30        }
31
32        if DIM > 1 {
33            translated[1] += self.y.sample_with_seed(point, seed);
34        }
35
36        if DIM > 2 {
37            translated[2] += self.z.sample_with_seed(point, seed);
38        }
39
40        if DIM > 3 {
41            translated[3] += self.w.sample_with_seed(point, seed);
42        }
43
44        self.noise.sample_with_seed(translated, seed)
45    }
46}