-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
119 lines (98 loc) · 5.42 KB
/
main.c
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
#include "rt_utils.h"
#include "camera.h"
#include "color.h"
#include "hittables_list.h"
#include "sphere.h"
#include "material.h"
#include "bvh.h"
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
int main() {
FILE *file = fopen("images/bvh_image.ppm", "w");
if (file == NULL) {
perror("Couldn't open file");
return 1;
}
// World
hittable_list world = initializeList();
lambertian mat_ground = make_lambertian(initValue(0.5, 0.5, 0.5));
dielectric mat1 = make_dielectric(1.5);
lambertian mat2 = make_lambertian(initValue(0.4, 0.2, 0.1));
metal mat3 = make_metal(initValue(0.7, 0.6, 0.5), 0.0);
material *material_ground = create_material(LAMBERTIAN, create_surface(LAMBERTIAN, &mat_ground)); // make_shared<lambertian>(color(0.8, 0.8, 0.0));
material *material1 = create_material(DIELECTRIC, create_surface(DIELECTRIC, &mat1));// make_shared<lambertian>(color(0.7, 0.3, 0.3));
material *material2 = create_material(LAMBERTIAN, create_surface(LAMBERTIAN, &mat2));// make_shared<metal>(color(0.8, 0.8, 0.8));
material *material3 = create_material(METAL, create_surface(METAL, &mat3));// make_shared<metal>(color(0.8, 0.6, 0.2));
object *s1 = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(initValue(0,-1000,0), 1000.0, material_ground)));
object *s2 = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(initValue(0, 1, 0), 1, material1)));
object *s3 = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(initValue(-4, 1, 0), 1.0, material2)));
object *s4 = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(initValue(4, 1, 0), 1.0, material3)));
// object *s4 = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(initValue(1.0, 0.0, -1.0), 0.5, material_right)));
list_add(&world, s1);
list_add(&world, s2);
list_add(&world, s3);
list_add(&world, s4);
vector materials;
initializeVector(&materials, 0);
push_back(&materials, material_ground);
push_back(&materials, material1);
push_back(&materials, material2);
push_back(&materials, material3);
for (int a = -11; a < 11; a++) {
for (int b = -11; b < 11; b++) {
double choose_mat = random_double_empt();
point3 center = initValue(a + 0.9*random_double_empt(), 0.2, b + 0.9*random_double_empt());
point3 pt = initValue(4, 0.2, 0);
vec3 sub_res = sub(¢er, &pt);
if (len(&sub_res) > 0.9) {
if (choose_mat < 0.8) {
vec3 rand_vec_3 = initValue(0, random_double(0, 0.5), 0);
point3 center2 = add(¢er, &rand_vec_3);
// diffuse
vec3 rand_vec = random_vec();
vec3 rand_vec_2 = random_vec();
color albedo = mult(&rand_vec, &rand_vec_2);
lambertian sphere_material = make_lambertian(albedo);
material *material_sphere = create_material(LAMBERTIAN, create_surface(LAMBERTIAN, &sphere_material));
push_back(&materials, material_sphere);
object *sphere_lamb = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphereMoving(center, center2, 0.2, material_sphere)));
list_add(&world, sphere_lamb);
} else if (choose_mat < 0.95) {
// metal
color albedo = random_vec_value(0.5, 1);
double fuzz = random_double(0, 0.5);
metal sphere_material = make_metal(albedo, fuzz);
material *material_sphere = create_material(METAL, create_surface(METAL, &sphere_material));
push_back(&materials, material_sphere);
object *sphere_mtl = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(center, 0.2, material_sphere)));
list_add(&world, sphere_mtl);
} else {
// glass
dielectric sphere_material = make_dielectric(1.5);
material *material_sphere = create_material(DIELECTRIC, create_surface(DIELECTRIC, &sphere_material));
push_back(&materials, material_sphere);
object *sphere_dlc = create_object(SPHERE_TYPE, create_shape(SPHERE_TYPE, (void *) makeSphere(center, 0.2, material_sphere)));
list_add(&world, sphere_dlc);
}
}
}
}
bvh_node *bvh = (bvh_node *) malloc(sizeof(bvh_node));
constructBVHBuild(bvh, &world, 0, world.objects.size);
hittable_list bvh_world = initializeList();
object *bvh_obj = create_object(BVH_TYPE, create_shape(BVH_TYPE, (void *) bvh));
list_add(&bvh_world, bvh_obj);
camera cam = {.aspect_ratio = 16.0/9.0, .image_width = 400, .samples_per_pixel = 100, .max_depth = 50, .vfov = 20, .lookfrom = {{13, 2, 3}},
.lookat = {{0, 0, 0}}, .vup = {{0, 1, 0}}, .defocus_angle = 0.6, .focus_dist = 10.0};
render(&cam, &bvh_world, file);
for (int cnt = 0; cnt < world.objects.size; cnt++) {
free_object((object *)list_get(&world.objects, cnt));
}
free_vec(&world.objects);
for (int cnt = 0; cnt < materials.size; cnt++) {
free_material((material *)list_get(&materials, cnt));
}
free_vec(&materials);
fclose(file);
}