45 m_vertices.m_elements.resize(other.m_vertices.m_elements.
size());
46 m_edges.m_elements.resize(other.m_edges.m_elements.
size());
47 m_loops.m_elements.resize(other.m_loops.m_elements.
size());
48 m_faces.m_elements.resize(other.m_faces.m_elements.
size());
51 for (std::size_t i = 0; i < m_vertices.m_elements.
size(); ++i)
53 m_vertices.m_elements[i] = std::make_unique<brep_vertex>(*other.m_vertices.m_elements[i]);
55 for (std::size_t i = 0; i < m_edges.m_elements.
size(); ++i)
57 m_edges.m_elements[i] = std::make_unique<brep_edge>(*other.m_edges.m_elements[i]);
59 for (std::size_t i = 0; i < m_loops.m_elements.
size(); ++i)
61 m_loops.m_elements[i] = std::make_unique<brep_loop>(*other.m_loops.m_elements[i]);
63 for (std::size_t i = 0; i < m_faces.m_elements.
size(); ++i)
65 m_faces.m_elements[i] = std::make_unique<brep_face>(*other.m_faces.m_elements[i]);
69 m_vertices.m_attribute_map = other.m_vertices.m_attribute_map;
70 m_edges.m_attribute_map = other.m_edges.m_attribute_map;
71 m_loops.m_attribute_map = other.m_loops.m_attribute_map;
72 m_faces.m_attribute_map = other.m_faces.m_attribute_map;
75 for (
const auto& vertex: m_vertices.m_elements)
77 if (!vertex->edges().empty())
79 vertex->m_edges.m_head = m_edges.m_elements[vertex->m_edges.m_head->m_index].get();
82 for (
const auto& edge: m_edges.m_elements)
84 edge->m_vertices[0] = m_vertices.m_elements[edge->m_vertices[0]->m_index].get();
85 edge->m_vertices[1] = m_vertices.m_elements[edge->m_vertices[1]->m_index].get();
86 edge->m_vertex_next[0] = m_edges.m_elements[edge->m_vertex_next[0]->m_index].get();
87 edge->m_vertex_next[1] = m_edges.m_elements[edge->m_vertex_next[1]->m_index].get();
88 edge->m_vertex_previous[0] = m_edges.m_elements[edge->m_vertex_previous[0]->m_index].get();
89 edge->m_vertex_previous[1] = m_edges.m_elements[edge->m_vertex_previous[1]->m_index].get();
91 if (!edge->loops().empty())
93 edge->m_loops.m_head = m_loops.m_elements[edge->m_loops.m_head->m_index].get();
96 for (
const auto& loop: m_loops.m_elements)
98 loop->m_vertex = m_vertices.m_elements[loop->m_vertex->m_index].get();
99 loop->m_edge = m_edges.m_elements[loop->m_edge->m_index].get();
100 loop->m_face = m_faces.m_elements[loop->m_face->m_index].get();
101 loop->m_edge_next = m_loops.m_elements[loop->m_edge_next->m_index].get();
102 loop->m_edge_previous = m_loops.m_elements[loop->m_edge_previous->m_index].get();
103 loop->m_face_next = m_loops.m_elements[loop->m_face_next->m_index].get();
104 loop->m_face_previous = m_loops.m_elements[loop->m_face_previous->m_index].get();
106 for (
const auto& face: m_faces.m_elements)
108 face->m_loops.m_head = m_loops.m_elements[face->m_loops.m_head->m_index].get();
133 std::uint32_t vertex_count = 0;
134 std::uint32_t edge_count = 0;
135 std::uint32_t face_count = 0;
136 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(&vertex_count), 1);
137 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(&edge_count), 1);
138 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(&face_count), 1);
141 for (std::size_t i = 0; i < vertex_count; ++i)
143 mesh.vertices().emplace_back();
147 std::vector<std::array<std::uint32_t, 2>> edges(edge_count);
148 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(edges.data()), edge_count * 2);
151 for (
const auto&
e: edges)
153 mesh.edges().emplace_back(mesh.vertices()[
e[0]], mesh.vertices()[
e[1]]);
158 std::vector<std::array<std::uint32_t, 3>> faces(face_count);
159 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(faces.data()), face_count * 3);
162 for (
const auto& f: faces)
164 geom::brep_vertex* vertices[3] = {mesh.vertices()[f[0]], mesh.vertices()[f[1]], mesh.vertices()[f[2]]};
165 mesh.faces().emplace_back(vertices);
173 ctx.
read32<std::endian::little>(
reinterpret_cast<std::byte*
>(vertex_positions.data()), vertex_count * 3);
179 auto resource = std::make_unique<geom::brep_mesh>();
constexpr std::size_t size() const noexcept
Returns the number of elements in the container.
Boundary representation (B-rep) of a mesh.
void clear() noexcept
Erases all vertices, edges, loops, and faces.
brep_mesh() noexcept
Constructs an empty mesh.
brep_mesh & operator=(const brep_mesh &other)
Copies another mesh into this mesh.
void clear() noexcept
Erases all vertices and their dependent edges, loops, and faces.
static std::unique_ptr< T > load(::resource_manager &resource_manager, deserialize_context &ctx)
Loads a resource.
Manages the loading, caching, and saving of resources.
Provides access to a deserialization state.
std::size_t read32(std::byte *data, std::size_t count) noexcept(false)
Reads 32-bit (double word) data.
Specializations of deserializer define the deserialization process for a given type.
void deserialize(T &value, deserialize_context &ctx)
Deserializes a value.