From d8d64ac5db7fc0b7a4e5ea2a251c47da198d1cf2 Mon Sep 17 00:00:00 2001 From: John Downey Date: Thu, 2 Mar 2023 06:45:25 -0600 Subject: [PATCH] Chapter 10 --- examples/chapter10.rs | 56 ++++++++++++ examples/chapter6.rs | 2 +- examples/chapter7.rs | 6 +- examples/chapter9.rs | 6 +- output/chapter10.png | Bin 0 -> 82441 bytes src/lib.rs | 4 +- src/material.rs | 29 ++++-- src/pattern.rs | 207 ++++++++++++++++++++++++++++++++++++++++++ src/shapes.rs | 4 +- src/world.rs | 3 +- 10 files changed, 293 insertions(+), 24 deletions(-) create mode 100644 examples/chapter10.rs create mode 100644 output/chapter10.png create mode 100644 src/pattern.rs diff --git a/examples/chapter10.rs b/examples/chapter10.rs new file mode 100644 index 0000000..7f4e3e7 --- /dev/null +++ b/examples/chapter10.rs @@ -0,0 +1,56 @@ +use std::f64::consts::PI; + +use ray_tracer::{ + camera, checkers_pattern, color, gradiant_pattern, plane, point, point_light, sphere, + transform::{scaling, translation, view_transform}, + vector, world, BLACK, WHITE, +}; + +fn main() -> anyhow::Result<()> { + let mut world = world(); + + let mut floor = plane(); + floor.material.pattern = Some(checkers_pattern(WHITE, BLACK)); + world.objects.push(floor); + + let mut middle = sphere(); + middle.transform = translation(-0.5, 1.0, 0.5); + middle.material.color = color(0.1, 1.0, 0.5); + middle.material.diffuse = 0.7; + middle.material.specular = 0.3; + world.objects.push(middle); + + let mut right = sphere(); + right.transform = translation(1.5, 0.5, -0.5) * scaling(0.5, 0.5, 0.5); + right.material.pattern = Some({ + let mut pattern = gradiant_pattern(color(0.5, 0.75, 0.1), color(0.1, 0.25, 1.0)); + pattern.transform = translation(1, 0, 0) * scaling(2, 2, 2); + pattern + }); + right.material.diffuse = 0.7; + right.material.specular = 0.3; + world.objects.push(right); + + let mut left = sphere(); + left.transform = translation(-1.5, 0.33, -0.75) * scaling(0.33, 0.33, 0.33); + left.material.color = color(1.0, 0.8, 0.1); + left.material.diffuse = 0.7; + left.material.specular = 0.3; + world.objects.push(left); + + world.light = Some(point_light(point(-10, 10, -10), WHITE)); + + let width = 1024; + let height = 768; + let mut camera = camera(width, height, PI / 3.0); + camera.transform = view_transform( + point(0.0, 1.5, -5.0), + point(0.0, 1.0, 0.0), + vector(0.0, 1.0, 0.0), + ); + + let canvas = camera.render(world)?; + print!("{}", canvas.to_ppm()?); + + Ok(()) +} diff --git a/examples/chapter6.rs b/examples/chapter6.rs index cd6e102..6cf6692 100644 --- a/examples/chapter6.rs +++ b/examples/chapter6.rs @@ -31,7 +31,7 @@ fn main() -> anyhow::Result<()> { let color = hit .object .material - .lighting(light, point, eye, normal, false); + .lighting(&shape, light, point, eye, normal, false); canvas.write_pixel(x, y, color)?; } } diff --git a/examples/chapter7.rs b/examples/chapter7.rs index ff8bcaa..f095d12 100644 --- a/examples/chapter7.rs +++ b/examples/chapter7.rs @@ -15,7 +15,7 @@ fn main() -> anyhow::Result<()> { let mut floor = sphere(); floor.transform = scaling(10.0, 0.01, 10.0); - floor.material = material; + floor.material = material.clone(); world.objects.push(floor); let mut left_wall = sphere(); @@ -23,7 +23,7 @@ fn main() -> anyhow::Result<()> { * rotation_y(-PI / 4.0) * rotation_x(PI / 2.0) * scaling(10.0, 0.01, 10.0); - left_wall.material = material; + left_wall.material = material.clone(); world.objects.push(left_wall); let mut right_wall = sphere(); @@ -31,7 +31,7 @@ fn main() -> anyhow::Result<()> { * rotation_y(PI / 4.0) * rotation_x(PI / 2.0) * scaling(10.0, 0.01, 10.0); - right_wall.material = material; + right_wall.material = material.clone(); world.objects.push(right_wall); let mut middle = sphere(); diff --git a/examples/chapter9.rs b/examples/chapter9.rs index c2e3dd1..63ca91b 100644 --- a/examples/chapter9.rs +++ b/examples/chapter9.rs @@ -1,7 +1,7 @@ use std::f64::consts::PI; use ray_tracer::{ - camera, color, material, plane, point, point_light, sphere, + camera, color, plane, point, point_light, sphere, transform::{scaling, translation, view_transform}, vector, world, WHITE, }; @@ -9,10 +9,6 @@ use ray_tracer::{ fn main() -> anyhow::Result<()> { let mut world = world(); - let mut material = material(); - material.color = color(1.0, 0.9, 0.9); - material.specular = 0.0; - let floor = plane(); world.objects.push(floor); diff --git a/output/chapter10.png b/output/chapter10.png new file mode 100644 index 0000000000000000000000000000000000000000..8873a08a3aa961a71fb1de31641752175273d95a GIT binary patch literal 82441 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 (h-jjV~I5 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%0AeO7?kAQ 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 Material { Material { @@ -7,28 +7,37 @@ pub fn material() -> Material { diffuse: 0.9, specular: 0.9, shininess: 200.0, + pattern: None, } } -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Debug)] pub struct Material { pub color: Color, pub ambient: f64, pub diffuse: f64, pub specular: f64, pub shininess: f64, + pub pattern: Option, } impl Material { pub fn lighting( &self, + shape: &Shape, light: PointLight, point: Point, eye_vector: Vector, normal_vector: Vector, in_shadow: bool, ) -> Color { - let effective_color = self.color * light.intensity; + let color = if let Some(pattern) = &self.pattern { + pattern.pattern_at_shape(shape, point) + } else { + self.color + }; + + let effective_color = color * light.intensity; let light_vector = (light.position - point).normalize(); let ambient = effective_color * self.ambient; if in_shadow { @@ -64,7 +73,7 @@ impl Material { mod tests { use approx::assert_abs_diff_eq; - use crate::{point, point_light, vector, ORIGIN, WHITE}; + use crate::{point, point_light, sphere, vector, ORIGIN, WHITE}; use super::*; @@ -77,7 +86,7 @@ mod tests { let light = point_light(point(0, 0, -10), color(1, 1, 1)); assert_abs_diff_eq!( color(1.9, 1.9, 1.9), - m.lighting(light, position, eyev, normalv, false) + m.lighting(&sphere(), light, position, eyev, normalv, false) ); } @@ -90,7 +99,7 @@ mod tests { let light = point_light(point(0, 0, -10), color(1, 1, 1)); assert_abs_diff_eq!( color(1.0, 1.0, 1.0), - m.lighting(light, position, eyev, normalv, false) + m.lighting(&sphere(), light, position, eyev, normalv, false) ); } @@ -103,7 +112,7 @@ mod tests { let light = point_light(point(0, 10, -10), color(1, 1, 1)); assert_abs_diff_eq!( color(0.7364, 0.7364, 0.7364), - m.lighting(light, position, eyev, normalv, false) + m.lighting(&sphere(), light, position, eyev, normalv, false) ); } @@ -116,7 +125,7 @@ mod tests { let light = point_light(point(0, 10, -10), color(1, 1, 1)); assert_abs_diff_eq!( color(1.6364, 1.6364, 1.6364), - m.lighting(light, position, eyev, normalv, false) + m.lighting(&sphere(), light, position, eyev, normalv, false) ); } @@ -129,7 +138,7 @@ mod tests { let light = point_light(point(0, 0, 10), color(1, 1, 1)); assert_abs_diff_eq!( color(0.1, 0.1, 0.1), - m.lighting(light, position, eyev, normalv, false) + m.lighting(&sphere(), light, position, eyev, normalv, false) ); } @@ -143,7 +152,7 @@ mod tests { let in_shadow = true; assert_eq!( color(0.1, 0.1, 0.1), - m.lighting(light, position, eyev, normalv, in_shadow) + m.lighting(&sphere(), light, position, eyev, normalv, in_shadow) ); } } diff --git a/src/pattern.rs b/src/pattern.rs new file mode 100644 index 0000000..06d29f7 --- /dev/null +++ b/src/pattern.rs @@ -0,0 +1,207 @@ +use std::{ + fmt::{self, Debug}, + sync::Arc, +}; + +use crate::{identity_matrix, Color, Matrix4, Point, Shape}; + +pub fn stripe_pattern(a: Color, b: Color) -> Pattern { + Pattern::new(move |Point { x, .. }| { + let value = x.floor() as i32; + if value % 2 == 0 { + a + } else { + b + } + }) +} + +pub fn gradiant_pattern(a: Color, b: Color) -> Pattern { + Pattern::new(move |Point { x, .. }| { + let distance = b - a; + let fraction = x - x.floor(); + a + distance * fraction + }) +} + +pub fn ring_pattern(a: Color, b: Color) -> Pattern { + Pattern::new(move |Point { x, z, .. }| { + let value = (x.powi(2) + z.powi(2)).sqrt().floor() as i32; + if value % 2 == 0 { + a + } else { + b + } + }) +} + +pub fn checkers_pattern(a: Color, b: Color) -> Pattern { + Pattern::new(move |Point { x, y, z }| { + let value = (x.floor() + y.floor() + z.floor()) as i32; + if value % 2 == 0 { + a + } else { + b + } + }) +} + +#[derive(Clone)] +pub struct Pattern { + pub transform: Matrix4, + point_to_color: Arc Color>, +} + +impl Debug for Pattern { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Pattern") + .field("transform", &self.transform) + .finish() + } +} + +impl Pattern { + fn new Color + Send + Sync + 'static>(point_to_color: F) -> Self { + Self { + transform: identity_matrix(), + point_to_color: Arc::new(point_to_color), + } + } + + pub fn pattern_at_shape(&self, shape: &Shape, world_point: Point) -> Color { + let object_point = shape.transform.inverse() * world_point; + let pattern_point = self.transform.inverse() * object_point; + self.pattern_at(pattern_point) + } + + fn pattern_at(&self, point: Point) -> Color { + (self.point_to_color)(point) + } +} + +#[cfg(test)] +mod tests { + use crate::{ + color, point, sphere, + transform::{scaling, translation}, + BLACK, ORIGIN, WHITE, + }; + + use super::*; + + fn test_pattern() -> Pattern { + Pattern::new(|Point { x, y, z }| color(x, y, z)) + } + + #[test] + fn stripe_pattern_is_constant_in_y() { + let pattern = stripe_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(point(0, 0, 0))); + assert_eq!(WHITE, pattern.pattern_at(point(0, 1, 0))); + assert_eq!(WHITE, pattern.pattern_at(point(0, 2, 0))); + } + + #[test] + fn stripe_pattern_is_constant_in_z() { + let pattern = stripe_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(point(0, 0, 0))); + assert_eq!(WHITE, pattern.pattern_at(point(0, 0, 1))); + assert_eq!(WHITE, pattern.pattern_at(point(0, 0, 2))); + } + + #[test] + fn stripe_pattern_alternates_in_x() { + let pattern = stripe_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(point(0, 0, 0))); + assert_eq!(WHITE, pattern.pattern_at(point(0.9, 0.0, 0.0))); + assert_eq!(BLACK, pattern.pattern_at(point(1, 0, 0))); + assert_eq!(BLACK, pattern.pattern_at(point(-0.1, 0.0, 0.0))); + assert_eq!(BLACK, pattern.pattern_at(point(-1, 0, 0))); + assert_eq!(WHITE, pattern.pattern_at(point(-1.1, 0.0, 0.0))); + } + + #[test] + fn pattern_with_object_transformation() { + let mut shape = sphere(); + shape.transform = scaling(2, 2, 2); + let pattern = test_pattern(); + assert_eq!( + color(1.0, 1.5, 2.0), + pattern.pattern_at_shape(&shape, point(2, 3, 4)) + ); + } + + #[test] + fn pattern_with_pattern_transformation() { + let shape = sphere(); + let mut pattern = test_pattern(); + pattern.transform = scaling(2, 2, 2); + assert_eq!( + color(1.0, 1.5, 2.0), + pattern.pattern_at_shape(&shape, point(2, 3, 4)) + ); + } + + #[test] + fn pattern_with_object_and_pattern_transformation() { + let mut object = sphere(); + object.transform = scaling(2, 2, 2); + let mut pattern = test_pattern(); + pattern.transform = translation(0.5, 1.0, 1.5); + assert_eq!( + color(0.75, 0.5, 0.25), + pattern.pattern_at_shape(&object, point(2.5, 3.0, 3.5)) + ); + } + + #[test] + fn gradiant_pattern_interpolates_between_colors() { + let pattern = gradiant_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(ORIGIN)); + assert_eq!( + color(0.75, 0.75, 0.75), + pattern.pattern_at(point(0.25, 0.0, 0.0)) + ); + assert_eq!( + color(0.5, 0.5, 0.5), + pattern.pattern_at(point(0.5, 0.0, 0.0)) + ); + assert_eq!( + color(0.25, 0.25, 0.25), + pattern.pattern_at(point(0.75, 0.0, 0.0)) + ); + } + + #[test] + fn ring_pattern_should_extend_in_x_and_z() { + let pattern = ring_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(ORIGIN)); + assert_eq!(BLACK, pattern.pattern_at(point(1, 0, 0))); + assert_eq!(BLACK, pattern.pattern_at(point(0, 0, 1))); + assert_eq!(BLACK, pattern.pattern_at(point(0.708, 0.0, 0.708))); + } + + #[test] + fn checkers_should_repeat_in_x() { + let pattern = checkers_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(ORIGIN)); + assert_eq!(WHITE, pattern.pattern_at(point(0.99, 0.0, 0.0))); + assert_eq!(BLACK, pattern.pattern_at(point(1.01, 0.0, 0.0))); + } + + #[test] + fn checkers_should_repeat_in_y() { + let pattern = checkers_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(ORIGIN)); + assert_eq!(WHITE, pattern.pattern_at(point(0.0, 0.99, 0.0))); + assert_eq!(BLACK, pattern.pattern_at(point(0.0, 1.01, 0.0))); + } + + #[test] + fn checkers_should_repeat_in_z() { + let pattern = checkers_pattern(WHITE, BLACK); + assert_eq!(WHITE, pattern.pattern_at(ORIGIN)); + assert_eq!(WHITE, pattern.pattern_at(point(0.0, 0.0, 0.99))); + assert_eq!(BLACK, pattern.pattern_at(point(0.0, 0.0, 1.01))); + } +} diff --git a/src/shapes.rs b/src/shapes.rs index 9a596aa..a08c7a7 100644 --- a/src/shapes.rs +++ b/src/shapes.rs @@ -22,9 +22,7 @@ pub struct Shape { impl PartialEq for Shape { fn eq(&self, other: &Self) -> bool { - self.transform == other.transform - && self.material == other.material - && ptr::eq(&self.geometry, &other.geometry) + self.transform == other.transform && ptr::eq(&self.geometry, &other.geometry) } } diff --git a/src/world.rs b/src/world.rs index 9e1af2f..83f0e83 100644 --- a/src/world.rs +++ b/src/world.rs @@ -52,8 +52,9 @@ impl World { if let Some(light) = self.light { let shadowed = self.is_shadowed(comps.over_point); comps.object.material.lighting( + comps.object, light, - comps.point, + comps.over_point, comps.eye_vector, comps.normal_vector, shadowed,