use crate::{ noise::{NoiseSource, NoiseType}, texture::Texture, vec3::Vec3, }; pub struct NoiseTexture where N: NoiseSource, { noise_source: N, noise_type: NoiseType, } impl NoiseTexture where N: NoiseSource, { pub fn new(noise_source: N, noise_type: NoiseType) -> NoiseTexture { NoiseTexture { noise_source, noise_type, } } } impl Texture for NoiseTexture 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 } }