noise_functions/modifiers/
translate_xyz.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 TranslateXyz<Noise, X, Y, Z> {
7    pub noise: Noise,
8    pub x: X,
9    pub y: Y,
10    pub z: Z,
11}
12
13impl<N, X, Y, Z> Noise for TranslateXyz<N, X, Y, Z> {}
14
15impl<const DIM: usize, Point, N, X, Y, Z> Sample<DIM, Point> for TranslateXyz<N, X, Y, Z>
16where
17    Point: IndexMut<usize, Output = f32> + Copy,
18    N: Sample<DIM, Point>,
19    X: Sample<DIM, Point>,
20    Y: Sample<DIM, Point>,
21    Z: Sample<DIM, Point>,
22{
23    fn sample_with_seed(&self, point: Point, seed: i32) -> f32 {
24        let mut translated = point;
25
26        if DIM > 0 {
27            translated[0] += self.x.sample_with_seed(point, seed);
28        }
29
30        if DIM > 1 {
31            translated[1] += self.y.sample_with_seed(point, seed);
32        }
33
34        if DIM > 2 {
35            translated[2] += self.z.sample_with_seed(point, seed);
36        }
37
38        self.noise.sample_with_seed(translated, seed)
39    }
40}