diff --git a/README.md b/README.md index fe6a2ff..88f106d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ A simple C++ Raytracer based on "Ray Tracing in One Weekend" book. ![render image with diffuse light](docs/render-light.png) +![render cornell box image](docs/render-cornell-box.png) + ## Features * Raytracing sphere geometries with front face detection. diff --git a/docs/render-cornell-box.png b/docs/render-cornell-box.png new file mode 100644 index 0000000..3506011 Binary files /dev/null and b/docs/render-cornell-box.png differ diff --git a/src/main.cpp b/src/main.cpp index 27ff5ca..f425713 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -148,6 +148,9 @@ void cornell_box() { scene->add(make_shared(Point(0,0,0), Vector(555,0,0), Vector(0,0,555), white)); scene->add(make_shared(Point(555,555,555), Vector(-555,0,0), Vector(0,0,-555), white)); scene->add(make_shared(Point(0,0,555), Vector(555,0,0), Vector(0,555,0), white)); + + scene->add(createBox(Point(130, 0, 65), Point(295, 165, 230), white)); + scene->add(createBox(Point(265, 0, 295), Point(430, 330, 460), white)); Camera camera(1.0, 500, 50, 1920, 40.0, Vector(278, 278, -800), Vector(278, 278, 0), Vector(0.0, 1.0, 0.0), Color(0.0, 0.0, 0.0), 0.0); diff --git a/src/quad.h b/src/quad.h index 7604a1e..7a54ef1 100644 --- a/src/quad.h +++ b/src/quad.h @@ -3,6 +3,7 @@ #include "intersectable.h" #include "material.h" #include "aabb.h" +#include "scene.h" #include @@ -64,3 +65,24 @@ class Quad : public Intersectable { } }; + +inline std::shared_ptr createBox(const Point& a, const Point& b, std::shared_ptr mat) +{ + auto sides = std::make_shared(); + + auto min = Point(std::fmin(a.x(), b.x()), fmin(a.y(), b.y()), fmin(a.z(), b.z())); + auto max = Point(std::fmax(a.x(), b.x()), fmax(a.y(), b.y()), fmax(a.z(), b.z())); + + auto dx = Vector(max.x() - min.x(), 0, 0); + auto dy = Vector(0, max.y() - min.y(), 0); + auto dz = Vector(0, 0, max.z() - min.z()); + + sides->add(std::make_shared(Point(min.x(), min.y(), max.z()), dx, dy, mat)); // front + sides->add(std::make_shared(Point(max.x(), min.y(), max.z()), -dz, dy, mat)); // right + sides->add(std::make_shared(Point(max.x(), min.y(), min.z()), -dx, dy, mat)); // back + sides->add(std::make_shared(Point(min.x(), min.y(), min.z()), dz, dy, mat)); // left + sides->add(std::make_shared(Point(min.x(), max.y(), max.z()), dx, -dz, mat)); // top + sides->add(std::make_shared(Point(min.x(), min.y(), min.z()), dx, dz, mat)); // bottom + + return sides; +}