2022-07-28 21:39:00 -07:00

48 lines
1.1 KiB
Rust

use crate::{
noise::{NoiseSource, NoiseType},
texture::Texture,
vec3::Vec3,
};
pub struct NoiseTexture<N>
where
N: NoiseSource,
{
noise_source: N,
noise_type: NoiseType,
}
impl<N> NoiseTexture<N>
where
N: NoiseSource,
{
pub fn new(noise_source: N, noise_type: NoiseType) -> NoiseTexture<N> {
NoiseTexture {
noise_source,
noise_type,
}
}
}
impl<N> Texture for NoiseTexture<N>
where
N: NoiseSource,
{
fn value(&self, _u: f32, _v: f32, p: Vec3) -> Vec3 {
let v = match self.noise_type {
NoiseType::Scale(scale) => self.noise_source.scaled(p, scale),
NoiseType::Turbulence(turbulence) => self.noise_source.turbulence(p, turbulence),
NoiseType::Marble {
period,
power,
size,
scale,
} => self.noise_source.marble(p, period, power, size, scale),
};
debug_assert!(v >= 0., "Cold pixel @ {}: {}", p, v);
debug_assert!(v <= 1., "Hot pixel @ {}: {}", p, v);
Vec3::new(1., 1., 1.) * v
}
}