use crate::noise_fns::NoiseFn;
pub struct Displace<Source, XDisplace, YDisplace, ZDisplace, UDisplace> {
pub source: Source,
pub x_displace: XDisplace,
pub y_displace: YDisplace,
pub z_displace: ZDisplace,
pub u_displace: UDisplace,
}
impl<Source, XDisplace, YDisplace, ZDisplace, UDisplace>
Displace<Source, XDisplace, YDisplace, ZDisplace, UDisplace>
{
pub fn new(
source: Source,
x_displace: XDisplace,
y_displace: YDisplace,
z_displace: ZDisplace,
u_displace: UDisplace,
) -> Self {
Self {
source,
x_displace,
y_displace,
z_displace,
u_displace,
}
}
}
impl<Source, XDisplace, YDisplace, ZDisplace, UDisplace> NoiseFn<f64, 2>
for Displace<Source, XDisplace, YDisplace, ZDisplace, UDisplace>
where
Source: NoiseFn<f64, 2>,
XDisplace: NoiseFn<f64, 2>,
YDisplace: NoiseFn<f64, 2>,
{
fn get(&self, point: [f64; 2]) -> f64 {
let x = point[0] + self.x_displace.get(point);
let y = point[1] + self.y_displace.get(point);
self.source.get([x, y])
}
}
impl<Source, XDisplace, YDisplace, ZDisplace, UDisplace> NoiseFn<f64, 3>
for Displace<Source, XDisplace, YDisplace, ZDisplace, UDisplace>
where
Source: NoiseFn<f64, 3>,
XDisplace: NoiseFn<f64, 3>,
YDisplace: NoiseFn<f64, 3>,
ZDisplace: NoiseFn<f64, 3>,
{
fn get(&self, point: [f64; 3]) -> f64 {
let x = point[0] + self.x_displace.get(point);
let y = point[1] + self.y_displace.get(point);
let z = point[2] + self.z_displace.get(point);
self.source.get([x, y, z])
}
}
impl<Source, XDisplace, YDisplace, ZDisplace, UDisplace> NoiseFn<f64, 4>
for Displace<Source, XDisplace, YDisplace, ZDisplace, UDisplace>
where
Source: NoiseFn<f64, 4>,
XDisplace: NoiseFn<f64, 4>,
YDisplace: NoiseFn<f64, 4>,
ZDisplace: NoiseFn<f64, 4>,
UDisplace: NoiseFn<f64, 4>,
{
fn get(&self, point: [f64; 4]) -> f64 {
let x = point[0] + self.x_displace.get(point);
let y = point[1] + self.y_displace.get(point);
let z = point[2] + self.z_displace.get(point);
let u = point[3] + self.u_displace.get(point);
self.source.get([x, y, z, u])
}
}