1#ifndef GENERATOR_SUBDIVIDEMESH_HPP
2#define GENERATOR_SUBDIVIDEMESH_HPP
15template<
typename mesh_t,
int Iterations>
18 static_assert(Iterations > 0,
"Iterations must be greater than zero!");
33 return subdivide_mesh_.triangles();
40 return subdivide_mesh_.vertices();
44template<
typename mesh_t>
48 using impl_t = mesh_t;
60 return mesh_.triangles();
67 return mesh_.vertices();
72template<
typename mesh_t>
81 return triangles_.done();
87 triangle_ = triangles_.generate();
91 return triangle_t{{vertexFromEdge(triangle_.vertices[0], triangle_.vertices[1]),
92 vertexFromEdge(triangle_.vertices[1], triangle_.vertices[2]),
93 vertexFromEdge(triangle_.vertices[2], triangle_.vertices[0])}};
99 vertexFromEdge(triangle_.vertices[i_], triangle_.vertices[j]),
100 vertexFromEdge(triangle_.vertices[k], triangle_.vertices[i_])}};
125 , triangles_{mesh.mesh_.triangles()}
130 int vertexFromEdge(
int a,
int b)
const
134 return static_cast<int>(mesh_->vertex_cache_.size()) + mesh_->edge_map_.at({
a,
b});
145 return vertex_index_ == mesh_->vertex_cache_.size() && edge_index_ == mesh_->edge_cache_.size();
150 if(vertex_index_ < mesh_->vertex_cache_.size())
151 return mesh_->vertex_cache_[vertex_index_];
165 if(vertex_index_ < mesh_->vertex_cache_.size())
188 vertex_cache_.push_back(vertex);
193 for(int i = 0; i < 3; ++i)
197 edge_t e{{triangle.vertices[i], triangle.vertices[j]}};
198 if(e.vertices[0] > e.vertices[1])
199 std::swap(e.vertices[0], e.vertices[1]);
201 if(edge_map_.find(e.vertices) == edge_map_.end())
203 edge_map_[e.vertices] = static_cast<int>(edge_cache_.size());
204 edge_cache_.push_back(e);
223 std::vector<edge_t> edge_cache_;
225 std::map<gml::ivec2, int> edge_map_;
227 std::vector<mesh_vertex_t> vertex_cache_;
gml::dvec2 tex_coord
UV texture coordinates.
gml::dvec3 normal
Unit vector perpendicular to the surface.
typename impl_t::triangles_t triangles_t
vertices_t vertices() const noexcept
subdivide_mesh_t(mesh_t mesh)
triangles_t triangles() const noexcept
typename impl_t::vertices_t vertices_t
bool done() const noexcept
triangle_t generate() const
mesh_vertex_t generate() const
bool done() const noexcept
triangles_t triangles() const noexcept
subdivide_mesh_t(mesh_t mesh)
vertices_t vertices() const noexcept
typename impl_t::vertices_t vertices_t
vertices_t vertices() const noexcept
typename impl_t::triangles_t triangles_t
subdivide_mesh_t(mesh_t mesh)
triangles_t triangles() const noexcept
Hash specialization for batch_key to enable use in std::unordered_map.