extract scene functionality from main.cpp
This commit is contained in:
		
							parent
							
								
									d244c23e2b
								
							
						
					
					
						commit
						5a92d1874e
					
				@ -8,6 +8,9 @@
 | 
			
		||||
// for writing to socket
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										7
									
								
								src/error.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/error.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
void error(const char* message)
 | 
			
		||||
{
 | 
			
		||||
    perror(message);
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										152
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								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<int>(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<lambertian>(pink);
 | 
			
		||||
    //world.add(make_shared<sphere>(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<material> sphere_material;
 | 
			
		||||
 | 
			
		||||
    //            if (choose_mat < 0.8)
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // diffuse
 | 
			
		||||
    //                //auto albedo = colour::random() * colour::random();
 | 
			
		||||
    //                sphere_material = make_shared<lambertian>(pink);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre, 0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //            else if (choose_mat < 0.95)
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // metal
 | 
			
		||||
    //                auto fuzz = random_double(0, 0.5);
 | 
			
		||||
    //                sphere_material = make_shared<metal>(pink, fuzz);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre, 0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //            else
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // glass
 | 
			
		||||
    //                sphere_material = make_shared<dielectric>(1.5);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre,0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //        }
 | 
			
		||||
    //    }
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    auto material1 = make_shared<dielectric>(1.5);
 | 
			
		||||
    world.add(make_shared<sphere>(point3(0, 0, 0), 3.0, material1));
 | 
			
		||||
 | 
			
		||||
    //auto material2 = make_shared<lambertian>(pink);
 | 
			
		||||
    //world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));
 | 
			
		||||
    
 | 
			
		||||
    auto material3 = make_shared<metal>(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<sphere>(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);
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ const double infinity = std::numeric_limits<double>::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"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										99
									
								
								src/scene.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/scene.h
									
									
									
									
									
										Normal file
									
								
							@ -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<lambertian>(pink);
 | 
			
		||||
    //world.add(make_shared<sphere>(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<material> sphere_material;
 | 
			
		||||
 | 
			
		||||
    //            if (choose_mat < 0.8)
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // diffuse
 | 
			
		||||
    //                //auto albedo = colour::random() * colour::random();
 | 
			
		||||
    //                sphere_material = make_shared<lambertian>(pink);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre, 0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //            else if (choose_mat < 0.95)
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // metal
 | 
			
		||||
    //                auto fuzz = random_double(0, 0.5);
 | 
			
		||||
    //                sphere_material = make_shared<metal>(pink, fuzz);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre, 0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //            else
 | 
			
		||||
    //            {
 | 
			
		||||
    //                // glass
 | 
			
		||||
    //                sphere_material = make_shared<dielectric>(1.5);
 | 
			
		||||
    //                world.add(make_shared<sphere>(centre,0.2, sphere_material));
 | 
			
		||||
    //            }
 | 
			
		||||
    //        }
 | 
			
		||||
    //    }
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    auto material1 = make_shared<dielectric>(1.5);
 | 
			
		||||
    world.add(make_shared<sphere>(point3(0, 0, 0), 3.0, material1));
 | 
			
		||||
 | 
			
		||||
    //auto material2 = make_shared<lambertian>(pink);
 | 
			
		||||
    //world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));
 | 
			
		||||
    
 | 
			
		||||
    auto material3 = make_shared<metal>(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<sphere>(pos, 2.0, material3));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return world;
 | 
			
		||||
}
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user