diff --git a/rtiow/src/scenes/test.rs b/rtiow/src/scenes/test.rs index 5bc886c..c3f7ae4 100644 --- a/rtiow/src/scenes/test.rs +++ b/rtiow/src/scenes/test.rs @@ -5,10 +5,10 @@ use hitable::Hit; use hitable_list::HitableList; use kdtree::KDTree; use material::Lambertian; -use material::Metal; use renderer::Opt; use renderer::Scene; use sphere::Sphere; +use texture::CheckerTexture; use texture::ConstantTexture; use vec3::Vec3; @@ -33,7 +33,10 @@ pub fn new(opt: &Opt) -> Scene { let mut objects: Vec> = vec![Box::new(Sphere::new( Vec3::new(0., 0., 0.), 5., - Box::new(Metal::new(Vec3::new(0.5, 0.5, 0.5), 0.)), + Box::new(Lambertian::new(Box::new(CheckerTexture::new( + Box::new(ConstantTexture::new(Vec3::new(0., 0., 0.))), + Box::new(ConstantTexture::new(Vec3::new(1., 1., 1.))), + )))), ))]; let num_spheres = 6; let radius = 7.; diff --git a/rtiow/src/texture.rs b/rtiow/src/texture.rs index bfab371..4429d18 100644 --- a/rtiow/src/texture.rs +++ b/rtiow/src/texture.rs @@ -19,3 +19,25 @@ impl Texture for ConstantTexture { 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) + } + } +}