45 case PlatonicSolidType::TETRAHEDRON:
47 const float sqrt_2 = sqrt(2.0f);
48 const float sqrt_6 = sqrt(6.0f);
52 {.position = glm::vec3(0.0f, 0.f, 1.0f), .tex_coords_0 = glm::vec2(0.f, 0.f)},
53 {.position = glm::vec3(-sqrt_2, sqrt_6, -1.0f) / 3.0f, .tex_coords_0 = glm::vec2(1.f, 0.f)},
54 {.position = glm::vec3(2.f*sqrt_2, 0.f, -1.0f) / 3.0f, .tex_coords_0 = glm::vec2(0.f, 1.f)},
55 {.position = glm::vec3(-sqrt_2, -sqrt_6, -1.0f) / 3.0f, .tex_coords_0 = glm::vec2(1.f, 1.f)},
67 case PlatonicSolidType::OCTAHEDRON:
71 {.position = glm::vec3(1.0f, .0f, .0f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
72 {.position = glm::vec3(-1.0f, .0f, .0f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
73 {.position = glm::vec3(.0f, 1.0f, .0f), .tex_coords_0 = glm::vec2(0.f, 0.f)},
74 {.position = glm::vec3(0.0f, -1.f, .0f), .tex_coords_0 = glm::vec2(1.f, 1.f)},
75 {.position = glm::vec3(0.0f, 0.f, 1.f), .tex_coords_0 = glm::vec2(0.f, 1.f)},
76 {.position = glm::vec3(0.0f, 0.f, -1.f), .tex_coords_0 = glm::vec2(0.f, 1.f)},
92 case PlatonicSolidType::DODECAHEDRON:
94 const float sqrt_3 = sqrt(3.0f);
95 const float sqrt_5 = sqrt(5.0f);
97 const float a = 1.0f / sqrt_3;
98 const float b = sqrt((3.0f - sqrt_5)/6.0f);
99 const float c = sqrt((3.0f + sqrt_5)/6.0f);
103 {.position = glm::vec3(a, a, a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
104 {.position = glm::vec3(a, a, -a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
105 {.position = glm::vec3(a, -a, a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
106 {.position = glm::vec3(a, -a, -a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
107 {.position = glm::vec3(-a, a, a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
109 {.position = glm::vec3(-a, a, -a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
110 {.position = glm::vec3(-a, -a, a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
111 {.position = glm::vec3(-a, -a, -a), .tex_coords_0 = glm::vec2(1.f, 0.f)},
112 {.position = glm::vec3(b, c, 0.f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
113 {.position = glm::vec3(-b, c, 0.f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
115 {.position = glm::vec3(b, -c, 0.f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
116 {.position = glm::vec3(-b, -c, 0.f), .tex_coords_0 = glm::vec2(1.f, 0.f)},
117 {.position = glm::vec3(c, 0.f, b), .tex_coords_0 = glm::vec2(1.f, 0.f)},
118 {.position = glm::vec3(c, 0.f, -b), .tex_coords_0 = glm::vec2(1.f, 0.f)},
119 {.position = glm::vec3(-c, 0.f, b), .tex_coords_0 = glm::vec2(1.f, 0.f)},
121 {.position = glm::vec3(-c, 0.f, -b), .tex_coords_0 = glm::vec2(1.f, 0.f)},
122 {.position = glm::vec3(0.f, b, c), .tex_coords_0 = glm::vec2(1.f, 0.f)},
123 {.position = glm::vec3(0.f, -b, c), .tex_coords_0 = glm::vec2(1.f, 0.f)},
124 {.position = glm::vec3(0.f, b, -c), .tex_coords_0 = glm::vec2(1.f, 0.f)},
125 {.position = glm::vec3(0.f, -b, -c), .tex_coords_0 = glm::vec2(1.f, 0.f)},
167 for (
size_t i=0; i<vertices.size(); i++)
169 VertexType& vertex = vertices[i];
170 vertex.tex_coords_0 = glm::vec2(vertex.position.x, -vertex.position.y);
175 case PlatonicSolidType::ICOSAHEDRON:
177 const float phi = (1.0f + sqrt(5.0f)) / 2.0f;
178 const float s = sqrt(1 + phi * phi);
182 {.position = glm::vec3(phi, 1.f, 0.f) / s, .tex_coords_0 = glm::vec2(1.f, 0.f)},
183 {.position = glm::vec3(-phi, 1.f, 0.f) / s, .tex_coords_0 = glm::vec2(0.f, 1.f)},
184 {.position = glm::vec3(phi, -1.f, 0.f) / s, .tex_coords_0 = glm::vec2(1.f, 1.f)},
186 {.position = glm::vec3(-phi, -1.f, 0.f) / s, .tex_coords_0 = glm::vec2(1.f, 1.f)},
187 {.position = glm::vec3(1.f, 0.f, phi) / s, .tex_coords_0 = glm::vec2(1.f, 0.f)},
188 {.position = glm::vec3(1.f, 0.f, -phi) / s, .tex_coords_0 = glm::vec2(0.f, 0.f)},
190 {.position = glm::vec3(-1.f, 0.f, phi) / s, .tex_coords_0 = glm::vec2(0.f, 0.f)},
191 {.position = glm::vec3(-1.f, 0.f, -phi) / s, .tex_coords_0 = glm::vec2(1.f, 1.f)},
192 {.position = glm::vec3(0.f, phi, 1.f) / s, .tex_coords_0 = glm::vec2(1.f, 0.f)},
194 {.position = glm::vec3(0.f, -phi, 1.f) / s, .tex_coords_0 = glm::vec2(1.f, 0.f)},
195 {.position = glm::vec3(0.f, phi, -1.f) / s, .tex_coords_0 = glm::vec2(0.f, 1.f)},
196 {.position = glm::vec3(0.f, -phi, -1.f) / s, .tex_coords_0 = glm::vec2(1.f, 0.f)},
222 for (
size_t i=0; i<vertices.size(); i++)
224 VertexType& vertex = vertices[i];
225 vertex.tex_coords_0 = glm::vec2(vertex.position.x, -vertex.position.y);
235 std::vector<VertexType> duplicated_vertices;
236 duplicated_vertices.reserve(indices.size());
238 for (
auto i = 0u; i<indices.size(); ++i)
240 duplicated_vertices.push_back(vertices[indices[i]]);
243 vertices = duplicated_vertices;
245 indices.reserve(vertices.size());
247 for (
auto i = 0u; i<vertices.size(); ++i)
249 indices.push_back(i);
253 primitives = {{0, indices.size()}};