-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.pi
More file actions
88 lines (71 loc) · 2.75 KB
/
main.pi
File metadata and controls
88 lines (71 loc) · 2.75 KB
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
use std::io;
use raytracepl::vec3::Vec3;
use raytracepl::ray::Ray;
use raytracepl::utils::*;
use raytracepl::color;
use raytracepl::hittable::Hittable;
use raytracepl::hittable_list::HittableList;
use raytracepl::sphere::Sphere;
use raytracepl::interval;
use raytracepl::camera::Camera;
use raytracepl::material;
use std::thread;
use std::chan;
use raytracepl::interval::Interval;
use raytracepl::material::Mat;
use std::task::helper;
fn main() i64 {
run("1.ppm");
return 0;
}
fn run(f:string) i64 {
// World
let world = hittable_list::new();
let ground_material = material::new_lam(vec3::new(0.5, 0.5, 0.5));
world.add(sphere::new(vec3::new(0.0, -1000.0, 0.0), 1000.0, ground_material as Mat));
for let a = -11; a < 11; a = a + 1 {
for let b = -11; b < 11; b = b + 1 {
let choose_mat = random_f64();
let center = vec3::new(a as f64 + 0.9 * random_f64(), 0.2, b as f64 + 0.9 * random_f64());
if (center.sub(vec3::new(4.0, 0.2, 0.0))).length() > 0.9 {
if choose_mat < 0.8 {
// diffuse
let albedo = vec3::random().mul_vec(vec3::random());
let sphere_material = material::new_lam(albedo);
world.add(sphere::new(center, 0.2, sphere_material as Mat));
} else if choose_mat < 0.95 {
// metal
let albedo = vec3::random_range(0.5, 1.0);
let fuzz = random_f64_range(0.0, 0.5);
let sphere_material = material::new_metal(albedo, fuzz);
world.add(sphere::new(center, 0.2, sphere_material as Mat));
} else {
// glass
let sphere_material = material::new_dielectric(1.5);
world.add(sphere::new(center, 0.2, sphere_material as Mat));
}
}
}
}
let material1 = material::new_dielectric(1.5);
world.add(sphere::new(vec3::new(0.0, 1.0, 0.0), 1.0, material1 as Mat));
let material2 = material::new_lam(vec3::new(0.4, 0.2, 0.1));
world.add(sphere::new(vec3::new(-4.0, 1.0, 0.0), 1.0, material2 as Mat));
let material3 = material::new_metal(vec3::new(0.7, 0.6, 0.5), 0.0);
world.add(sphere::new(vec3::new(4.0, 1.0, 0.0), 1.0, material3 as Mat));
// Camera
let cam = camera::default();
cam.aspect_ratio = 16.0 / 9.0;
cam.image_width = 1200;
cam.sample_per_pixel = 500;
cam.max_depth = 50;
cam.vfov = 20.0;
cam.lookfrom = vec3::new(13.0, 2.0, 3.0);
cam.lookat = vec3::new(0.0, 0.0, 0.0);
cam.vup = vec3::new(0.0, 1.0, 0.0);
cam.defocus_angle = 0.6;
cam.focus_dist = 10.0;
// Render
cam.render(world, f);
return 0;
}