sKit  0.0.9
Cube.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <array>
4 #include <cstdint>
5 #include <glm/geometric.hpp>
6 #include <glm/vec3.hpp>
7 
8 namespace sKit {
9 
10 struct Cube {
11  Cube() = default;
13  Cube(float size) : size(size) {
14  std::array<glm::vec3, 8> base;
15  auto p = size * 0.5;
16  base[0] = {-p, -p, p};
17  base[1] = {p, -p, p};
18  base[2] = {p, -p, -p};
19  base[3] = {-p, -p, -p};
20  base[4] = {-p, p, p};
21  base[5] = {p, p, p};
22  base[6] = {p, p, -p};
23  base[7] = {-p, p, -p};
24 
25  // Face 1
26  vertices[0] = base[0];
27  vertices[1] = base[4];
28  vertices[2] = base[5];
29  vertices[3] = base[1];
30  // Face 2
31  vertices[4] = base[1];
32  vertices[5] = base[5];
33  vertices[6] = base[6];
34  vertices[7] = base[2];
35  // Face 3
36  vertices[8] = base[2];
37  vertices[9] = base[6];
38  vertices[10] = base[7];
39  vertices[11] = base[3];
40  // Face 4
41  vertices[12] = base[3];
42  vertices[13] = base[7];
43  vertices[14] = base[4];
44  vertices[15] = base[0];
45  // Face 5
46  vertices[16] = base[4];
47  vertices[17] = base[7];
48  vertices[18] = base[6];
49  vertices[19] = base[5];
50  // Face 6
51  vertices[20] = base[3];
52  vertices[21] = base[0];
53  vertices[22] = base[1];
54  vertices[23] = base[2];
55 
56  // Face 1 - Tri 1 - 2
57  indices[0] = 0;
58  indices[1] = 1;
59  indices[2] = 2;
60  indices[3] = 0;
61  indices[4] = 2;
62  indices[5] = 3;
63  // Face 2 - Tri 3 - 4
64  indices[6] = 4;
65  indices[7] = 5;
66  indices[8] = 6;
67  indices[9] = 4;
68  indices[10] = 6;
69  indices[11] = 7;
70  // Face 3 - Tri 5 - 6
71  indices[12] = 8;
72  indices[13] = 9;
73  indices[14] = 10;
74  indices[15] = 8;
75  indices[16] = 10;
76  indices[17] = 11;
77  // Face 4 - Tri 7 - 8
78  indices[18] = 12;
79  indices[19] = 13;
80  indices[20] = 14;
81  indices[21] = 12;
82  indices[22] = 14;
83  indices[23] = 15;
84  // Face 5 - Tri 9 - 10
85  indices[24] = 16;
86  indices[25] = 17;
87  indices[26] = 18;
88  indices[27] = 16;
89  indices[28] = 18;
90  indices[29] = 19;
91  // Face 6 - Tri 11 - 12
92  indices[30] = 20;
93  indices[31] = 21;
94  indices[32] = 22;
95  indices[33] = 20;
96  indices[34] = 22;
97  indices[35] = 23;
98 
99  for (size_t i = 0; i < vertices.size(); ++i) {
100  v[i * 3] = vertices[i].x;
101  v[i * 3 + 1] = vertices[i].y;
102  v[i * 3 + 2] = vertices[i].z;
103  }
104  for (size_t i = 0; i < 12; i++) {
105  size_t ia = i * 3;
106  size_t ib = i * 3 + 1;
107  size_t ic = i * 3 + 2;
108  auto a = vertices[indices[ia]];
109  auto b = vertices[indices[ib]];
110  auto c = vertices[indices[ic]];
111  auto normal = glm::normalize(glm::cross(b - a, c - a));
112  normals[indices[ia]] = normal;
113  normals[indices[ib]] = normal;
114  normals[indices[ic]] = normal;
115  }
116 
117  for (size_t i = 0; i < normals.size(); ++i) {
118  n[i * 3] = normals[i].x;
119  n[i * 3 + 1] = normals[i].y;
120  n[i * 3 + 2] = normals[i].z;
121  }
122  };
123 
124  std::array<glm::vec3, 24> vertices;
125  std::array<float, 72> v;
126  std::array<uint16_t, 36> indices;
127  std::array<glm::vec3, 24> normals;
128  std::array<float, 72> n;
129  float size;
130 };
131 
132 } // namespace sKit
sKit::Cube
Definition: Cube.hpp:10
sKit::Cube::n
std::array< float, 72 > n
Definition: Cube.hpp:128
sKit::Cube::normals
std::array< glm::vec3, 24 > normals
Definition: Cube.hpp:127
sKit
Definition: camera.hpp:8
sKit::Cube::v
std::array< float, 72 > v
Definition: Cube.hpp:125
sKit::Cube::size
float size
Definition: Cube.hpp:129
sKit::Cube::Cube
Cube()=default
sKit::Cube::indices
std::array< uint16_t, 36 > indices
Definition: Cube.hpp:126
sKit::Cube::Cube
Cube(float size)
Definition: Cube.hpp:13
sKit::Cube::vertices
std::array< glm::vec3, 24 > vertices
Definition: Cube.hpp:122