From b70a2e196f2df307354aaea8395e83fa275e1050 Mon Sep 17 00:00:00 2001 From: NADAL Jean-Baptiste Date: Mon, 4 Mar 2024 23:39:49 +0100 Subject: [PATCH] [FEAT] Fisnish Chapter 10 --- README.md | 4 ++ apps/chapter_10.cpp | 59 +++++++++++++++++++++------ data/chapter_10.png | Bin 0 -> 24391 bytes raytracing/src/renderer/material.cpp | 6 +-- raytracing/src/renderer/material.h | 2 +- 5 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 data/chapter_10.png diff --git a/README.md b/README.md index a8e7723..2518a3c 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,7 @@ The Web Site of the book: http://raytracerchallenge.com/ | Chapiter 07 | Chapiter 08 | Chapiter 09 | |:------------------------: | :------------------------: | :----------------------------: | |![07](data/chapter_07.png) | ![08](data/chapter_08.png) | ![09](data/chapter_09.png) | + +| Chapiter 10 | Chapiter 11 | Chapiter 12 | +|:------------------------: | :------------------------: | :----------------------------: | +|![10](data/chapter_10.png) | | | \ No newline at end of file diff --git a/apps/chapter_10.cpp b/apps/chapter_10.cpp index aae064c..eec1250 100644 --- a/apps/chapter_10.cpp +++ b/apps/chapter_10.cpp @@ -43,44 +43,79 @@ int main(void) World the_world; Camera the_camera; Canvas the_canvas; - Plane *the_floor; + Plane *the_floor, *the_left_wall, *the_right_wall; Sphere *the_middle, *the_right, *the_left; chrono::time_point the_start, the_end; printf("Chapter 10 example.\n"); // Floor is an extremely flattened sphere with a matte texture. - the_floor = new Plane(); + the_floor = new Plane(); Material &the_floor_material = the_floor->material(); the_floor_material.set_color(Color(1, 0.9, 0.9)); the_floor_material.set_specular(0); - the_floor_material.set_pattern(new StripePattern(Color(1, 1, 1), Color(1, 0.9, 0.9))); + the_floor_material.set_pattern(new CheckersPattern(Color(0.52, 0.52, 0.52), Color::Black())); the_world.add_object(the_floor); + // Left Wall + the_left_wall = new Plane(); + the_left_wall->set_transform(Matrix::translation(0, 0, 10) * + Matrix::rotation_y(-std::numbers::pi / 4) * + Matrix::rotation_x(std::numbers::pi / 2)); + Material &the_left_wall_material = the_left_wall->material(); + the_left_wall_material.set_specular(0); + the_left_wall_material.set_pattern(new StripePattern(Color(0.52, 0.52, 0.52), Color::Black())); + the_world.add_object(the_left_wall); + + // Right Wall + the_right_wall = new Plane(); + the_right_wall->set_transform(Matrix::translation(0, 5, 10) * + Matrix::rotation_y(std::numbers::pi / 4) * + Matrix::rotation_x(std::numbers::pi / 2) * + Matrix::scaling(0.15, 0.15, 0.15)); + Material &the_right_wall_material = the_right_wall->material(); + the_right_wall_material.set_specular(0); + the_right_wall_material.set_pattern(new RingPattern(Color(1, 0.5, 0), Color(0.5, 1, 1))); + the_right_wall_material.pattern()->set_transform(Matrix::translation(25, 0, 15)); + the_world.add_object(the_right_wall); + // The large sphere in the middle is a unit sphere, translated upward slightly and colored green. the_middle = new Sphere(); - the_middle->set_transform(Matrix::translation(-0.5, 1, 0.5)); + the_middle->set_transform(Matrix::translation(-0.25, 1, 1.5) * + Matrix::rotation_y(-std::numbers::pi / 1.5) * + Matrix::rotation_z(-std::numbers::pi / 6)); + Material &the_middle_material = the_middle->material(); the_middle_material.set_color(Color(0.1, 1, 0.5)); - the_middle_material.set_pattern(new StripePattern(Color(1, 1, 1), Color(0.1, 1, 0.5))); + the_middle_material.set_pattern(new RingPattern(Color(0.24, 0.74, 0.37), Color(0.14, 0.47, 0.22))); + the_middle_material.pattern()->set_transform(Matrix::scaling(0.15, 0.15, 0.15) * + Matrix::rotation_x(std::numbers::pi / 2) * + Matrix::rotation_z(std::numbers::pi / 4)); the_middle_material.set_diffuse(0.7); the_middle_material.set_specular(0.3); the_world.add_object(the_middle); // The smaller green sphere on the right is scaled in half the_right = new Sphere(); - the_right->set_transform(Matrix::translation(1.5, 0.5, -0.5) * Matrix::scaling(0.5, 0.5, 0.5)); + the_right->set_transform(Matrix::translation(1.5, 0.5, -0.5) * + Matrix::scaling(0.5, 0.5, 0.5) * + Matrix::rotation_y(std::numbers::pi / 4)); Material &the_right_material = the_right->material(); the_right_material.set_color(Color(0.5, 1, 0.1)); + the_right_material.set_pattern(new GradientPattern(Color(0.53, 0.07, 0), Color(0.49, 0.40, 0))); + the_right_material.pattern()->set_transform(Matrix::scaling(2, 2, 2) * + Matrix::rotation_y(std::numbers::pi / 4)); the_right_material.set_diffuse(0.7); the_right_material.set_specular(0.3); the_world.add_object(the_right); // The smallest sphere is scaled by a third, before being translated the_left = new Sphere(); - the_left->set_transform(Matrix::translation(-1.5, 0.33, -0.75) * Matrix::scaling(0.33, 0.33, 0.33)); + the_left->set_transform(Matrix::translation(-1.5, 0.66, -1) * Matrix::scaling(0.66, 0.66, 0.66)); Material &the_left_material = the_left->material(); the_left_material.set_color(Color(1, 0.8, 0.1)); + the_left_material.set_pattern(new StripePattern(Color(0.25, 0.25, 0.8), Color(0.5, 0.5, 1))); + the_left_material.pattern()->set_transform(Matrix::scaling(0.15, 1, 1)); the_left_material.set_diffuse(0.7); the_left_material.set_specular(0.3); the_world.add_object(the_left); @@ -89,14 +124,14 @@ int main(void) the_world.set_light(PointLight(Tuple::Point(-10, 10, -10), Color(1, 1, 1))); // Configure the camera. - // the_camera = Camera(100, 50, std::numbers::pi / 2); - the_camera = Camera(320, 200, std::numbers::pi / 2); + // the_camera = Camera(100, 50, std::numbers::pi / 3); + the_camera = Camera(320, 200, std::numbers::pi / 3); the_camera.set_transform( - Matrix::view_transform(Tuple::Point(0, 1.5, -3.5), Tuple::Point(0, 1, 0), Tuple::Vector(0, 1, 0))); + Matrix::view_transform(Tuple::Point(0, 1.5, -5), Tuple::Point(0, 1, 0), Tuple::Vector(0, 1, 0))); - the_start = chrono::high_resolution_clock::now(); + the_start = chrono::high_resolution_clock::now(); the_canvas = the_camera.render(the_world); - the_end = chrono::high_resolution_clock::now(); + the_end = chrono::high_resolution_clock::now(); the_canvas.save_to_file("chapter10.ppm"); diff --git a/data/chapter_10.png b/data/chapter_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7517fac32a343ea1c1a5c761b27276b1e5f5fa GIT binary patch literal 24391 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]@Z^7@j4hlH~Pp~|{I%8L@ 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�sA} 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 literal 0 HcmV?d00001 diff --git a/raytracing/src/renderer/material.cpp b/raytracing/src/renderer/material.cpp index 6d7a3f4..4be26af 100644 --- a/raytracing/src/renderer/material.cpp +++ b/raytracing/src/renderer/material.cpp @@ -133,7 +133,7 @@ void Material::set_shininess(double a_value) /* ------------------------------------------------------------------------- */ -const Pattern *Material::pattern(void) const +Pattern *Material::pattern(void) { return m_pattern; } @@ -191,7 +191,7 @@ Color Material::lighting(Shape *an_object, const PointLight &a_light, const Tupl // reflect_dot_eye represent the consine of the angle between reflection vector and the eye vector. // A negative number means the light reflects away from the eye. - the_reflect_v = (-the_light_v).reflect(a_normalv); + the_reflect_v = (-the_light_v).reflect(a_normalv); double the_reflect_dot_eye = the_reflect_v.dot(an_eyev); if (the_reflect_dot_eye <= 0) { @@ -201,7 +201,7 @@ Color Material::lighting(Shape *an_object, const PointLight &a_light, const Tupl { // Compute the specular contribution double the_factor = std::pow(the_reflect_dot_eye, m_shininess); - the_specular = a_light.intensity() * m_specular * the_factor; + the_specular = a_light.intensity() * m_specular * the_factor; } } diff --git a/raytracing/src/renderer/material.h b/raytracing/src/renderer/material.h index 58464bd..9457926 100644 --- a/raytracing/src/renderer/material.h +++ b/raytracing/src/renderer/material.h @@ -62,7 +62,7 @@ namespace Raytracer const double &shininess(void) const; void set_shininess(double a_value); - const Pattern *pattern(void) const; + Pattern *pattern(void); void set_pattern(Pattern *a_pattern); Color lighting(Shape *an_object, const PointLight &a_light, const Tuple &a_point, const Tuple &an_eyev,