41 vertices.resize(other.vertices.size());
42 edges.resize(other.edges.size());
43 faces.resize(other.faces.size());
46 for (std::size_t i = 0; i < vertices.size(); ++i)
47 vertices[i] =
new vertex();
50 for (std::size_t i = 0; i < edges.size(); ++i)
52 edges[i] =
new edge();
53 edges[i]->symmetric =
new edge();
54 edges[i]->symmetric->symmetric = edges[i];
58 for (std::size_t i = 0; i < faces.size(); ++i)
59 faces[i] =
new face();
62 for (std::size_t i = 0; i < vertices.size(); ++i)
65 const vertex* vb = other.vertices[i];
80 for (std::size_t i = 0; i < edges.size(); ++i)
83 const edge* eb = other.edges[i];
85 for (std::size_t j = 0; j < 2; ++j)
108 for (std::size_t i = 0; i < faces.size(); ++i)
111 const face* fb = other.faces[i];
154 vertices.push_back(
vertex);
164 ab->
index = edges.size();
171 ba->
index = edges.size();
216 throw std::runtime_error(
"Empty edge loop");
220 for (std::size_t i = 0; i <
loop.size(); ++i)
228 throw std::runtime_error(
"Disconnected edge loop");
234 throw std::runtime_error(
"Non-manifold mesh 1");
239 for (std::size_t i = 0; i <
loop.size(); ++i)
241 if (!make_adjacent(
loop[i],
loop[(i + 1) %
loop.size()]))
243 throw std::runtime_error(
"Non-manifold mesh 2");
253 faces.push_back(
face);
276 for (std::size_t i =
face->
index + 1; i < faces.size(); ++i)
282 faces.erase(faces.begin() +
face->
index);
307 a->edge = (a_out == ab) ?
nullptr : a_out;
309 b->edge = (b_out == ba) ?
nullptr : b_out;
316 for (std::size_t i =
edge->
index + 1; i < edges.size(); ++i)
319 --edges[i]->symmetric->index;
323 edges.erase(edges.begin() +
edge->
index);
350 while (current != next);
354 for (std::size_t i =
vertex->
index + 1; i < vertices.size(); ++i)
356 --vertices[i]->index;
380 while (current != begin);
385 mesh::edge* mesh::find_free_incident(mesh::edge* start_edge, mesh::edge* end_edge)
const
387 if (start_edge == end_edge)
392 mesh::edge* current = start_edge;
402 while (current != end_edge);
407 bool mesh::make_adjacent(mesh::edge* in, mesh::edge* out)
414 mesh::edge*
b = in->next;
415 mesh::edge*
d = out->previous;
416 mesh::edge*
g = find_free_incident(out->symmetric, in);
422 mesh::edge*
h =
g->next;
void remove_vertex(mesh::vertex *vertex)
Removes a vertex, all dependent edges, and all dependent faces from the mesh.
mesh & operator=(const mesh &other)
Copies another mesh into this mesh.
void remove_face(mesh::face *face)
Removes a face from the mesh.
mesh::face * add_face(const loop &loop)
Adds a face to the mesh.
~mesh() noexcept
Destructs a mesh.
mesh::vertex * add_vertex(const float3 &position)
Adds a vertex to the mesh.
void clear() noexcept
Removes all vertices, edges, and faces from the mesh.
std::vector< edge * > loop
List of edges which form a face.
constexpr mesh() noexcept=default
Constructs a mesh.
mesh::edge * add_edge(mesh::vertex *a, mesh::vertex *b)
Adds two half edges to the mesh.
void remove_edge(mesh::edge *edge)
Removes an edge and all dependent faces from the mesh.
constexpr math::vector2< T > b
@ position
Vertex position (vec3)
Half-edge mesh edge, containing its index and pointers to its starting vertex, parent face,...
mesh::face * face
Pointer to the face on the left of this edge.
std::size_t index
Index of this edge.
mesh::edge * next
Pointer to the next edge in the parent face.
mesh::vertex * vertex
Pointer to the vertex at which the edge starts.
mesh::edge * symmetric
Pointer to the symmetric edge.
mesh::edge * previous
Pointer to the previous edge in the parent face.
Half-edge mesh face, containing its index and a pointer to its first edge.
mesh::edge * edge
Pointer to the first edge in this face.
std::size_t index
Index of this face.
Half-edge mesh vertex, containing its index, a pointer to its parent edge, and its position vector.
float3 position
Vertex position.
mesh::edge * edge
Pointer to the edge to which this vertex belongs.
std::size_t index
Index of this vertex.