From 5a92d1874e9ad8c6d6b31653a4d15492a1a8a194 Mon Sep 17 00:00:00 2001 From: Cat Flynn Date: Sat, 18 Feb 2023 18:35:15 +0000 Subject: [PATCH] extract scene functionality from main.cpp --- src/colour.h | 3 + src/error.h | 7 +++ src/main.cpp | 152 +++++++++--------------------------------------- src/ray.h | 1 + src/rtweekend.h | 2 +- src/scene.h | 99 +++++++++++++++++++++++++++++++ telescope.md | 3 +- 7 files changed, 140 insertions(+), 127 deletions(-) create mode 100644 src/error.h create mode 100644 src/scene.h diff --git a/src/colour.h b/src/colour.h index 35ea3c8..4d46604 100755 --- a/src/colour.h +++ b/src/colour.h @@ -8,6 +8,9 @@ // for writing to socket #include +const colour pink(254.0/255.0, 226.0/255.0, 170.0/255.0); +const colour grey(0.133, 0.133, 0.133); + void correct_gamma(colour& pixel_colour, int samples) { double r = pixel_colour.x(); diff --git a/src/error.h b/src/error.h new file mode 100644 index 0000000..6280115 --- /dev/null +++ b/src/error.h @@ -0,0 +1,7 @@ +#include + +void error(const char* message) +{ + perror(message); + exit(1); +} diff --git a/src/main.cpp b/src/main.cpp index 03ecd07..37dc3ad 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,13 +1,6 @@ #include "rtweekend.h" -#include "hittable_list.h" -#include "sphere.h" - -void error(const char* message) -{ - perror(message); - exit(1); -} +#include "scene.h" #include "colour.h" #include "camera.h" @@ -28,104 +21,6 @@ const unsigned int HEIGHT = static_cast(WIDTH / ASPECT_RATIO); const int SAMPLES_PER_PIXEL = 8; const int MAX_DEPTH = 5; -// fee2aa -// -const colour pink(254.0/255.0, 226.0/255.0, 170.0/255.0); -const colour grey(0.133, 0.133, 0.133); - -colour ray_colour(const ray& r, const hittable& world, int depth) -{ - hit_record rec; - if (depth <= 0) - { - return grey; - } - - if (world.hit(r, 0.001, infinity, rec)) - { - ray scattered; - colour attenuation; - - if (rec.mat_ptr->scatter(r, rec, attenuation, scattered)) - { - return attenuation * ray_colour(scattered, world, depth-1); - } - - return grey; - } - - vec3 unit_direction = unit_vector(r.direction()); - auto t = 0.5 * (unit_direction.y() + 1.0) + 0.5; - - return lerp(grey, pink, t); -} - -hittable_list random_scene() -{ - hittable_list world; - - - //auto ground_material = make_shared(pink); - //world.add(make_shared(point3(0,-1000,0), 1000, ground_material)); - - //for (int a = -11; a < 11; a++) - //{ - // for (int b = -11; b < 11; b++) - // { - // auto choose_mat = random_double(); - // point3 centre(a + 0.9*random_double(), 0.2, b + 0.9*random_double()); - - // if ((centre - point3(4, 0.2, 0)).length() > 0.9) - // { - // shared_ptr sphere_material; - - // if (choose_mat < 0.8) - // { - // // diffuse - // //auto albedo = colour::random() * colour::random(); - // sphere_material = make_shared(pink); - // world.add(make_shared(centre, 0.2, sphere_material)); - // } - // else if (choose_mat < 0.95) - // { - // // metal - // auto fuzz = random_double(0, 0.5); - // sphere_material = make_shared(pink, fuzz); - // world.add(make_shared(centre, 0.2, sphere_material)); - // } - // else - // { - // // glass - // sphere_material = make_shared(1.5); - // world.add(make_shared(centre,0.2, sphere_material)); - // } - // } - // } - //} - - auto material1 = make_shared(1.5); - world.add(make_shared(point3(0, 0, 0), 3.0, material1)); - - //auto material2 = make_shared(pink); - //world.add(make_shared(point3(-4, 1, 0), 1.0, material2)); - - auto material3 = make_shared(pink, 0.5); - int sphere_count = 10; - for (int i = 0; i < sphere_count; i++) - { - float a = 6.28 * (float)i/sphere_count - 100.0; - float r = 8.0; - float x = r*sin(a); - float y = 2.0*cos(a); - float z = r*cos(a); - point3 pos(x,y,z); - world.add(make_shared(pos, 2.0, material3)); - } - - - return world; -} - // file descriptor of the socket we're listening for connections on // // returns fd for the client connection @@ -216,6 +111,31 @@ void send_image_dimensions(int sock, unsigned int width, unsigned int height) } } +void render(camera& cam, hittable_list& world, int client_sock) +{ + for (int j = HEIGHT - 1; j >= 0; --j) + { + std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush; + for (int i = 0; i < WIDTH; ++i) + { + colour pixel_colour(0,0,0); + + for (int s = 0; s < SAMPLES_PER_PIXEL; ++s) + { + auto u = (i + random_double()) / (WIDTH-1); + auto v = (j + random_double()) / (HEIGHT-1); + ray r = cam.get_ray(u, v); + pixel_colour += ray_colour(r, world, MAX_DEPTH); + } + + // TODO: we should instead write our output to some buffer in memory + // to decouple our ultimate output from our rendering + //write_colour_to_stream(std::cout, pixel_colour, SAMPLES_PER_PIXEL); + write_colour_to_socket(client_sock, pixel_colour, SAMPLES_PER_PIXEL); + } + } +} + int main() { int sockfd; @@ -239,25 +159,7 @@ int main() camera cam(lookfrom, lookat, vup, 47, ASPECT_RATIO, aperture, dist_to_focus); - for (int j = HEIGHT - 1; j >= 0; --j) - { - std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush; - for (int i = 0; i < WIDTH; ++i) - { - colour pixel_colour(0,0,0); - - for (int s = 0; s < SAMPLES_PER_PIXEL; ++s) - { - auto u = (i + random_double()) / (WIDTH-1); - auto v = (j + random_double()) / (HEIGHT-1); - ray r = cam.get_ray(u, v); - pixel_colour += ray_colour(r, world, MAX_DEPTH); - } - - //write_colour_to_stream(std::cout, pixel_colour, SAMPLES_PER_PIXEL); - write_colour_to_socket(newsockfd, pixel_colour, SAMPLES_PER_PIXEL); - } - } + render(cam, world, newsockfd); // close client socket close(newsockfd); diff --git a/src/ray.h b/src/ray.h index 83690b5..9c66724 100644 --- a/src/ray.h +++ b/src/ray.h @@ -23,3 +23,4 @@ private: point3 origin_; vec3 direction_; }; + diff --git a/src/rtweekend.h b/src/rtweekend.h index 882b353..e79e95a 100644 --- a/src/rtweekend.h +++ b/src/rtweekend.h @@ -17,7 +17,6 @@ const double infinity = std::numeric_limits::infinity(); const double pi = 3.1415926535897932385; // utility functions - inline double degrees_to_radians(double degrees) { return degrees * pi / 180; @@ -44,5 +43,6 @@ inline double clamp(double x, double min, double max) // common headers +#include "error.h" #include "ray.h" #include "vec3.h" diff --git a/src/scene.h b/src/scene.h new file mode 100644 index 0000000..33acf32 --- /dev/null +++ b/src/scene.h @@ -0,0 +1,99 @@ +#pragma once + +#include "sphere.h" +#include "colour.h" +#include "material.h" +#include "hittable.h" +#include "hittable_list.h" + +colour ray_colour(const ray& r, const hittable& world, int depth) +{ + hit_record rec; + if (depth <= 0) + { + return grey; + } + + if (world.hit(r, 0.001, infinity, rec)) + { + ray scattered; + colour attenuation; + + if (rec.mat_ptr->scatter(r, rec, attenuation, scattered)) + { + return attenuation * ray_colour(scattered, world, depth-1); + } + + return grey; + } + + vec3 unit_direction = unit_vector(r.direction()); + auto t = 0.5 * (unit_direction.y() + 1.0) + 0.5; + + return lerp(grey, pink, t); +} + +hittable_list random_scene() +{ + hittable_list world; + + + //auto ground_material = make_shared(pink); + //world.add(make_shared(point3(0,-1000,0), 1000, ground_material)); + + //for (int a = -11; a < 11; a++) + //{ + // for (int b = -11; b < 11; b++) + // { + // auto choose_mat = random_double(); + // point3 centre(a + 0.9*random_double(), 0.2, b + 0.9*random_double()); + + // if ((centre - point3(4, 0.2, 0)).length() > 0.9) + // { + // shared_ptr sphere_material; + + // if (choose_mat < 0.8) + // { + // // diffuse + // //auto albedo = colour::random() * colour::random(); + // sphere_material = make_shared(pink); + // world.add(make_shared(centre, 0.2, sphere_material)); + // } + // else if (choose_mat < 0.95) + // { + // // metal + // auto fuzz = random_double(0, 0.5); + // sphere_material = make_shared(pink, fuzz); + // world.add(make_shared(centre, 0.2, sphere_material)); + // } + // else + // { + // // glass + // sphere_material = make_shared(1.5); + // world.add(make_shared(centre,0.2, sphere_material)); + // } + // } + // } + //} + + auto material1 = make_shared(1.5); + world.add(make_shared(point3(0, 0, 0), 3.0, material1)); + + //auto material2 = make_shared(pink); + //world.add(make_shared(point3(-4, 1, 0), 1.0, material2)); + + auto material3 = make_shared(pink, 0.5); + int sphere_count = 10; + for (int i = 0; i < sphere_count; i++) + { + float a = 6.28 * (float)i/sphere_count - 100.0; + float r = 8.0; + float x = r*sin(a); + float y = 2.0*cos(a); + float z = r*cos(a); + point3 pos(x,y,z); + world.add(make_shared(pos, 2.0, material3)); + } + + return world; +} diff --git a/telescope.md b/telescope.md index 06a0a59..a0a2301 100644 --- a/telescope.md +++ b/telescope.md @@ -5,7 +5,8 @@ use rti1w as a base * [x] server waits for connection * [x] client establishes connection * [x] send a message to the client -* [ ] move rendering out of main.cpp +* [x] move core rendering out of main.cpp +* [ ] combine 'hittable' 'hittable_list' and 'scene' * [x] send rendered image data to client * [x] form image file on client * [ ] client sends receiving port to server