14#include <lagrange/AttributeFwd.h>
15#include <lagrange/utils/SharedSpan.h>
16#include <lagrange/utils/function_ref.h>
17#include <lagrange/utils/span.h>
18#include <lagrange/utils/value_ptr.h>
20#include <initializer_list>
64template <
typename Scalar_,
typename Index_>
79 std::is_same_v<Scalar, float> || std::is_same_v<Scalar, double>,
80 "SurfaceMesh's Scalar template parameter can only be float or double.");
82 std::is_same_v<Index, uint32_t> || std::is_same_v<Index, uint64_t>,
83 "SurfaceMesh's Index template parameter can only be uint32_t or uint64_t.");
207 template <
typename OtherScalar,
typename OtherIndex>
228 template <
typename OtherScalar,
typename OtherIndex>
356 void add_quads(
Index num_facets, std::initializer_list<const Index> facet_indices);
385 void add_polygon(std::initializer_list<const Index> facet_indices);
430 std::initializer_list<const Index> facet_indices);
475 std::initializer_list<const Index> facet_sizes,
476 std::initializer_list<const Index> facet_indices);
566 void flip_facets(std::initializer_list<const Index> facets_to_flip);
859 template <
typename ValueType>
861 std::string_view name,
863 size_t num_channels = 1,
904 template <
typename ValueType>
906 std::string_view name,
909 size_t num_channels = 1,
932 template <
typename OtherScalar,
typename OtherIndex>
934 std::string_view name,
936 std::string_view source_name = {});
961 template <
typename ValueType>
963 std::string_view name,
976 template <
typename ValueType>
978 std::string_view name,
1007 template <
typename ValueType>
1009 std::string_view name,
1012 size_t num_channels,
1022 template <
typename ValueType>
1024 std::string_view name,
1027 size_t num_channels,
1056 template <
typename ValueType>
1058 std::string_view name,
1061 size_t num_channels,
1073 template <
typename ValueType>
1075 std::string_view name,
1078 size_t num_channels,
1089 template <
typename ValueType>
1091 std::string_view name,
1094 size_t num_channels,
1105 template <
typename ValueType>
1107 std::string_view name,
1110 size_t num_channels,
1141 template <
typename ValueType>
1143 std::string_view name,
1146 size_t num_channels,
1158 template <
typename ValueType>
1160 std::string_view name,
1163 size_t num_channels,
1174 template <
typename ValueType>
1176 std::string_view name,
1179 size_t num_channels,
1190 template <
typename ValueType>
1192 std::string_view name,
1195 size_t num_channels,
1250 Index num_vertices);
1306 Index vertex_per_facet);
1464 std::string_view name,
1495 template <
typename ValueType>
1497 std::string_view name,
1518 template <
typename ValueType>
1520 std::string_view name,
1540 template <
typename ValueType>
1542 std::string_view name,
1544 -> std::shared_ptr<IndexedAttribute<ValueType, Index>>;
1562 template <
typename ValueType>
1564 std::string_view name,
1566 -> std::shared_ptr<const IndexedAttribute<ValueType, Index>>;
1650 template <
typename ValueType>
1662 template <
typename ValueType>
1756 template <
typename ValueType>
1768 template <
typename ValueType>
1781 std::string_view name)
const;
1804 template <
typename ValueType>
1817 template <
typename ValueType>
1831 template <
typename ValueType>
1844 template <
typename ValueType>
1857 std::string_view name);
1880 template <
typename ValueType>
1894 template <
typename ValueType>
2047 [[deprecated(
"Use attr_id_vertex_to_position() instead.")]]
AttributeId
2050 return m_reserved_ids.vertex_to_position();
2067 return m_reserved_ids.facet_to_first_corner();
2091 return m_reserved_ids.edge_to_first_corner();
2101 return m_reserved_ids.next_corner_around_edge();
2111 return m_reserved_ids.vertex_to_first_corner();
2121 return m_reserved_ids.next_corner_around_vertex();
2474 template <
typename ValueType>
2476 std::string_view name,
2479 size_t num_channels = 1,
2490 template <
typename ValueType>
2545 template <AttributeElement element>
2633 Index num_user_edges = 0,
2659 Index num_user_edges = 0,
2673 Index num_user_edges = 0,
2696 template <
typename ValueType>
2698 Attribute<std::decay_t<ValueType>>& attr,
2715 template <
typename ValueType>
2717 Attribute<std::decay_t<ValueType>>& attr,
2734 template <
typename OffsetSpan,
typename FacetSpan>
2763 template <
typename ValueSpan,
typename IndexSpan = span<Index>>
2765 std::string_view name,
2769 size_t num_channels,
2771 IndexSpan indices = {});
2777 template <
typename,
typename>
2783 struct AttributeManager;
2810 struct ReservedAttributeIds
2815 static constexpr int size() {
return 9; }
2817 AttributeId& vertex_to_position() {
return items[0]; };
2818 AttributeId& corner_to_vertex() {
return items[1]; };
2819 AttributeId& facet_to_first_corner() {
return items[2]; };
2820 AttributeId& corner_to_facet() {
return items[3]; };
2821 AttributeId& corner_to_edge() {
return items[4]; };
2822 AttributeId& edge_to_first_corner() {
return items[5]; };
2823 AttributeId& next_corner_around_edge() {
return items[6]; };
2824 AttributeId& vertex_to_first_corner() {
return items[7]; };
2825 AttributeId& next_corner_around_vertex() {
return items[8]; };
2827 const AttributeId& vertex_to_position()
const {
return items[0]; };
2828 const AttributeId& corner_to_vertex()
const {
return items[1]; };
2829 const AttributeId& facet_to_first_corner()
const {
return items[2]; };
2830 const AttributeId& corner_to_facet()
const {
return items[3]; };
2831 const AttributeId& corner_to_edge()
const {
return items[4]; };
2832 const AttributeId& edge_to_first_corner()
const {
return items[5]; };
2833 const AttributeId& next_corner_around_edge()
const {
return items[6]; };
2834 const AttributeId& vertex_to_first_corner()
const {
return items[7]; };
2835 const AttributeId& next_corner_around_vertex()
const {
return items[8]; };
2840 static constexpr struct
2842 std::string_view items[9] = {
2843 "$vertex_to_position",
2844 "$corner_to_vertex",
2845 "$facet_to_first_corner",
2848 "$edge_to_first_corner",
2849 "$next_corner_around_edge",
2850 "$vertex_to_first_corner",
2851 "$next_corner_around_vertex",
2853 std::string_view vertex_to_position()
const {
return items[0]; }
2854 std::string_view corner_to_vertex()
const {
return items[1]; }
2855 std::string_view facet_to_first_corner()
const {
return items[2]; }
2856 std::string_view corner_to_facet()
const {
return items[3]; }
2857 std::string_view corner_to_edge()
const {
return items[4]; }
2858 std::string_view edge_to_first_corner()
const {
return items[5]; }
2859 std::string_view next_corner_around_edge()
const {
return items[6]; }
2860 std::string_view vertex_to_first_corner()
const {
return items[7]; }
2861 std::string_view next_corner_around_vertex()
const {
return items[8]; }
Base handle for attributes.
Definition Attribute.h:41
Derived attribute class that stores the actual information.
Definition Attribute.h:153
Derived attribute class that stores the actual information.
Definition IndexedAttribute.h:29
Shared span with ownership tracking.
Definition SharedSpan.h:36
A general purpose polygonal mesh class.
Definition SurfaceMesh.h:66
function_ref< std::array< Index, 2 >(Index e)> GetEdgeVertices
Callback function to get the vertex indices of an edge endpoints in a user-provided ordering of a mes...
Definition SurfaceMesh.h:138
void add_hybrid(span< const Index > facet_sizes, span< const Index > facet_indices={})
Adds multiple polygonal facets of different sizes to the mesh.
Definition SurfaceMesh.cpp:1760
Index find_edge_from_vertices(Index v0, Index v1) const
Retrieve the edge index corresponding to (v0, v1).
Definition SurfaceMesh.cpp:2493
void foreach_edge_around_vertex_with_duplicates(Index v, function_ref< void(Index)> func) const
Applies a function to each edge around a prescribed vertex.
Definition SurfaceMesh.cpp:2725
span< Index > reserve_indices_internal(Index num_facets, Index facet_size)
Reserve index buffer for multiple facets of a given size.
Definition SurfaceMesh.cpp:3138
AttributeId attr_id_vertex_to_position() const
Attribute id for vertex -> positions.
Definition SurfaceMesh.h:2040
void add_quads(Index num_facets, span< const Index > facet_indices={})
Adds multiple quadrilateral facets to the mesh.
Definition SurfaceMesh.cpp:1691
AttributeId wrap_as_const_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, SharedSpan< const ValueType > shared_values, SharedSpan< const Index > shared_indices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:745
Index get_next_corner_around_facet(Index c) const
Gets the next corner around the facet associated to a corner.
Definition SurfaceMesh.cpp:2483
static constexpr std::string_view attr_name_facet_to_first_corner()
Attribute name for facet -> first corner index.
Definition SurfaceMesh.h:1970
AttributeId wrap_as_const_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, SharedSpan< const ValueType > shared_values, span< const Index > indices_view)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:787
void foreach_facet_around_edge(Index e, function_ref< void(Index)> func) const
Applies a function to each facet around a prescribed edge.
Definition SurfaceMesh.cpp:2676
void par_foreach_attribute_id(function_ref< void(AttributeId)> func) const
Iterates over all attribute ids in parallel.
Definition SurfaceMesh.cpp:1262
bool is_quad_mesh() const
Whether the mesh must only contains quadrilateral facets.
Definition SurfaceMesh.cpp:2110
std::string_view get_attribute_name(AttributeId id) const
Retrieve attribute name from its id.
Definition SurfaceMesh.cpp:355
void add_quads(Index num_facets, SetMultiFacetsIndicesFunction set_facets_indices)
Adds multiple quadrilateral facets to the mesh.
Definition SurfaceMesh.cpp:1705
bool is_boundary_edge(Index e) const
Determines whether the specified edge e is a boundary edge.
Definition SurfaceMesh.cpp:2627
Index get_facet_corner_end(Index f) const
Index past the last corner around the facet.
Definition SurfaceMesh.cpp:2163
Attribute< Scalar > & ref_vertex_to_position()
Gets a writable reference to the vertex -> positions attribute.
Definition SurfaceMesh.cpp:1393
void clear_edges()
Clears attributes related to mesh edges and connectivity:
Definition SurfaceMesh.cpp:2436
function_ref< void(Index f, span< Index > t)> SetMultiFacetsIndicesFunction
Callback function to set indices of a multiple facets.
Definition SurfaceMesh.h:118
void set_metadata(std::string_view name, std::string_view value)
Write metadata attribute value.
Definition SurfaceMesh.cpp:1194
void add_vertex(std::initializer_list< const Scalar > p)
Adds a vertex to the mesh.
Definition SurfaceMesh.cpp:1568
void update_edges_range_internal(Index facet_begin, Index facet_end, Index num_user_edges=0, GetEdgeVertices *get_user_edge_ptr=nullptr)
Update attributes associated to mesh edges and connectivity for a specific range of facets.
Definition SurfaceMesh.cpp:2297
static constexpr std::string_view attr_name_next_corner_around_vertex()
Attribute name for corner -> next corner around vertex.
Definition SurfaceMesh.h:2030
static constexpr std::string_view attr_name_vertex_to_position()
Attribute name for vertex -> position.
Definition SurfaceMesh.h:1950
function_ref< Index(Index f)> GetFacetsSizeFunction
Callback function to get a facet size (number of vertices in the facet).
Definition SurfaceMesh.h:128
static constexpr std::string_view attr_name_corner_to_vertex()
Attribute name for corner -> vertex indices.
Definition SurfaceMesh.h:1960
AttributeId attr_id_corner_to_edge() const
Attribute id for corner -> edge indices.
Definition SurfaceMesh.h:2082
static SurfaceMesh stripped_copy(const SurfaceMesh< OtherScalar, OtherIndex > &other)
Copy constructor stripping away non-reserved attributes.
bool is_attribute_type(AttributeId id) const
Checks whether the specified attribute is of a given type.
Definition SurfaceMesh.cpp:1228
void set_attribute_default_internal(std::string_view name)
Set attribute default value for known internal attributes.
Definition SurfaceMesh.cpp:376
void add_polygon(Index facet_size, SetSingleFacetIndicesFunction set_facet_indices)
Adds a single polygonal facet to the mesh.
Definition SurfaceMesh.cpp:1657
const Attribute< ValueType > & get_attribute(std::string_view name) const
Gets a read-only reference to an attribute given its name.
Definition SurfaceMesh.cpp:1290
Index m_num_facets
Definition SurfaceMesh.h:2792
void delete_attribute(std::string_view name, AttributeDeletePolicy policy=AttributeDeletePolicy::ErrorIfReserved)
Delete an attribute given by name.
Definition SurfaceMesh.cpp:1041
Index count_num_corners_around_edge(Index e) const
Count the number of corners incident to a given edge.
Definition SurfaceMesh.cpp:2598
Index get_num_vertices() const
Retrieves the number of vertices.
Definition SurfaceMesh.h:671
void resize_facets_internal(Index num_facets)
Resize the buffers associated to mesh facets and their attributes.
Definition SurfaceMesh.cpp:3117
Attribute< ValueType > & ref_attribute(std::string_view name)
Gets a writable reference to an attribute given its name.
Definition SurfaceMesh.cpp:1340
AttributeId wrap_as_const_attribute(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_channels, SharedSpan< const ValueType > shared_values)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:618
Index get_corner_edge(Index c) const
Gets the edge index corresponding to a corner index.
Definition SurfaceMesh.cpp:2455
AttributeId attr_id_facet_to_first_corner() const
Attribute id for facet -> first corner index.
Definition SurfaceMesh.h:2065
std::shared_ptr< Attribute< ValueType > > delete_and_export_attribute(std::string_view name, AttributeDeletePolicy delete_policy=AttributeDeletePolicy::ErrorIfReserved, AttributeExportPolicy export_policy=AttributeExportPolicy::CopyIfExternal)
Delete an attribute and export its content in a writable shared_ptr.
Definition SurfaceMesh.cpp:1113
std::array< Index, 2 > get_edge_vertices(Index e) const
Retrieve edge endpoints.
Definition SurfaceMesh.cpp:2469
void add_vertices(Index num_vertices, std::initializer_list< const Scalar > coordinates)
Adds multiple vertices to the mesh.
Definition SurfaceMesh.cpp:1591
void add_hybrid(Index num_facets, GetFacetsSizeFunction facet_sizes, SetMultiFacetsIndicesFunction set_facets_indices)
Adds multiple polygonal facets of different sizes to the mesh.
Definition SurfaceMesh.cpp:1787
void remove_vertices(std::initializer_list< const Index > vertices_to_remove)
Removes a list of vertices.
Definition SurfaceMesh.cpp:1851
AttributeId wrap_as_facets(SharedSpan< Index > shared_offsets, Index num_facets, span< Index > facets_view, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:969
Index get_dimension() const
Retrieves the dimension of the mesh vertices.
Definition SurfaceMesh.h:656
void add_quads(Index num_facets, std::initializer_list< const Index > facet_indices)
Adds multiple quadrilateral facets to the mesh.
Definition SurfaceMesh.cpp:1697
AttributeId wrap_as_const_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, span< const ValueType > values_view, SharedSpan< const Index > shared_indices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:766
Index get_edge(Index f, Index lv) const
Gets the edge index corresponding to (f, lv) – (f, lv+1).
Definition SurfaceMesh.cpp:2447
void flip_facets(std::initializer_list< const Index > facets_to_flip)
Reverses the orientation of a list of facets.
Definition SurfaceMesh.cpp:1987
::lagrange::internal::weak_ptr< const AttributeBase > _get_attribute_ptr(AttributeId id) const
Gets a read-only weak pointer to the base attribute object.
Definition SurfaceMesh.cpp:1312
Index m_vertex_per_facet
Definition SurfaceMesh.h:2804
void wrap_as_attribute_internal(Attribute< std::decay_t< ValueType > > &attr, size_t num_values, SharedSpan< ValueType > shared_values)
Wrap a shared span in an attribute.
Definition SurfaceMesh.cpp:3263
Index get_clockwise_corner_around_vertex(Index c) const
Get the adjacent corner around the vertex associated to a corner in the clockwise direction.
Definition SurfaceMesh.cpp:2575
AttributeId create_attribute(std::string_view name, AttributeElement element, size_t num_channels=1, AttributeUsage usage=AttributeUsage::Vector, span< const ValueType > initial_values={}, span< const Index > initial_indices={}, AttributeCreatePolicy policy=AttributeCreatePolicy::ErrorIfReserved)
Create a new attribute and return the newly created attribute id.
Definition SurfaceMesh.cpp:406
static constexpr std::string_view attr_name_corner_to_facet()
Attribute name for corner -> facet index.
Definition SurfaceMesh.h:1980
AttributeId attr_id_corner_to_vertex() const
Attribute id for corner -> vertex indices.
Definition SurfaceMesh.h:2058
bool is_attribute_type(std::string_view name) const
Checks whether the specified attribute is of a given type.
Definition SurfaceMesh.cpp:1221
Index m_num_vertices
Definition SurfaceMesh.h:2789
AttributeId get_attribute_id(std::string_view name) const
Retrieve an attribute id given its name.
Definition SurfaceMesh.cpp:345
void reindex_corners_internal(function_ref< Index(Index)> old_to_new_corners, CornerMappingType mapping_type)
Reindex mesh corners according to the given mapping.
Definition SurfaceMesh.cpp:2938
void add_vertices(Index num_vertices, span< const Scalar > coordinates={})
Adds multiple vertices to the mesh.
Definition SurfaceMesh.cpp:1578
std::make_signed_t< Index > SignedIndex
Signed index type corresponding to the mesh index type.
Definition SurfaceMesh.h:75
Index get_next_corner_around_edge(Index c) const
Gets the next corner around the edge associated to a corner.
Definition SurfaceMesh.cpp:2526
Index get_edge_from_corner(Index c) const
Gets the edge index corresponding to a corner index.
Definition SurfaceMesh.cpp:2463
void add_triangles(Index num_facets, SetMultiFacetsIndicesFunction set_facets_indices)
Adds multiple triangular facets to the mesh.
Definition SurfaceMesh.cpp:1683
AttributeId wrap_as_vertices(SharedSpan< Scalar > shared_vertices, Index num_vertices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:819
span< Index > ref_facet_vertices(Index f)
Retrieves a writable pointer to a facet indices.
Definition SurfaceMesh.cpp:2200
void foreach_facet_around_vertex(Index v, function_ref< void(Index)> func) const
Applies a function to each facet around a prescribed vertex.
Definition SurfaceMesh.cpp:2653
AttributeId create_attribute(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_channels=1, span< const ValueType > initial_values={}, span< const Index > initial_indices={}, AttributeCreatePolicy policy=AttributeCreatePolicy::ErrorIfReserved)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:431
void remove_vertices(span< const Index > vertices_to_remove)
Removes a list of vertices.
Definition SurfaceMesh.cpp:1807
void remove_facets(span< const Index > facets_to_remove)
Removes a list of facets.
Definition SurfaceMesh.cpp:1898
void resize_vertices_internal(Index num_vertices)
Resize the buffers associated to mesh vertices and their attributes.
Definition SurfaceMesh.cpp:3110
bool has_attribute(std::string_view name) const
Checks if an attribute of a given name is attached to the mesh.
Definition SurfaceMesh.cpp:1214
const Attribute< ValueType > & get_attribute(AttributeId id) const
Gets a read-only reference to an attribute given its id.
Definition SurfaceMesh.cpp:1297
AttributeId wrap_as_const_facets(SharedSpan< const Index > shared_offsets, Index num_facets, span< const Index > facets_view, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:1009
AttributeId wrap_as_facets(span< Index > offsets_view, Index num_facets, span< Index > facets_view, Index num_corners)
Wraps writable external buffers as mesh facets for a hybrid mesh.
Definition SurfaceMesh.cpp:939
AttributeId wrap_as_const_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, span< const ValueType > values_view, span< const Index > indices_view)
Wraps a read-only external buffer as a mesh attribute.
Definition SurfaceMesh.cpp:724
std::shared_ptr< const Attribute< ValueType > > delete_and_export_const_attribute(std::string_view name, AttributeDeletePolicy delete_policy=AttributeDeletePolicy::ErrorIfReserved, AttributeExportPolicy export_policy=AttributeExportPolicy::CopyIfExternal)
Delete an attribute and export its content in a read-only shared_ptr.
Definition SurfaceMesh.cpp:1129
void flip_facets(function_ref< bool(Index)> should_flip_func)
Reverses the orientation of a list of facets.
Definition SurfaceMesh.cpp:1993
std::string_view get_metadata(AttributeId id) const
Read metadata attribute value.
Definition SurfaceMesh.cpp:1200
AttributeId create_metadata(std::string_view name, std::string_view value)
Create a metadata attribute.
Definition SurfaceMesh.cpp:1173
Index count_num_corners_around_vertex(Index v) const
Count the number of corners incident to a given vertex.
Definition SurfaceMesh.cpp:2544
AttributeId wrap_as_const_facets(span< const Index > offsets_view, Index num_facets, span< const Index > facets_view, Index num_corners)
Wraps read-only external buffers as mesh facets for a hybrid mesh.
Definition SurfaceMesh.cpp:979
bool is_attribute_indexed(AttributeId id) const
Determines whether the specified attribute is indexed.
Definition SurfaceMesh.cpp:1241
value_ptr< AttributeManager > m_attributes
Definition SurfaceMesh.h:2807
AttributeId wrap_as_facets(SharedSpan< Index > shared_facets, Index num_facets, Index vertex_per_facet)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:876
void add_quad(Index v0, Index v1, Index v2, Index v3)
Adds a quadrilateral facet to the mesh.
Definition SurfaceMesh.cpp:1622
void add_polygon(Index facet_size)
Adds a single (uninitialized) polygonal facet to the mesh.
Definition SurfaceMesh.cpp:1631
auto ref_indexed_attribute(AttributeId id) -> IndexedAttribute< ValueType, Index > &
Gets a writable reference to an indexed attribute given its id.
Definition SurfaceMesh.cpp:1378
AttributeId wrap_as_facets_internal(OffsetSpan offsets, Index num_facets, FacetSpan facets, Index num_corners)
Wrap shared spans as offsets and facets.
Definition SurfaceMesh.cpp:3291
void shrink_to_fit()
Shrink buffer capacities to fit current mesh attributes, deallocating any extra capacity.
Definition SurfaceMesh.cpp:2057
AttributeId attr_id_vertex_to_positions() const
Attribute id for vertex -> positions.
Definition SurfaceMesh.h:2048
void clear_facets()
Clear buffer for mesh facets and other facet/corner attributes.
Definition SurfaceMesh.cpp:2044
Index get_one_corner_around_vertex(Index v) const
Get the index of one corner around a given vertex.
Definition SurfaceMesh.cpp:2621
SurfaceMesh & operator=(const SurfaceMesh &other)
Assignment copy operator.
Index get_facet_corner_begin(Index f) const
First corner around the facet.
Definition SurfaceMesh.cpp:2151
::lagrange::internal::weak_ptr< AttributeBase > _ref_attribute_ptr(AttributeId id)
Gets a weak pointer to the base attribute object.
Definition SurfaceMesh.cpp:1362
void add_vertex(span< const Scalar > p)
Adds a vertex to the mesh.
Definition SurfaceMesh.cpp:1558
SurfaceMesh(Index dimension=3)
Default constructor.
Definition SurfaceMesh.cpp:1430
size_t get_num_elements_internal(AttributeElement element) const
Gets the number of mesh elements, based on an element type.
Definition SurfaceMesh.cpp:361
AttributeId create_attribute_from(std::string_view name, const SurfaceMesh< OtherScalar, OtherIndex > &source_mesh, std::string_view source_name={})
Creates an new attribute by creating a shallow copy of another mesh's attribute.
Definition SurfaceMesh.cpp:532
AttributeId attr_id_vertex_to_first_corner() const
Attribute id for vertex -> first corner index.
Definition SurfaceMesh.h:2109
void add_polygons(Index num_facets, Index facet_size, std::initializer_list< const Index > facet_indices)
Adds multiple polygonal facets of the same size to the mesh.
Definition SurfaceMesh.cpp:1733
AttributeId wrap_as_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, SharedSpan< ValueType > shared_values, SharedSpan< Index > shared_indices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:661
Scalar_ Scalar
Mesh scalar type, used for vertex coordinates.
Definition SurfaceMesh.h:69
::lagrange::internal::weak_ptr< AttributeBase > _ref_attribute_ptr(std::string_view name)
Gets a weak pointer to the base attribute object.
Definition SurfaceMesh.cpp:1355
const AttributeBase & get_attribute_base(std::string_view name) const
Gets a read-only reference to the base class of attribute given its name.
Definition SurfaceMesh.cpp:1276
void resize_corners_internal(Index num_corners)
Resize the buffers associated to mesh corners and their attributes.
Definition SurfaceMesh.cpp:3124
void foreach_facet_around_facet(Index f, function_ref< void(Index)> func) const
Applies a function to each of the facets around a prescribed facet.
Definition SurfaceMesh.cpp:2635
void add_triangle(Index v0, Index v1, Index v2)
Adds a triangular facet to the mesh.
Definition SurfaceMesh.cpp:1613
Index_ Index
Mesh index type, used for facet indices.
Definition SurfaceMesh.h:72
void add_hybrid(std::initializer_list< const Index > facet_sizes, std::initializer_list< const Index > facet_indices)
Adds multiple polygonal facets of different sizes to the mesh.
Definition SurfaceMesh.cpp:1777
span< Index > reserve_indices_internal(Index num_facets, GetFacetsSizeFunction get_facets_size)
Reserve index buffer for multiple facets of a given size.
Definition SurfaceMesh.cpp:3167
Index get_one_facet_around_edge(Index e) const
Get the index of one facet around a given edge.
Definition SurfaceMesh.cpp:2607
Index get_first_corner_around_edge(Index e) const
Get the index of the first corner around a given edge.
Definition SurfaceMesh.cpp:2520
AttributeId wrap_as_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, SharedSpan< ValueType > shared_values, span< Index > indices_view)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:703
void seq_foreach_attribute_id(function_ref< void(std::string_view, AttributeId)> func) const
Iterates over all pairs of attribute names x ids sequentially.
Definition SurfaceMesh.cpp:1255
void add_triangles(Index num_facets, std::initializer_list< const Index > facet_indices)
Adds multiple triangular facets to the mesh.
Definition SurfaceMesh.cpp:1675
void remove_facets(std::initializer_list< const Index > facets_to_remove)
Removes a list of facets.
Definition SurfaceMesh.cpp:1933
void compute_corner_to_facet_internal(Index facet_begin, Index facet_end)
Compute inverse mapping corner -> facet index for a specific range of facets.
Definition SurfaceMesh.cpp:3248
void add_triangles(Index num_facets, span< const Index > facet_indices={})
Adds multiple triangular facets to the mesh.
Definition SurfaceMesh.cpp:1669
void add_polygon(std::initializer_list< const Index > facet_indices)
Adds a single polygonal facet to the mesh.
Definition SurfaceMesh.cpp:1648
void initialize_edges_internal(Index num_user_edges=0, GetEdgeVertices *get_user_edge_ptr=nullptr)
Initializes attributes associated to mesh edges and connectivity.
Definition SurfaceMesh.cpp:2241
auto get_indexed_attribute(std::string_view name) const -> const IndexedAttribute< ValueType, Index > &
Gets a read-only reference to an indexed attribute given its name.
Definition SurfaceMesh.cpp:1322
~SurfaceMesh()
Default destructor.
Attribute< ValueType > & ref_attribute(AttributeId id)
Gets a writable reference to an attribute given its id.
Definition SurfaceMesh.cpp:1347
void resize_elements_internal(Index num_elements)
Resize the buffers associated to a specific element type in the mesh.
Definition SurfaceMesh.cpp:3095
void initialize_edges(Index num_user_edges, GetEdgeVertices get_user_edge)
Initializes attributes associated to mesh edges and connectivity.
Definition SurfaceMesh.cpp:2233
void set_metadata(AttributeId id, std::string_view value)
Write metadata attribute value.
Definition SurfaceMesh.cpp:1184
bool is_regular() const
Whether the mesh must only contains facets of equal sizes.
Definition SurfaceMesh.cpp:2116
AttributeId attr_id_next_corner_around_edge() const
Attribute id for corner -> next corner around edge.
Definition SurfaceMesh.h:2099
AttributeId wrap_as_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, span< ValueType > values_view, SharedSpan< Index > shared_indices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:682
Index get_first_corner_around_vertex(Index v) const
Get the index of the first corner around a given vertex.
Definition SurfaceMesh.cpp:2532
AttributeId wrap_as_facets(span< Index > offsets_view, Index num_facets, SharedSpan< Index > shared_facets, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:959
Index m_num_corners
Definition SurfaceMesh.h:2795
bool is_attribute_indexed(std::string_view name) const
Determines whether the specified attribute is indexed.
Definition SurfaceMesh.cpp:1235
const Attribute< Index > & get_corner_to_vertex() const
Gets a read-only reference to the corner -> vertex id attribute.
Definition SurfaceMesh.cpp:1399
std::string_view get_metadata(std::string_view name) const
Read metadata attribute value.
Definition SurfaceMesh.cpp:1208
void update_edges_last_internal(Index count, Index num_user_edges=0, GetEdgeVertices *get_user_edge_ptr=nullptr)
Same as update_edges_range_internal, but operate on the last count facets in the mesh instead.
Definition SurfaceMesh.cpp:2286
void par_foreach_attribute_id(function_ref< void(std::string_view, AttributeId)> func) const
Iterates over all pairs of attribute names x ids in parallel.
Definition SurfaceMesh.cpp:1269
SurfaceMesh & operator=(SurfaceMesh &&other) noexcept
Assignment move operator.
AttributeId wrap_as_const_vertices(span< const Scalar > vertices_view, Index num_vertices)
Wraps a read-only external buffer as mesh vertices coordinates.
Definition SurfaceMesh.cpp:831
Index get_next_corner_around_vertex(Index c) const
Gets the next corner around the vertex associated to a corner.
Definition SurfaceMesh.cpp:2538
Index get_facet_vertex(Index f, Index lv) const
Index of a vertex given from a facet + local index.
Definition SurfaceMesh.h:732
AttributeId wrap_as_const_facets(span< const Index > facets_view, Index num_facets, Index vertex_per_facet)
Wraps a read-only external buffer as mesh facets for a regular mesh.
Definition SurfaceMesh.cpp:897
void compress_if_regular()
Compress mesh storage if the mesh is regular.
Definition SurfaceMesh.cpp:2071
bool is_triangle_mesh() const
Whether the mesh must only contain triangular facets.
Definition SurfaceMesh.cpp:2104
void wrap_as_attribute_internal(Attribute< std::decay_t< ValueType > > &attr, size_t num_values, span< ValueType > values_view)
Wrap a span in an attribute.
Definition SurfaceMesh.cpp:3277
Index get_corner_vertex(Index c) const
Retrieves the index of a vertex given its corner index.
Definition SurfaceMesh.cpp:2177
void foreach_corner_around_vertex(Index v, function_ref< void(Index)> func) const
Applies a function to each corner around a prescribed vertex.
Definition SurfaceMesh.cpp:2698
void resize_edges_internal(Index num_edges)
Resize the buffers associated to mesh edges and their attributes.
Definition SurfaceMesh.cpp:3131
void flip_facets(span< const Index > facets_to_flip)
Reverses the orientation of a list of facets.
Definition SurfaceMesh.cpp:1972
Index get_corner_facet(Index c) const
Retrieves the index of a facet given its corner index.
Definition SurfaceMesh.cpp:2183
bool has_edges() const
Determines if the attributes associated to mesh edges and connectivity have been initialized.
Definition SurfaceMesh.h:2171
AttributeId wrap_as_const_facets(span< const Index > offsets_view, Index num_facets, SharedSpan< const Index > shared_facets, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:999
SurfaceMesh(SurfaceMesh &&other) noexcept
Move constructor.
void add_vertices(Index num_vertices, SetVertexCoordinatesFunction set_vertex_coordinates)
Adds multiple vertices to the mesh.
Definition SurfaceMesh.cpp:1599
std::pair< Index, Index > reindex_facets_internal(span< const Index > old_to_new)
Reindex mesh facets according to the given mapping.
Definition SurfaceMesh.cpp:2829
auto delete_and_export_indexed_attribute(std::string_view name, AttributeExportPolicy policy=AttributeExportPolicy::CopyIfExternal) -> std::shared_ptr< IndexedAttribute< ValueType, Index > >
Delete an indexed attribute and export its content in a writable shared_ptr.
Definition SurfaceMesh.cpp:1144
span< const Index > get_facet_vertices(Index f) const
Retrieves a read-only pointer to a facet indices.
Definition SurfaceMesh.cpp:2194
static constexpr std::string_view attr_name_edge_to_first_corner()
Attribute name for edge -> first corner index.
Definition SurfaceMesh.h:2000
auto ref_indexed_attribute(std::string_view name) -> IndexedAttribute< ValueType, Index > &
Gets a writable reference to an indexed attribute given its name.
Definition SurfaceMesh.cpp:1370
AttributeId wrap_as_const_attribute(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_channels, span< const ValueType > values_view)
Wraps a read-only external buffer as a mesh attribute.
Definition SurfaceMesh.cpp:596
bool is_hybrid() const
Whether the mesh may contain facets of different sizes.
Definition SurfaceMesh.h:649
AttributeId wrap_as_attribute(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_channels, SharedSpan< ValueType > shared_values)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:574
Index get_num_edges() const
Retrieves the number of edges.
Definition SurfaceMesh.h:692
AttributeId create_attribute_internal(std::string_view name, AttributeElement element, AttributeUsage usage=AttributeUsage::Vector, size_t num_channels=1, span< const ValueType > initial_values={}, span< const Index > initial_indices={})
Same as create_attribute, but allows creation of reserved attributes.
Definition SurfaceMesh.cpp:452
AttributeId wrap_as_vertices(span< Scalar > vertices_view, Index num_vertices)
Wraps a writable external buffer as mesh vertices coordinates.
Definition SurfaceMesh.cpp:807
AttributeId wrap_as_facets(SharedSpan< Index > shared_offsets, Index num_facets, SharedSpan< Index > shared_facets, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:949
Index get_one_corner_around_edge(Index e) const
Get the index of one corner around a given edge.
Definition SurfaceMesh.cpp:2615
static constexpr struct lagrange::SurfaceMesh::@325255152247021150212276167153340070021334233120 s_reserved_names
Index get_num_facets() const
Retrieves the number of facets.
Definition SurfaceMesh.h:678
Index get_vertex_per_facet() const
Retrieves the number of vertex per facet in a regular mesh.
Definition SurfaceMesh.cpp:2130
AttributeId wrap_as_const_facets(SharedSpan< const Index > shared_offsets, Index num_facets, SharedSpan< const Index > shared_facets, Index num_corners)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:989
SurfaceMesh(const SurfaceMesh &other)
Copy constructor.
span< Scalar > ref_position(Index v)
Retrieves a writeable pointer to a vertex coordinates.
Definition SurfaceMesh.cpp:2145
AttributeId attr_id_edge_to_first_corner() const
Attribute id for edge -> first corner index.
Definition SurfaceMesh.h:2089
AttributeId wrap_as_indexed_attribute(std::string_view name, AttributeUsage usage, size_t num_values, size_t num_channels, span< ValueType > values_view, span< Index > indices_view)
Wraps a writable external buffer as a mesh attribute.
Definition SurfaceMesh.cpp:640
AttributeId duplicate_attribute(std::string_view old_name, std::string_view new_name)
Duplicates an attribute.
Definition SurfaceMesh.cpp:1019
static constexpr std::string_view attr_name_vertex_to_first_corner()
Attribute name for vertex -> first corner index.
Definition SurfaceMesh.h:2020
void delete_attribute(AttributeId id, AttributeDeletePolicy policy=AttributeDeletePolicy::ErrorIfReserved)
Delete an attribute given by its id.
Definition SurfaceMesh.cpp:1078
void remove_vertices(function_ref< bool(Index)> should_remove_func)
Removes a list of vertices, defined by a predicate function.
Definition SurfaceMesh.cpp:1858
AttributeId wrap_as_attribute_internal(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_values, size_t num_channels, ValueSpan values, IndexSpan indices={})
The most generic way of creating an attribute wrapped around external buffers.
Definition SurfaceMesh.cpp:3340
AttributeId attr_id_next_corner_around_vertex() const
Attribute id for corner -> next corner around vertex.
Definition SurfaceMesh.h:2119
Index m_dimension
Definition SurfaceMesh.h:2801
void initialize_edges(span< const Index > edges={})
Initializes attributes associated to mesh edges and connectivity.
Definition SurfaceMesh.cpp:2210
function_ref< void(Index v, span< Scalar > p)> SetVertexCoordinatesFunction
Callback function to set vertex coordinates.
Definition SurfaceMesh.h:96
static constexpr std::string_view attr_name_corner_to_edge()
Attribute name for corner -> edge indices.
Definition SurfaceMesh.h:1990
Attribute< Index > & ref_corner_to_vertex()
Gets a writable reference to the corner -> vertex id attribute.
Definition SurfaceMesh.cpp:1405
AttributeId wrap_as_attribute(std::string_view name, AttributeElement element, AttributeUsage usage, size_t num_channels, span< ValueType > values_view)
Wraps a writable external buffer as a mesh attribute.
Definition SurfaceMesh.cpp:552
Index get_counterclockwise_corner_around_vertex(Index c) const
Get the adjacent corner around the vertex associated to a corner in the counterclockwise direction.
Definition SurfaceMesh.cpp:2553
const AttributeBase & get_attribute_base(AttributeId id) const
Gets a read-only reference to an attribute given its id.
Definition SurfaceMesh.cpp:1282
void add_polygons(Index num_facets, Index facet_size, SetMultiFacetsIndicesFunction set_facets_indices)
Adds multiple polygonal facets of the same size to the mesh.
Definition SurfaceMesh.cpp:1745
AttributeId attr_id_corner_to_facet() const
Attribute id for corner -> facet index.
Definition SurfaceMesh.h:2075
void add_polygon(span< const Index > facet_indices)
Adds a single polygonal facet to the mesh.
Definition SurfaceMesh.cpp:1639
static SurfaceMesh stripped_move(SurfaceMesh< OtherScalar, OtherIndex > &&other)
Move constructor stripping away non-reserved attributes.
AttributeId wrap_as_facets(span< Index > facets_view, Index num_facets, Index vertex_per_facet)
Wraps a writable external buffer as mesh facets for a regular mesh.
Definition SurfaceMesh.cpp:855
void reindex_vertices_internal(span< const Index > old_to_new)
Reindex mesh vertices according to the given mapping.
Definition SurfaceMesh.cpp:2804
void foreach_corner_around_edge(Index e, function_ref< void(Index)> func) const
Applies a function to each corner around a prescribed edge.
Definition SurfaceMesh.cpp:2712
void rename_attribute(std::string_view old_name, std::string_view new_name)
Rename an existing attribute.
Definition SurfaceMesh.cpp:1030
span< Index > reserve_indices_internal(span< const Index > facet_sizes)
Reserve index buffer for multiple facets of a given size.
Definition SurfaceMesh.cpp:3158
const Attribute< Scalar > & get_vertex_to_position() const
Gets a read-only reference to the vertex -> positions attribute.
Definition SurfaceMesh.cpp:1387
CornerMappingType
Assumptions on the corner mapping received by the internal reindexing method.
Definition SurfaceMesh.h:2518
@ RemovingFacets
Buffer is being compressed, so it is safe to move data without an intermediate buffer.
Definition SurfaceMesh.h:2520
@ ReversingFacets
Facets are being flipped, so it is safe to simply swap rows i and j when i < j.
Definition SurfaceMesh.h:2523
Index get_facet_size(Index f) const
Number of vertices in the facet.
Definition SurfaceMesh.h:719
void remove_facets(function_ref< bool(Index)> should_remove_func)
Removes a list of facets, defined by a predicate function.
Definition SurfaceMesh.cpp:1939
Index m_num_edges
Definition SurfaceMesh.h:2798
void clear_vertices()
Clear buffer for mesh vertices and other vertex attributes.
Definition SurfaceMesh.cpp:2034
AttributeId wrap_as_const_facets(SharedSpan< const Index > shared_facets, Index num_facets, Index vertex_per_facet)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:918
auto delete_and_export_const_indexed_attribute(std::string_view name, AttributeExportPolicy policy=AttributeExportPolicy::CopyIfExternal) -> std::shared_ptr< const IndexedAttribute< ValueType, Index > >
Delete an indexed attribute and export its content in a read-only shared_ptr.
Definition SurfaceMesh.cpp:1159
AttributeId wrap_as_const_vertices(SharedSpan< const Scalar > shared_vertices, Index num_vertices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition SurfaceMesh.cpp:843
function_ref< void(span< Index > t)> SetSingleFacetIndicesFunction
Callback function to set indices of a single facet.
Definition SurfaceMesh.h:106
void add_polygons(Index num_facets, Index facet_size, span< const Index > facet_indices={})
Adds multiple polygonal facets of the same size to the mesh.
Definition SurfaceMesh.cpp:1713
::lagrange::internal::weak_ptr< const AttributeBase > _get_attribute_ptr(std::string_view name) const
Gets a read-only weak pointer to the base attribute object.
Definition SurfaceMesh.cpp:1305
static constexpr std::string_view attr_name_next_corner_around_edge()
Attribute name for corner -> next corner around edge.
Definition SurfaceMesh.h:2010
static bool attr_name_is_reserved(std::string_view name)
Check whether the given name corresponds to a reserved attribute.
Definition SurfaceMesh.cpp:1415
SurfaceMesh(BareMeshTag tag)
Internal constructor.
Definition SurfaceMesh.cpp:1425
auto get_indexed_attribute(AttributeId id) const -> const IndexedAttribute< ValueType, Index > &
Gets a read-only reference to an indexed attribute given its id.
Definition SurfaceMesh.cpp:1330
Index get_num_corners() const
Retrieves the number of corners.
Definition SurfaceMesh.h:685
span< const Scalar > get_position(Index v) const
Retrieves a read-only pointer to a vertex coordinates.
Definition SurfaceMesh.cpp:2139
void seq_foreach_attribute_id(function_ref< void(AttributeId)> func) const
Iterates over all attribute ids sequentially.
Definition SurfaceMesh.cpp:1248
A lightweight non-owning reference to a callable.
Definition function_ref.h:47
Smart pointer with value semantics.
Definition value_ptr.h:134
AttributeCreatePolicy
Policy for attribute creation with reserved attribute names.
Definition AttributeFwd.h:86
uint32_t AttributeId
Identified to be used to access an attribute.
Definition AttributeFwd.h:73
AttributeExportPolicy
Policy for exporting attributes that are views onto external buffers.
Definition AttributeFwd.h:149
AttributeUsage
Usage tag indicating how the attribute should behave under mesh transformations.
Definition AttributeFwd.h:54
AttributeElement
Type of element to which the attribute is attached.
Definition AttributeFwd.h:26
AttributeDeletePolicy
Policy for attribute deletion of reserved attribute names.
Definition AttributeFwd.h:172
constexpr AttributeId invalid_attribute_id()
Invalid attribute id.
Definition AttributeFwd.h:76
@ ErrorIfReserved
Default deletion policy, throw an exception if attribute name is reserved.
Definition AttributeFwd.h:87
@ CopyIfExternal
Copy the buffer during export if the attribute points to an external buffer.
Definition AttributeFwd.h:150
@ Vector
Mesh attribute can have any number of channels (including 1 channel).
Definition AttributeFwd.h:55
@ ErrorIfReserved
Default deletion policy, throw an exception if attribute name is reserved.
Definition AttributeFwd.h:173
function_ref(R(*)(Args...)) -> function_ref< R(Args...)>
Deduce function_ref type from a function pointer.
::nonstd::span< T, Extent > span
A bounds-safe view for sequences of objects.
Definition span.h:27
nullptr_t, size_t, ptrdiff_t basic_ostream bad_weak_ptr extent, remove_extent, is_array,...
Definition attribute_string_utils.h:21
Main namespace for Lagrange.
Overload tag.
Definition SurfaceMesh.h:2440