From b49588773fb77151a79c08a999159ecf9d6e9198 Mon Sep 17 00:00:00 2001 From: Nigel Date: Sat, 4 Mar 2023 19:00:04 +0100 Subject: [PATCH] Sending rays into an empty scene! Hooray! --- src/program.cpp | 28 +++++++++++++++++++++++++--- src/ray.h | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/ray.h diff --git a/src/program.cpp b/src/program.cpp index 1164905..263130f 100644 --- a/src/program.cpp +++ b/src/program.cpp @@ -1,14 +1,33 @@ #include "color.h" +#include "ray.h" #include "vector3.h" #include +color ray_color(const ray& r){ + vec3 unit_direction = unit_vector(r.direction()); + auto t = 0.5*(unit_direction.y() + 1.0); + return (1.0-t)*color(1.0, 1.0, 1.0) + t*color(0.5,0.7,1.0); +} + int main () { // Image - const int image_width = 256; - const int image_height = 256; + const auto aspect_ratio = 16.0 /9.0; + const int image_width = 400; + const int image_height = static_cast(image_width /aspect_ratio); + + + // Camera + auto viewport_height = 2.0; + auto viewport_width = aspect_ratio * viewport_height; + auto focal_length = 1.0; + + auto origin = point3(0,0,0); + auto horizontal = vec3(viewport_width, 0, 0); + auto vertical = vec3(0, viewport_height, 0); + auto lower_left_corner = origin - horizontal/2 - vertical/2 - vec3(0,0,focal_length); // Render std::cout<< "P3\n" << image_width << ' ' << image_height << "\n255\n"; @@ -17,7 +36,10 @@ int main () std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush; for(int i = 0; i < image_width; ++i) { - color pixel_color(double(i)/(image_width-1), double(j)/(image_height-1), 0.25); + auto u = double(i) / (image_width-1); + auto v = double(j) / (image_height-1); + ray r(origin, lower_left_corner+u*horizontal + v* vertical -origin); + color pixel_color = ray_color(r); write_color(std::cout , pixel_color); } } diff --git a/src/ray.h b/src/ray.h new file mode 100644 index 0000000..8dfb071 --- /dev/null +++ b/src/ray.h @@ -0,0 +1,21 @@ +#pragma once + +#include "vector3.h" + +class ray{ + public: + ray(){} + ray(const point3& origin ,const vec3& direction): orig(origin), dir(direction){} + + point3 origin() const {return orig;} + vec3 direction() const {return dir;} + + point3 at(double t) const { + return orig + t*dir; + } + + public: + point3 orig; + vec3 dir; + +}; \ No newline at end of file