use perlin::GENERATOR; use vec3::Vec3; pub trait Texture: Send + Sync { fn value(&self, u: f32, v: f32, p: Vec3) -> Vec3; } pub struct ConstantTexture { color: Vec3, } impl ConstantTexture { pub fn new(color: Vec3) -> ConstantTexture { ConstantTexture { color } } } impl Texture for ConstantTexture { fn value(&self, _u: f32, _v: f32, _p: Vec3) -> Vec3 { self.color } } pub struct CheckerTexture { odd: Box, even: Box, } impl CheckerTexture { pub fn new(odd: Box, even: Box) -> CheckerTexture { CheckerTexture { odd, even } } } impl Texture for CheckerTexture { fn value(&self, u: f32, v: f32, p: Vec3) -> Vec3 { let sines = (10. * p.x).sin() * (10. * p.y).sin() * (10. * p.z).sin(); if sines < 0. { self.odd.value(u, v, p) } else { self.even.value(u, v, p) } } } pub struct NoiseTexture { scale: f32, } impl NoiseTexture { pub fn new() -> NoiseTexture { NoiseTexture { scale: 1. } } pub fn with_scale(scale: f32) -> NoiseTexture { NoiseTexture { scale } } } impl Texture for NoiseTexture { fn value(&self, _u: f32, _v: f32, p: Vec3) -> Vec3 { Vec3::new(1., 1., 1.) * 0.5 * (1. + GENERATOR.noise(self.scale * p)) } }