-
Notifications
You must be signed in to change notification settings - Fork 1
/
raytracing-in-one-weekend-final-scene-more.rs
125 lines (112 loc) · 3.22 KB
/
raytracing-in-one-weekend-final-scene-more.rs
1
2
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use glam::DVec3;
use itertools::Itertools;
use rand::prelude::*;
use raytracer::{
camera::Camera,
material::Material,
shapes::{self, a_box, sphere::Sphere, Shapes},
};
use std::io;
fn main() -> io::Result<()> {
let mut rng = rand::thread_rng();
let mut world = vec![];
world.push(Shapes::Sphere(Sphere::new(
DVec3::new(0., -1000., 0.),
1000.,
Material::Lambertian {
albedo: DVec3::new(0.5, 0.5, 0.5),
},
)));
for (a, b) in
(-11..11).cartesian_product(-11..11).into_iter()
{
let choose_mat = rng.gen::<f64>();
let center = DVec3::new(
a as f64 + 0.9 * rng.gen::<f64>(),
0.2,
b as f64 + 0.9 * rng.gen::<f64>(),
);
if (center - DVec3::new(4., 0.2, 0.)).length() > 0.9
{
let material = if choose_mat < 0.8 {
// diffuse
let albedo = DVec3::new(
rng.gen_range(0f64..1.),
rng.gen_range(0f64..1.),
rng.gen_range(0f64..1.),
) * DVec3::new(
rng.gen_range(0f64..1.),
rng.gen_range(0f64..1.),
rng.gen_range(0f64..1.),
);
Material::Lambertian { albedo: albedo }
} else if choose_mat < 0.95 {
// metal
let albedo = DVec3::new(
rng.gen_range(0.5..1.),
rng.gen_range(0.5..1.),
rng.gen_range(0.5..1.),
);
let fuzz = rng.gen_range(0f64..0.5);
Material::Metal { albedo, fuzz }
} else {
// glass
Material::Dielectric {
index_of_refraction: 1.5,
}
};
// if choose_mat % 0.2 == 0. {
// world.push(Shapes::Sphere(Sphere {
// center,
// radius: 0.2,
// material,
// }));
// } else {
world.push(Shapes::Box(a_box::Box {
center,
size: DVec3::splat(0.2),
material,
}))
// }
}
}
world.push(Shapes::Sphere(Sphere::new(
DVec3::new(0., 1., 0.),
1.0,
Material::Dielectric {
index_of_refraction: 1.5,
},
)));
world.push(Shapes::Sphere(Sphere::new(
DVec3::new(-4., 1., 0.),
1.0,
Material::Lambertian {
albedo: DVec3::new(0.4, 0.2, 0.1),
},
)));
world.push(Shapes::Sphere(Sphere::new(
DVec3::new(4., 1., 0.),
1.0,
Material::Metal {
albedo: DVec3::new(0.7, 0.6, 0.5),
fuzz: 0.0,
},
)));
let camera = Camera::init()
.image_width(400)
.aspect_ratio(16.0 / 9.0)
.look_from(DVec3::new(13., 2., 3.))
.look_at(DVec3::ZERO)
.vup(DVec3::Y)
.focus_dist(10.0)
.defocus_angle(0.0)
.samples_per_pixel(500)
.max_depth(50)
.vfov(20.)
.build();
camera.render_to_disk(
"raytracing-in-one-weekend-final-scene-more",
world,
)?;
Ok(())
}