noise_functions/modifiers/
lerp.rs

1#[cfg(feature = "nightly-simd")]
2use core::simd::{LaneCount, Simd, SupportedLaneCount};
3
4use crate::{math::lerp, Noise, Sample};
5
6/// Linearly interpolates between `a` and `b`.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub struct Lerp<A, B, T> {
9    pub a: A,
10    pub b: B,
11    pub t: T,
12}
13
14impl<A, B, T> Noise for Lerp<A, B, T> {}
15
16impl<const DIM: usize, A, B, T> Sample<DIM> for Lerp<A, B, T>
17where
18    A: Sample<DIM>,
19    B: Sample<DIM>,
20    T: Sample<DIM>,
21{
22    #[inline]
23    fn sample_with_seed(&self, point: [f32; DIM], seed: i32) -> f32 {
24        lerp(self.a.sample_with_seed(point, seed), self.b.sample_with_seed(point, seed), self.t.sample_with_seed(point, seed))
25    }
26}
27
28#[cfg(feature = "nightly-simd")]
29impl<const DIM: usize, const LANES: usize, A, B, T> Sample<DIM, Simd<f32, LANES>> for Lerp<A, B, T>
30where
31    A: Sample<DIM, Simd<f32, LANES>>,
32    B: Sample<DIM, Simd<f32, LANES>>,
33    T: Sample<DIM, Simd<f32, LANES>>,
34    LaneCount<LANES>: SupportedLaneCount,
35{
36    #[inline]
37    fn sample_with_seed(&self, point: Simd<f32, LANES>, seed: i32) -> f32 {
38        lerp(self.a.sample_with_seed(point, seed), self.b.sample_with_seed(point, seed), self.t.sample_with_seed(point, seed))
39    }
40}