Unravel Engine C++ Reference
Loading...
Searching...
No Matches
dodecahedron_mesh.cpp
Go to the documentation of this file.
2#include "iterator.hpp"
3
4#include <array>
5#include <memory>
6
7using namespace generator;
8
9namespace
10{
11
12#ifndef ANONYMOUS
13#define ANONYMOUS anonymous
14#endif
15namespace ANONYMOUS
16{
17static const double a = (1.0 + std::sqrt(5.0)) / 2.0;
18
19static const std::array<gml::dvec3, 20> vertices{
20 {{1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, -1.0, -1.0},
21 {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {-1.0, -1.0, 1.0},
22
23 {0.0, 1.0 / a, -a}, {0.0, -1.0 / a, -a}, {0.0, 1.0 / a, a}, {0.0, -1.0 / a, a},
24
25 {1.0 / a, a, 0.0}, {-1.0 / a, a, 0.0}, {1.0 / a, -a, 0.0}, {-1.0 / a, -a, 0.0},
26
27 {a, 0.0, -1.0 / a}, {-a, 0.0, -1.0 / a}, {a, 0.0, 1.0 / a}, {-a, 0.0, 1.0 / a}}};
28
29static const std::array<std::array<int, 5>, 12> polygons{{
30 {{0, 12, 4, 18, 16}}, // 0
31 {{18, 6, 14, 2, 16}}, // 1
32 {{4, 10, 11, 6, 18}}, // 2
33 {{11, 7, 15, 14, 6}}, // 3
34 {{7, 11, 10, 5, 19}}, // 4
35 {{17, 3, 15, 7, 19}}, // 5
36 {{9, 2, 14, 15, 3}}, // 6
37 {{1, 8, 9, 3, 17}}, // 7
38 {{10, 4, 12, 13, 5}}, // 8
39 {{5, 13, 1, 17, 19}}, // 9
40 {{0, 8, 1, 13, 12}}, // 10
41 {{0, 16, 2, 9, 8}} // 11
42}};
43}
44}
45
46static std::vector<gml::dvec3> makevertices_t(int faceIndex) noexcept
47{
48 std::vector<gml::dvec3> result(5);
49 for(int i = 0; i < 5; ++i)
50 {
51 result.at(i) = gml::normalize(ANONYMOUS::vertices.at(ANONYMOUS::polygons.at(faceIndex)[i]));
52 }
53 return result;
54}
55
56dodecahedron_mesh_t::triangles_t::triangles_t(const dodecahedron_mesh_t& mesh) noexcept
57 : mesh_{&mesh}
58 , face_index_{0}
59 , face_mesh_{std::make_shared<convex_polygon_mesh_t>(makevertices_t(0), mesh_->segments_, mesh_->rings_)}
60 , triangles_{face_mesh_->triangles()}
61{
62}
63
65{
66 return face_index_ == ANONYMOUS::polygons.size();
67}
68
70{
71 if(done())
72 throw std::out_of_range("Done!");
73
74 triangle_t triangle = triangles_.generate();
75
76 const int base = face_index_ * mesh_->face_vertex_count_;
77
78 triangle.vertices[0] += base;
79 triangle.vertices[1] += base;
80 triangle.vertices[2] += base;
81
82 return triangle;
83}
84
86{
87 if(done())
88 throw std::out_of_range("Done!");
89
90 triangles_.next();
91
92 if(triangles_.done())
93 {
94 ++face_index_;
95
96 if(!done())
97 {
98 face_mesh_ = std::make_shared<convex_polygon_mesh_t>(makevertices_t(face_index_), mesh_->segments_);
99
100 triangles_ = face_mesh_->triangles();
101 }
102 }
103}
104
105dodecahedron_mesh_t::vertices_t::vertices_t(const dodecahedron_mesh_t& mesh) noexcept
106 : mesh_{&mesh}
107 , face_index_{0}
108 , face_mesh_{std::make_shared<convex_polygon_mesh_t>(makevertices_t(0), mesh_->segments_, mesh_->rings_)}
109 , vertices_{face_mesh_->vertices()}
110{
111}
112
114{
115 return face_index_ == ANONYMOUS::polygons.size();
116}
117
119{
120 mesh_vertex_t vertex = vertices_.generate();
121
122 vertex.position *= mesh_->radius_;
123
124 return vertex;
125}
126
128{
129 vertices_.next();
130
131 if(vertices_.done())
132 {
133 ++face_index_;
134
135 if(!done())
136 {
137 face_mesh_ =
138 std::make_shared<convex_polygon_mesh_t>(makevertices_t(face_index_), mesh_->segments_, mesh_->rings_);
139
140 vertices_ = face_mesh_->vertices();
141 }
142 }
143}
144
145dodecahedron_mesh_t::dodecahedron_mesh_t(double radius, int segments, int rings) noexcept
146 : radius_{radius}
147 , segments_{segments}
148 , rings_{rings}
149 , face_vertex_count_{count(convex_polygon_mesh_t{1.0, 5u, segments, rings}.vertices())}
150{
151}
152
157
entt::handle a
vertices_t vertices() const noexcept
triangles_t triangles() const noexcept
vertices_t vertices() const noexcept
dodecahedron_mesh_t(double radius=1.0, int segments=1, int rings=1) noexcept
gml::ivec3 vertices
Zero based indices of the triangle vertices in counterclockwise order.
Definition triangle.hpp:13
int count(const generator_t &generator) noexcept
Counts the number of steps left in the generator.
Definition utils.hpp:70
const segment_list * segments