#include "colour.h" #include "camera.h" #include "material.h" #include "image.h" #include "world.h" #include "network.h" #include #include void render(camera& cam, const world& 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 + math::random_double()) / (WIDTH-1); auto v = (j + math::random_double()) / (HEIGHT-1); ray r = cam.get_ray(u, v); pixel_colour += trace(world, r, 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; int newsockfd = wait_for_client(sockfd); printf("got a connection!\n"); send_image_dimensions(newsockfd, WIDTH, HEIGHT); //std::cout << "P3\n" << WIDTH << ' ' << HEIGHT << "\n255\n"; auto dist_to_target = 10.0; auto dist_to_focus = dist_to_target + 1.0; auto cam_y = 1.0; point3 lookfrom(0,cam_y,-dist_to_target); point3 lookat(0,0,0); vec3 vup(0,1,0); auto aperture = 0.5; camera cam(lookfrom, lookat, vup, 47, ASPECT_RATIO, aperture, dist_to_focus); const world* world = world::close_glass_sphere(); render(cam, *world, newsockfd); // close client socket close(newsockfd); printf("closed client connection\n"); // close listening socket close(sockfd); printf("closed listening socket\n"); printf("done!\n"); return 0; }