17bool convex_polygon_mesh_t::triangles_t::done() const noexcept
19 return mesh_->segments_ == 0 || mesh_->vertices_.size() < 3 || ring_index_ == mesh_->rings_;
22triangle_t convex_polygon_mesh_t::triangles_t::generate()
const
25 throw std::runtime_error(
"Done!");
29 const int verticesPerRing = mesh_->segments_ * int(mesh_->vertices_.size());
30 const int delta = ring_index_ * verticesPerRing + 1;
32 const int n1 = side_index_ * mesh_->segments_ + segment_index_;
33 const int n2 = (n1 + 1) % verticesPerRing;
35 if(ring_index_ == mesh_->rings_ - 1)
37 triangle.vertices[0] = 0;
38 triangle.vertices[1] = n1 + delta;
39 triangle.vertices[2] = n2 + delta;
45 triangle.vertices[0] = n1 + delta;
46 triangle.vertices[1] = n2 + delta;
47 triangle.vertices[2] = n1 + verticesPerRing + delta;
51 triangle.vertices[0] = n2 + delta;
52 triangle.vertices[1] = n2 + verticesPerRing + delta;
53 triangle.vertices[2] = n1 + verticesPerRing + delta;
60void convex_polygon_mesh_t::triangles_t::next()
63 throw std::runtime_error(
"Done!");
65 if(ring_index_ == mesh_->rings_ - 1)
69 if(segment_index_ == mesh_->segments_)
75 if(side_index_ ==
static_cast<int>(mesh_->vertices_.size()))
89 if(segment_index_ == mesh_->segments_)
95 if(side_index_ ==
static_cast<int>(mesh_->vertices_.size()))
109 , center_done_{
false}
116bool convex_polygon_mesh_t::vertices_t::done() const noexcept
118 return mesh_->segments_ == 0 || mesh_->rings_ == 0 || mesh_->vertices_.size() < 3 || ring_index_ == mesh_->rings_;
121mesh_vertex_t convex_polygon_mesh_t::vertices_t::generate()
const
124 throw std::runtime_error(
"Done!");
130 const double ringDelta =
static_cast<double>(ring_index_) / mesh_->rings_;
131 const double segmentDelta =
static_cast<double>(segment_index_) / mesh_->segments_;
133 const int nextSide = (side_index_ + 1) % mesh_->vertices_.size();
134 const gml::dvec3
a = gml::mix(mesh_->vertices_.at(side_index_), mesh_->center_, ringDelta);
135 const gml::dvec3
b = gml::mix(mesh_->vertices_.at(nextSide), mesh_->center_, ringDelta);
137 vertex.position = gml::mix(
a,
b, segmentDelta);
141 vertex.position = mesh_->center_;
144 vertex.
normal = mesh_->normal_;
146 const gml::dvec3 delta = vertex.position - mesh_->center_;
148 vertex.tex_coord[0] = gml::dot(mesh_->tangent_, delta);
149 vertex.tex_coord[1] = gml::dot(mesh_->bitangent_, delta);
151 vertex.tex_coord -= mesh_->tex_delta_;
156void convex_polygon_mesh_t::vertices_t::next()
159 throw std::runtime_error(
"Done!");
169 if(segment_index_ == mesh_->segments_)
175 if(side_index_ ==
static_cast<int>(mesh_->vertices_.size()))
188std::vector<gml::dvec3> makevertices_t(
double radius,
int sides)
noexcept
190 std::vector<gml::dvec3> result{};
193 for(
const auto& v : circle.vertices())
195 result.push_back(gml::dvec3{
v.position[0],
v.position[1], 0.0});
202std::vector<gml::dvec3> convertvertices_t(
const std::vector<gml::dvec2>&
vertices)
noexcept
204 std::vector<gml::dvec3> result(
vertices.size());
206 for(std::size_t i = 0;
i <
vertices.size(); ++
i)
214gml::dvec3 calcCenter(
const std::vector<gml::dvec3>&
vertices)
noexcept
221 return result /
static_cast<double>(
vertices.size());
224gml::dvec3 calcNormal(
const gml::dvec3& center,
const std::vector<gml::dvec3>&
vertices)
227 for(
int i = 0; i < static_cast<int>(
vertices.size()); ++
i)
231 return gml::normalize(
normal);
249 , center_{calcCenter(vertices_)}
250 , normal_{calcNormal(center_, vertices_)}
255 if(vertices_.size() > 0)
257 tangent_ = gml::normalize(vertices_.at(0) - center_);
262 for(
const gml::dvec3& vertex : vertices_)
264 gml::dvec3 delta = vertex - center_;
266 gml::dvec2 uv{gml::dot(tangent_, delta), gml::dot(bitangent_, delta)};
268 tex_delta_ = gml::min(tex_delta_, uv);
269 texMax = gml::max(texMax, uv);
272 gml::dvec2
size = texMax - tex_delta_;
275 bitangent_ /=
size[1];
283 return triangles_t{*
this};
288 return vertices_t{*
this};
vertices_t vertices() const noexcept
convex_polygon_mesh_t(double radius=1.0, int sides=5, int segments=4, int rings=4) noexcept
triangles_t triangles() const noexcept
gml::dvec3 normal
Unit vector perpendicular to the surface.
glm::tvec3< T > normal(const glm::tvec3< T > &p1, const glm::tvec3< T > &p2, const glm::tvec3< T > &p3)
glm::tvec2< T > cross(const glm::tvec2< T > &v)
const segment_list * segments