|
Blender V4.5
|
Classes | |
| class | IndexMapping |
Enumerations | |
| enum class | GeoMismatch : int8_t { NumPoints , NumEdges , NumCorners , NumFaces , NumCurves , PointAttributes , EdgeAttributes , CornerAttributes , FaceAttributes , CurveAttributes , EdgeTopology , FaceTopology , CurveTopology , Attributes , AttributeTypes , Indices } |
Functions | |
| const char * | mismatch_to_string (const GeoMismatch &mismatch) |
| std::optional< GeoMismatch > | compare_meshes (const Mesh &mesh1, const Mesh &mesh2, float threshold) |
| Checks if the two meshes are different, returning the type of mismatch if any. Changes in index order are detected, but treated as a mismatch. | |
| std::optional< GeoMismatch > | compare_curves (const CurvesGeometry &curves1, const CurvesGeometry &curves2, float threshold) |
| Checks if the two curves geometries are different, returning the type of mismatch if any. Changes in index order are detected, but treated as a mismatch. | |
| template<typename T> | |
| static void | sort_indices (MutableSpan< int > indices, const Span< T > values, const int component_i) |
| static void | sort_indices_with_id_maps (MutableSpan< int > indices, const Span< int > values, const Span< int > values_to_sorted, const Span< int > set_ids) |
| template<typename T> | |
| static void | sort_per_set_based_on_attributes (const Span< int > set_sizes, MutableSpan< int > sorted_to_domain1, MutableSpan< int > sorted_to_domain2, const Span< T > values1, const Span< T > values2, const int component_i) |
| static void | sort_per_set_with_id_maps (const Span< int > set_sizes, const Span< int > values1, const Span< int > values2, const Span< int > values1_to_sorted, const Span< int > values2_to_sorted, const Span< int > value_set_ids, MutableSpan< int > sorted_to_domain1, MutableSpan< int > sorted_to_domain2) |
| template<typename T> | |
| static bool | values_different (const T value1, const T value2, const float threshold, const int component_i) |
| template<typename T> | |
| static bool | update_set_ids (MutableSpan< int > set_ids, const Span< T > values1, const Span< T > values2, const Span< int > sorted_to_values1, MutableSpan< int > sorted_to_values2, const float threshold, const int component_i) |
| static bool | update_set_ids_with_id_maps (MutableSpan< int > set_ids, const Span< int > domain_to_values1, const Span< int > domain_to_values2, const Span< int > values1_to_sorted, const Span< int > values2_to_sorted, const Span< int > value_set_ids, const Span< int > sorted_to_domain1, const Span< int > sorted_to_domain2) |
| static void | update_set_sizes (const Span< int > set_ids, MutableSpan< int > set_sizes) |
| static void | edges_from_vert_sets (const Span< int2 > edges, const Span< int > verts_to_sorted, const Span< int > vert_set_ids, MutableSpan< OrderedEdge > r_edges) |
| static bool | sort_edges (const Span< int2 > edges1, const Span< int2 > edges2, const IndexMapping &verts, IndexMapping &edges) |
| static bool | sort_corners_based_on_domain (const Span< int > corner_domain1, const Span< int > corner_domain2, const IndexMapping &domain, IndexMapping &corners) |
| static void | calc_smallest_corner_ids (const Span< int > face_offsets, const Span< int > corners_to_sorted, const Span< int > corner_set_ids, MutableSpan< int > smallest_corner_ids) |
| static bool | sort_faces_based_on_corners (const IndexMapping &corners, const Span< int > face_offsets1, const Span< int > face_offsets2, IndexMapping &faces) |
| static bool | ignored_attribute (const StringRef id) |
| static std::optional< GeoMismatch > | verify_attributes_compatible (const AttributeAccessor &attributes1, const AttributeAccessor &attributes2) |
| static std::optional< GeoMismatch > | sort_domain_using_attributes (const AttributeAccessor &attributes1, const AttributeAccessor &attributes2, const AttrDomain domain, const Span< StringRef > excluded_attributes, IndexMapping &maps, const float threshold) |
| static void | make_set_sizes_one (IndexMapping &indices) |
| static bool | all_set_sizes_one (const Span< int > set_sizes) |
| static std::optional< GeoMismatch > | construct_vert_mapping (const Mesh &mesh1, const Mesh &mesh2, IndexMapping &verts, IndexMapping &edges) |
| static bool | sort_curves (const OffsetIndices< int > offset_indices1, const OffsetIndices< int > offset_indices2, IndexMapping &curves) |
|
strong |
Definition at line 23 of file geometry_compare.cc.
|
static |
Definition at line 680 of file geometry_compare.cc.
References all_set_sizes_one(), and size().
Referenced by all_set_sizes_one(), and construct_vert_mapping().
|
static |
Definition at line 449 of file geometry_compare.cc.
References calc_smallest_corner_ids(), and blender::MutableSpan< T >::index_range().
Referenced by calc_smallest_corner_ids(), and sort_faces_based_on_corners().
| std::optional< GeoMismatch > blender::bke::compare_geometry::compare_curves | ( | const CurvesGeometry & | curves1, |
| const CurvesGeometry & | curves2, | ||
| float | threshold ) |
Checks if the two curves geometries are different, returning the type of mismatch if any. Changes in index order are detected, but treated as a mismatch.
Definition at line 970 of file geometry_compare.cc.
References blender::bke::CurvesGeometry::attributes(), compare_curves(), blender::bke::Curve, blender::bke::CurvesGeometry::curves_num(), CurveTopology, blender::bke::compare_geometry::IndexMapping::from_sorted1, blender::bke::compare_geometry::IndexMapping::from_sorted2, Array< T, InlineBufferCapacity, Allocator >::index_range(), Indices, NumCurves, NumPoints, blender::bke::CurvesGeometry::offsets(), blender::bke::Point, blender::bke::CurvesGeometry::points_num(), sort_curves(), sort_domain_using_attributes(), and verify_attributes_compatible().
Referenced by compare_curves().
| std::optional< GeoMismatch > blender::bke::compare_geometry::compare_meshes | ( | const Mesh & | mesh1, |
| const Mesh & | mesh2, | ||
| float | threshold ) |
Checks if the two meshes are different, returning the type of mismatch if any. Changes in index order are detected, but treated as a mismatch.
Instead of just blindly comparing the two meshes, the code tries to determine if they are isomorphic. Two meshes are considered isomorphic, if, for each domain, there is a bijection between the two meshes such that the bijections preserve connectivity.
In general, determining if two graphs are isomorphic is a very difficult problem (no polynomial time algorithm is known). Because we have more information than just connectivity (attributes), we can compute it in a more reasonable time in most cases.
Definition at line 795 of file geometry_compare.cc.
References Geometry::attributes, compare_meshes(), construct_vert_mapping(), blender::bke::Corner, Mesh::corners_num, blender::bke::Edge, Mesh::edges_num, EdgeTopology, blender::bke::Face, faces, Mesh::faces_num, FaceTopology, Indices, make_set_sizes_one(), NumCorners, NumEdges, NumFaces, NumPoints, blender::bke::Point, blender::bke::compare_geometry::IndexMapping::recalculate_inverse_maps(), sort_corners_based_on_domain(), sort_domain_using_attributes(), sort_edges(), sort_faces_based_on_corners(), verify_attributes_compatible(), verts, and Mesh::verts_num.
Referenced by compare_meshes().
|
static |
Tries to construct a (bijective) mapping from the vertices of the first mesh to the vertices of the second mesh, such that:
Definition at line 702 of file geometry_compare.cc.
References all_set_sizes_one(), blender::Vector< T, InlineBufferCapacity, Allocator >::append(), BLI_assert, blender::bke::mesh::build_vert_to_edge_map(), construct_vert_mapping(), EdgeTopology, blender::Vector< T, InlineBufferCapacity, Allocator >::first(), blender::Vector< T, InlineBufferCapacity, Allocator >::is_empty(), blender::bke::compare_geometry::IndexMapping::set_ids, blender::Span< T >::size(), blender::bke::compare_geometry::IndexMapping::to_sorted1, blender::bke::compare_geometry::IndexMapping::to_sorted2, verts, and Mesh::verts_num.
Referenced by compare_meshes(), and construct_vert_mapping().
|
static |
Definition at line 373 of file geometry_compare.cc.
References e, edges_from_vert_sets(), i, and blender::MutableSpan< T >::index_range().
Referenced by edges_from_vert_sets(), and sort_edges().
|
static |
Definition at line 509 of file geometry_compare.cc.
References blender::bke::attribute_name_is_anonymous(), and ignored_attribute().
Referenced by ignored_attribute(), sort_domain_using_attributes(), and verify_attributes_compatible().
|
static |
Definition at line 652 of file geometry_compare.cc.
References indices, and make_set_sizes_one().
Referenced by compare_meshes(), and make_set_sizes_one().
| const char * blender::bke::compare_geometry::mismatch_to_string | ( | const GeoMismatch & | mismatch | ) |
Convert the mismatch to a human-readable string for display.
Definition at line 42 of file geometry_compare.cc.
References Attributes, AttributeTypes, BLI_assert_unreachable, CornerAttributes, CurveAttributes, CurveTopology, EdgeAttributes, EdgeTopology, FaceAttributes, FaceTopology, Indices, NumCorners, NumCurves, NumEdges, NumFaces, NumPoints, and PointAttributes.
|
static |
Sort the corners based on the sorted vertex/edge set ids.
Definition at line 421 of file geometry_compare.cc.
References blender::bke::compare_geometry::IndexMapping::set_ids, sort_corners_based_on_domain(), sort_per_set_with_id_maps(), blender::bke::compare_geometry::IndexMapping::to_sorted1, blender::bke::compare_geometry::IndexMapping::to_sorted2, update_set_ids_with_id_maps(), and update_set_sizes().
Referenced by compare_meshes(), and sort_corners_based_on_domain().
|
static |
Sort curves based on their sizes.
Definition at line 940 of file geometry_compare.cc.
References blender::Array< T, InlineBufferCapacity, Allocator >::as_mutable_span(), blender::Array< T, InlineBufferCapacity, Allocator >::as_span(), blender::offset_indices::copy_group_sizes(), blender::offset_indices::OffsetIndices< T >::index_range(), blender::offset_indices::OffsetIndices< T >::size(), sort_curves(), sort_per_set_based_on_attributes(), update_set_ids(), and update_set_sizes().
Referenced by compare_curves(), and sort_curves().
|
static |
Sort the domain using all the attributes on that domain except the ones in excluded_attributes
Definition at line 552 of file geometry_compare.cc.
References blender::bke::AttributeAccessor::all_ids(), Attributes, BLI_assert_unreachable, blender::bke::AttributeAccessor::contains(), blender::bke::attribute_math::convert_to_static_type(), blender::bke::Corner, CornerAttributes, blender::bke::Curve, CurveAttributes, blender::bke::GAttributeReader::domain, blender::bke::Edge, EdgeAttributes, blender::bke::Face, FaceAttributes, blender::bke::compare_geometry::IndexMapping::from_sorted1, blender::bke::compare_geometry::IndexMapping::from_sorted2, ignored_attribute(), blender::is_same_any_v, blender::bke::AttributeAccessor::lookup(), blender::bke::Point, PointAttributes, blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::remove_as(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::remove_if(), blender::bke::compare_geometry::IndexMapping::set_ids, blender::bke::compare_geometry::IndexMapping::set_sizes, sort_domain_using_attributes(), sort_per_set_based_on_attributes(), blender::GVArrayCommon::type(), update_set_ids(), update_set_sizes(), and blender::bke::GAttributeReader::varray.
Referenced by compare_curves(), compare_meshes(), and sort_domain_using_attributes().
|
static |
Sort the edges based on the sorted vertex set ids.
Definition at line 388 of file geometry_compare.cc.
References blender::Array< T, InlineBufferCapacity, Allocator >::as_span(), edges_from_vert_sets(), blender::bke::compare_geometry::IndexMapping::from_sorted1, blender::bke::compare_geometry::IndexMapping::from_sorted2, blender::bke::compare_geometry::IndexMapping::set_ids, blender::bke::compare_geometry::IndexMapping::set_sizes, blender::Span< T >::size(), sort_edges(), sort_per_set_based_on_attributes(), update_set_ids(), update_set_sizes(), and verts.
Referenced by compare_meshes(), and sort_edges().
|
static |
Sort the faces using the sorted corner set ids.
Definition at line 470 of file geometry_compare.cc.
References blender::Array< T, InlineBufferCapacity, Allocator >::as_span(), calc_smallest_corner_ids(), faces, sort_faces_based_on_corners(), sort_per_set_based_on_attributes(), update_set_ids(), and update_set_sizes().
Referenced by compare_meshes(), and sort_faces_based_on_corners().
|
static |
Sort the indices using the values. For vectors of floats, the sorting happens based on the given component.
Definition at line 130 of file geometry_compare.cc.
References BLI_assert_unreachable, i, indices, and blender::is_same_any_v.
Referenced by sort_per_set_based_on_attributes().
|
static |
Sort the indices using the set ids of the values.
Definition at line 176 of file geometry_compare.cc.
References indices, and sort_indices_with_id_maps().
Referenced by sort_indices_with_id_maps(), and sort_per_set_with_id_maps().
|
static |
Definition at line 188 of file geometry_compare.cc.
References i, blender::Span< T >::size(), blender::MutableSpan< T >::slice(), sort_indices(), and sort_per_set_based_on_attributes().
Referenced by sort_curves(), sort_domain_using_attributes(), sort_edges(), sort_faces_based_on_corners(), and sort_per_set_based_on_attributes().
|
static |
Definition at line 211 of file geometry_compare.cc.
References i, blender::MutableSpan< T >::size(), blender::MutableSpan< T >::slice(), sort_indices_with_id_maps(), and sort_per_set_with_id_maps().
Referenced by sort_corners_based_on_domain(), and sort_per_set_with_id_maps().
|
static |
Split the sets into smaller sets based on the sorted attribute values.
Definition at line 280 of file geometry_compare.cc.
References i, blender::Span< T >::index_range(), blender::MutableSpan< T >::is_empty(), T, update_set_ids(), and values_different().
Referenced by sort_curves(), sort_domain_using_attributes(), sort_edges(), sort_faces_based_on_corners(), and update_set_ids().
|
static |
Split the sets into smaller sets based on the set ids of the sorted values.
Definition at line 321 of file geometry_compare.cc.
References i, blender::Span< T >::index_range(), blender::MutableSpan< T >::is_empty(), and update_set_ids_with_id_maps().
Referenced by sort_corners_based_on_domain(), and update_set_ids_with_id_maps().
|
static |
Update set sizes, using the updated set ids.
Definition at line 358 of file geometry_compare.cc.
References i, blender::Span< T >::size(), and update_set_sizes().
Referenced by sort_corners_based_on_domain(), sort_curves(), sort_domain_using_attributes(), sort_edges(), sort_faces_based_on_corners(), and update_set_sizes().
|
static |
Checks if the two values are different. For float types, the equality is checked based on a threshold.
Definition at line 246 of file geometry_compare.cc.
References BLI_assert_unreachable, compare_threshold_relative(), blender::is_same_any_v, T, and values_different().
Referenced by update_set_ids(), and values_different().
|
static |
Verify that both geometries have the same attributes:
Definition at line 521 of file geometry_compare.cc.
References blender::bke::AttributeAccessor::all_ids(), AttributeTypes, blender::bke::GAttributeReader::domain, ignored_attribute(), blender::bke::AttributeAccessor::lookup(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::remove_if(), blender::GVArrayCommon::type(), blender::bke::GAttributeReader::varray, and verify_attributes_compatible().
Referenced by compare_curves(), compare_meshes(), and verify_attributes_compatible().