| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 
 | #include "rtweekend.h"
 #include "camera.h"
 #include "hittable.h"
 #include "hittable_list.h"
 #include "material.h"
 #include "sphere.h"
 
 int main(){
 hittable_list world;
 
 auto ground_material = make_shared<lambertian>(color(0.5,0.5,0.5));
 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 center(a + 0.9*random_double(), 0.2, b + 0.9*random_double());
 
 if((center - point3(4,0.2,0)).length() > 1.0){
 shared_ptr<material> sphere_material;
 
 if(choose_mat < 0.8){
 
 auto albedo = color::random() * color::random();
 sphere_material = make_shared<lambertian>(albedo);
 world.add(make_shared<sphere>(center,0.2,sphere_material));
 }else if(choose_mat < 0.95) {
 
 auto albedo = color::random(0.5,1);
 auto fuzz = random_double(0,0.5);
 sphere_material = make_shared<metal>(albedo,fuzz);
 world.add(make_shared<sphere>(center,0.2,sphere_material));
 }else{
 
 sphere_material = make_shared<dielectric>(1.5);
 world.add(make_shared<sphere>(center,0.2,sphere_material));
 }
 }
 }
 }
 
 auto material1 = make_shared<dielectric>(1.5);
 world.add(make_shared<sphere>(point3(0,1,0),1.0,material1));
 
 auto material2 = make_shared<lambertian>(color(0.4, 0.2, 0.1));
 world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));
 
 auto material3 = make_shared<metal>(color(0.7, 0.6, 0.5), 0.0);
 world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3));
 
 camera cam;
 
 cam.aspect_ratio      = 16.0 / 9.0;
 cam.image_width       = 800;
 cam.samples_per_pixel = 100;
 cam.max_depth         = 50;
 
 
 cam.vfov     = 20;
 cam.lookfrom = point3(13,2,3);
 cam.lookat   = point3(0,0,0);
 cam.vup      = vec3(0,1,0);
 
 cam.defocus_angle = 0.6;
 cam.focus_dist    = 10.0;
 
 cam.render(world);
 }
 
 |