-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSceneBuilders.cpp
142 lines (110 loc) · 6.57 KB
/
SceneBuilders.cpp
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "precomp.h"
#include "SceneBuilders.h"
Scene SceneBuilders::bunch_of_objects()
{
Scene s = Scene();
s.triangles.push_back({
Triangle(float3(-20, 0, -20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white),
Triangle(float3(20, 0, 20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white),
});
s.triangles.push_back(get_mesh_from_file("./assets/cube.obj", 1.f, Material::white_light));
s.triangles.push_back(get_mesh_from_file("./assets/dragon.obj", 5.f, Material::emerald));
s.triangles.push_back(get_mesh_from_file("./assets/buddha.obj", 6.0f, Material::glass));
s.triangles.push_back(get_mesh_from_file("./assets/sheep.obj", 0.1f, Material::magenta));
s.triangles.push_back(get_mesh_from_file("./assets/bunny.obj", 3.f, Material::cyan));
s.bvhs.emplace_back(s.triangles[0], true);
s.bvhs.emplace_back(s.triangles[1], true);
s.bvhs.emplace_back(s.triangles[2], true);
s.bvhs.emplace_back(s.triangles[3], true);
s.bvhs.emplace_back(s.triangles[4], true);
s.bvhs.emplace_back(s.triangles[5], true);
std::vector<TopBVHNode> bvh_nodes;
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[0], float3(0,0,0) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[1], float3(0,1.001,0) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[2], float3(6,1.414,0) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[3], float3(0,2.676,6) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[4], float3(0,1.258,-6) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[5], float3(-6,-0.062,0) });
s.bvh = TopLevelBVH(bvh_nodes, true);
return s;
}
Scene SceneBuilders::billion_triangles_bunnies()
{
Scene s = Scene();
s.triangles.push_back({
Triangle(float3(-200, 0, -200),float3(-200, 0, 200), float3(200, 0, -200), float3(0,1,0), Material::white_light),
Triangle(float3(200, 0, 200),float3(-200, 0, 200), float3(200, 0, -200), float3(0,1,0), Material::white_light),
});
s.triangles.push_back(get_mesh_from_file("./assets/bunny.obj", 1.f, Material::red));
s.bvhs.emplace_back(s.triangles[0], true);
s.bvhs.emplace_back(s.triangles[1], true);
std::vector<TopBVHNode> bvh_nodes;
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[0], float3(0,0,0)});
for (int i = 0; i < 10000; i++) { //each bunny has 100k+ triangles
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[1], float3(-((float)i / 100) * 3,0,-(i % 100) * 3)});
}
s.bvh = TopLevelBVH(bvh_nodes, true);
return s;
}
Scene SceneBuilders::glass_dragon()
{
Scene s = Scene();
s.triangles.push_back({
Triangle(float3(-20, 0, -20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white), //y sides
Triangle(float3(20, 0, 20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white),
/*Triangle(float3(-20, 20, -20),float3(-20, 20, 20), float3(20, 20, -20), float3(0,-1,0), Material::white),
Triangle(float3(20, 20, 20),float3(-20, 20, 20), float3(20, 20, -20), float3(0,-1,0), Material::white),
Triangle(float3(-20, 0, -20),float3(-20, 20, -20), float3(20, 0, -20), float3(0,0,1), Material::white), //z sides
Triangle(float3(20, 20, -20),float3(-20, 20, -20), float3(20, 0, -20), float3(0,0,1), Material::white),
Triangle(float3(-20, 0, 20),float3(-20, 20, 20), float3(20, 0, 20), float3(0,0,-1), Material::white),
Triangle(float3(20, 20, 20),float3(-20, 20, 20), float3(20, 0, 20), float3(0,0,-1), Material::white),
Triangle(float3(-20, 0, -20),float3(-20, 20, -20), float3(-20, 0, 20), float3(1,0,0), Material::white), //x sides
Triangle(float3(-20, 20, 20),float3(-20, 20, -20), float3(-20, 0, 20), float3(1,0,0), Material::white),
Triangle(float3(20, 0, -20),float3(20, 20, -20), float3(20, 0, 20), float3(-1,0,0), Material::white),
Triangle(float3(20, 20, 20),float3(20, 20, -20), float3(20, 0, 20), float3(-1,0,0), Material::white)*/
});
s.triangles.push_back(get_mesh_from_file("./assets/dragon.obj", 5.f, Material::red_glass));
s.triangles.push_back(get_mesh_from_file("./assets/buddha.obj", 6.f, Material::yellow));
s.triangles.push_back(get_mesh_from_file("./assets/teapot.obj", 1.f, Material::cyan));
s.triangles.push_back(get_mesh_from_file("./assets/bunny.obj", 3.f, Material::white_light));
s.bvhs.emplace_back(s.triangles[0], true);
s.bvhs.emplace_back(s.triangles[1], true);
s.bvhs.emplace_back(s.triangles[2], true);
s.bvhs.emplace_back(s.triangles[3], true);
s.bvhs.emplace_back(s.triangles[4], true);
std::vector<TopBVHNode> bvh_nodes;
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[0], float3(0,0,0) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[1], float3(-3.5,5,2.5) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[2], float3(3.5,6.001,-2.5) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[3], float3(3.5,0,2.5) });
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[4], float3(-3.5,0,-2.5) });
s.bvh = TopLevelBVH(bvh_nodes, true);
return s;
}
Scene SceneBuilders::path_tracing_test()
{
Scene s = Scene();
s.triangles.push_back({
Triangle(float3(-20, 0, -20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white), //y sides
Triangle(float3(20, 0, 20),float3(-20, 0, 20), float3(20, 0, -20), float3(0,1,0), Material::white),
//Triangle(float3(-20, 20, -20),float3(-20, 20, 20), float3(20, 20, -20), float3(0,-1,0), Material::white),
//Triangle(float3(20, 20, 20),float3(-20, 20, 20), float3(20, 20, -20), float3(0,-1,0), Material::white),
//Triangle(float3(-20, 0, -20),float3(-20, 20, -20), float3(20, 0, -20), float3(0,0,1), Material::white), //z sides
//Triangle(float3(20, 20, -20),float3(-20, 20, -20), float3(20, 0, -20), float3(0,0,1), Material::white),
//Triangle(float3(-20, 0, 20),float3(-20, 20, 20), float3(20, 0, 20), float3(0,0,-1), Material::white),
//Triangle(float3(20, 20, 20),float3(-20, 20, 20), float3(20, 0, 20), float3(0,0,-1), Material::white),
//
//Triangle(float3(-20, 0, -20),float3(-20, 20, -20), float3(-20, 0, 20), float3(1,0,0), Material::white), //x sides
//Triangle(float3(-20, 20, 20),float3(-20, 20, -20), float3(-20, 0, 20), float3(1,0,0), Material::white),
//Triangle(float3(20, 0, -20),float3(20, 20, -20), float3(20, 0, 20), float3(-1,0,0), Material::white),
//Triangle(float3(20, 20, 20),float3(20, 20, -20), float3(20, 0, 20), float3(-1,0,0), Material::white)
});
for (int i = 0; i < 8 * 8; i++) s.triangles.push_back(get_mesh_from_file("./assets/sheep.obj", 0.1f, get_random_material()));
s.bvhs.emplace_back(s.triangles[0], true);
for (int i = 0; i < 8 * 8; i++) s.bvhs.emplace_back(s.triangles[i+1], true);
std::vector<TopBVHNode> bvh_nodes;
bvh_nodes.push_back(TopBVHNode{ &s.bvhs[0], float3(0,0,0) });
for (int i = 0; i < 8 * 8; i++) bvh_nodes.push_back(TopBVHNode{ &s.bvhs[i+1], float3((i%8)*4-16,1.26,(i / 8) * 4 - 16) });
s.bvh = TopLevelBVH(bvh_nodes, true);
return s;
}