Unravel Engine C++ Reference
Loading...
Searching...
No Matches
icosahedron_mesh.cpp
Go to the documentation of this file.
2#include "iterator.hpp"
3
4#include <array>
5
6using namespace generator;
7
8namespace
9{
10
11#ifndef ANONYMOUS
12#define ANONYMOUS anonymous
13#endif
14namespace ANONYMOUS
15{
16static const double a = (1.0 + std::sqrt(5.0)) / 2.0;
17static const double d = std::sqrt(1.0 + a * a);
18static const double x = 1.0 / d;
19static const double y = a / d;
20
21static const std::array<gml::dvec3, 12> vertices{{{-x, y, 0.0},
22 {x, y, 0.0},
23 {-x, -y, 0.0},
24 {x, -y, 0.0},
25 {0.0, -x, y},
26 {0.0, x, y},
27 {0.0, -x, -y},
28 {0.0, x, -y},
29 {y, 0.0, -x},
30 {y, 0.0, x},
31 {-y, 0.0, -x},
32 {-y, 0.0, x}}};
33
34static const std::array<gml::ivec3, 20> triangles{{{0, 11, 5}, {0, 5, 1}, {0, 1, 7}, {0, 7, 10}, {0, 10, 11},
35 {1, 5, 9}, {5, 11, 4}, {11, 10, 2}, {10, 7, 6}, {7, 1, 8},
36 {3, 9, 4}, {3, 4, 2}, {3, 2, 6}, {3, 6, 8}, {3, 8, 9},
37 {4, 9, 5}, {2, 4, 11}, {6, 2, 10}, {8, 6, 7}, {9, 8, 1}}};
38}
39}
40
41icosahedron_mesh_t::triangles_t::triangles_t(const icosahedron_mesh_t& mesh)
42 : mesh_{&mesh}
43 , i_{0}
44 , triangle_mesh_{std::make_shared<triangle_mesh_t>(ANONYMOUS::vertices[ANONYMOUS::triangles[0][0]],
45 ANONYMOUS::vertices[ANONYMOUS::triangles[0][1]],
46 ANONYMOUS::vertices[ANONYMOUS::triangles[0][2]],
47 mesh.segments_)}
48 , triangles_{triangle_mesh_->triangles()}
49{
50}
51
53{
54 return i_ == static_cast<int>(ANONYMOUS::triangles.size());
55}
56
58{
59 if(done())
60 throw std::out_of_range("Done!");
61
62 triangle_t triangle = triangles_.generate();
63
64 const int base = i_ * mesh_->face_vertex_count_;
65
66 triangle.vertices[0] += base;
67 triangle.vertices[1] += base;
68 triangle.vertices[2] += base;
69
70 return triangle;
71}
72
74{
75 if(done())
76 throw std::out_of_range("Done!");
77
78 triangles_.next();
79
80 if(triangles_.done())
81 {
82 ++i_;
83
84 if(!done())
85 {
86 triangle_mesh_ = std::make_shared<triangle_mesh_t>(ANONYMOUS::vertices[ANONYMOUS::triangles[i_][0]],
87 ANONYMOUS::vertices[ANONYMOUS::triangles[i_][1]],
88 ANONYMOUS::vertices[ANONYMOUS::triangles[i_][2]],
89 mesh_->segments_);
90
91 triangles_ = triangle_mesh_->triangles();
92 }
93 }
94}
95
96icosahedron_mesh_t::vertices_t::vertices_t(const icosahedron_mesh_t& mesh)
97 : mesh_{&mesh}
98 , i_{0}
99 , triangle_mesh_{std::make_shared<triangle_mesh_t>(ANONYMOUS::vertices[ANONYMOUS::triangles[0][0]],
102 mesh_->segments_)}
103 , vertices_{triangle_mesh_->vertices()}
104{
105}
106
108{
109 return i_ == static_cast<int>(ANONYMOUS::triangles.size());
110}
111
113{
114 if(done())
115 throw std::out_of_range("Done!");
116
117 mesh_vertex_t vertex = vertices_.generate();
118
119 vertex.position *= mesh_->radius_;
120
121 return vertex;
122}
123
125{
126 if(done())
127 throw std::out_of_range("Done!");
128
129 vertices_.next();
130
131 if(vertices_.done())
132 {
133 ++i_;
134
135 if(!done())
136 {
137 triangle_mesh_ = std::make_shared<triangle_mesh_t>(ANONYMOUS::vertices[ANONYMOUS::triangles[i_][0]],
138 ANONYMOUS::vertices[ANONYMOUS::triangles[i_][1]],
139 ANONYMOUS::vertices[ANONYMOUS::triangles[i_][2]],
140 mesh_->segments_);
141
142 vertices_ = triangle_mesh_->vertices();
143 }
144 }
145}
146
148 : radius_{radius}
149 , segments_{segments}
150 , face_vertex_count_{count(triangle_mesh_t{1.0, segments}.vertices())}
151{
152}
153
158
160{
161 return vertices_t{*this};
162}
entt::handle a
vertices_t vertices() const noexcept
icosahedron_mesh_t(double radius=1.0, int segments=1)
triangles_t triangles() const 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
float y
float x