-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcornell_box.cpp
118 lines (96 loc) · 4.4 KB
/
cornell_box.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
#include "cornell_box.h"
namespace
{
void AddTriangle(std::vector<uint32_t>& indices, const uint32_t offset, const uint32_t i0, const uint32_t i1, const uint32_t i2)
{
indices.push_back(offset + i0);
indices.push_back(offset + i1);
indices.push_back(offset + i2);
}
}
estun::Model CornellBox::CreateCornellBox(const float scale)
{
std::vector<estun::Vertex> vertices;
std::vector<uint32_t> indices;
std::vector<estun::Material> materials;
CornellBox::Create(scale, vertices, indices, materials);
return estun::Model(
"box",
std::move(vertices),
std::move(indices),
std::move(materials)
);
}
void CornellBox::Create(
const float scale,
std::vector<estun::Vertex>& vertices,
std::vector<uint32_t>& indices,
std::vector<estun::Material>& materials)
{
materials.push_back(estun::Material::Lambertian(glm::vec3(0.65f, 0.05f, 0.05f))); // red
materials.push_back(estun::Material::Lambertian(glm::vec3(0.12f, 0.45f, 0.15f))); // green
materials.push_back(estun::Material::Lambertian(glm::vec3(0.73f, 0.73f, 0.73f))); // white
materials.push_back(estun::Material::DiffuseLight(glm::vec3(15.0f))); // light
const float s = scale;
const glm::vec3 l0(-s, -s, 0);
const glm::vec3 l1(-s, -s, -s);
const glm::vec3 l2(-s, s, -s);
const glm::vec3 l3(-s, s, 0);
const glm::vec3 r0(s, -s, 0);
const glm::vec3 r1(s, -s, -s);
const glm::vec3 r2(s, s, -s);
const glm::vec3 r3(s, s, 0);
// Left green panel
auto i = static_cast<uint32_t>(vertices.size());
vertices.push_back(estun::Vertex{ l0, glm::vec3(1, 0, 0), glm::vec2(0, 1), 1 });
vertices.push_back(estun::Vertex{ l1, glm::vec3(1, 0, 0), glm::vec2(1, 1), 1 });
vertices.push_back(estun::Vertex{ l2, glm::vec3(1, 0, 0), glm::vec2(1, 0), 1 });
vertices.push_back(estun::Vertex{ l3, glm::vec3(1, 0, 0), glm::vec2(0, 0), 1 });
AddTriangle(indices, i, 0, 1, 2);
AddTriangle(indices, i, 0, 2, 3);
// Right red panel
i = static_cast<uint32_t>(vertices.size());
vertices.push_back(estun::Vertex{ r0, glm::vec3(-1, 0, 0), glm::vec2(0, 1), 0 });
vertices.push_back(estun::Vertex{ r1, glm::vec3(-1, 0, 0), glm::vec2(1, 1), 0 });
vertices.push_back(estun::Vertex{ r2, glm::vec3(-1, 0, 0), glm::vec2(1, 0), 0 });
vertices.push_back(estun::Vertex{ r3, glm::vec3(-1, 0, 0), glm::vec2(0, 0), 0 });
AddTriangle(indices, i, 2, 1, 0);
AddTriangle(indices, i, 3, 2, 0);
// Back white panel
i = static_cast<uint32_t>(vertices.size());
vertices.push_back(estun::Vertex{ l1, glm::vec3(0, 0, 1), glm::vec2(0, 1), 2 });
vertices.push_back(estun::Vertex{ r1, glm::vec3(0, 0, 1), glm::vec2(1, 1), 2 });
vertices.push_back(estun::Vertex{ r2, glm::vec3(0, 0, 1), glm::vec2(1, 0), 2 });
vertices.push_back(estun::Vertex{ l2, glm::vec3(0, 0, 1), glm::vec2(0, 0), 2 });
AddTriangle(indices, i, 0, 1, 2);
AddTriangle(indices, i, 0, 2, 3);
// Bottom white panel
i = static_cast<uint32_t>(vertices.size());
vertices.push_back(estun::Vertex{ l0, glm::vec3(0, 1, 0), glm::vec2(0, 1), 2 });
vertices.push_back(estun::Vertex{ r0, glm::vec3(0, 1, 0), glm::vec2(1, 1), 2 });
vertices.push_back(estun::Vertex{ r1, glm::vec3(0, 1, 0), glm::vec2(1, 0), 2 });
vertices.push_back(estun::Vertex{ l1, glm::vec3(0, 1, 0), glm::vec2(0, 0), 2 });
AddTriangle(indices, i, 0, 1, 2);
AddTriangle(indices, i, 0, 2, 3);
// Top white panel
i = static_cast<uint32_t>(vertices.size());
vertices.push_back(estun::Vertex{ l2, glm::vec3(0, -1, 0), glm::vec2(0, 1), 2 });
vertices.push_back(estun::Vertex{ r2, glm::vec3(0, -1, 0), glm::vec2(1, 1), 2 });
vertices.push_back(estun::Vertex{ r3, glm::vec3(0, -1, 0), glm::vec2(1, 0), 2 });
vertices.push_back(estun::Vertex{ l3, glm::vec3(0, -1, 0), glm::vec2(0, 0), 2 });
AddTriangle(indices, i, 0, 1, 2);
AddTriangle(indices, i, 0, 2, 3);
// Light
i = static_cast<uint32_t>(vertices.size());
const float x0 = s * (213.0f / 555.0f);
const float x1 = s * (343.0f / 555.0f);
const float z0 = s * (-555.0f + 332.0f) / 555.0f;
const float z1 = s * (-555.0f + 227.0f) / 555.0f;
const float y1 = s * 0.998f;
vertices.push_back(estun::Vertex{ glm::vec3(x0, y1, z1), glm::vec3(0, -1, 0), glm::vec2(0, 1), 3 });
vertices.push_back(estun::Vertex{ glm::vec3(x1, y1, z1), glm::vec3(0, -1, 0), glm::vec2(1, 1), 3 });
vertices.push_back(estun::Vertex{ glm::vec3(x1, y1, z0), glm::vec3(0, -1, 0), glm::vec2(1, 0), 3 });
vertices.push_back(estun::Vertex{ glm::vec3(x0, y1, z0), glm::vec3(0, -1, 0), glm::vec2(0, 0), 3 });
AddTriangle(indices, i, 0, 1, 2);
AddTriangle(indices, i, 0, 2, 3);
}