#pragma once #include "math.h" #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, math::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; }