Blender V5.0
blender::bke::compare_geometry Namespace Reference

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< GeoMismatchcompare_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< GeoMismatchcompare_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.
std::optional< GeoMismatchcompare_lattices (const Lattice &lattice1, const Lattice &lattice2, float threshold)
 Checks if the two lattices are different, returning the type of mismatch if any.
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, const Span< 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< GeoMismatchverify_attributes_compatible (const AttributeAccessor &attributes1, const AttributeAccessor &attributes2)
static std::optional< GeoMismatchsort_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< GeoMismatchconstruct_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)

Enumeration Type Documentation

◆ GeoMismatch

enum class blender::bke::compare_geometry::GeoMismatch : int8_t
strong
Enumerator
NumPoints 
NumEdges 
NumCorners 
NumFaces 
NumCurves 
PointAttributes 
EdgeAttributes 
CornerAttributes 
FaceAttributes 
CurveAttributes 
EdgeTopology 
FaceTopology 
CurveTopology 
Attributes 
AttributeTypes 
Indices 

Definition at line 26 of file geometry_compare.cc.

Function Documentation

◆ all_set_sizes_one()

bool blender::bke::compare_geometry::all_set_sizes_one ( const Span< int > set_sizes)
static

Definition at line 707 of file geometry_compare.cc.

References all_set_sizes_one(), and size().

Referenced by all_set_sizes_one(), and construct_vert_mapping().

◆ calc_smallest_corner_ids()

void blender::bke::compare_geometry::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

◆ compare_curves()

std::optional< GeoMismatch > blender::bke::compare_geometry::compare_curves ( const CurvesGeometry & curves1,
const CurvesGeometry & curves2,
float threshold )

◆ compare_lattices()

std::optional< GeoMismatch > blender::bke::compare_geometry::compare_lattices ( const Lattice & lattice1,
const Lattice & lattice2,
float threshold )

Checks if the two lattices are different, returning the type of mismatch if any.

Returns
The type of mismatch that was detected, if there is any.

Definition at line 1052 of file geometry_compare.cc.

References compare_lattices(), Lattice::def, i, NumPoints, Lattice::pntsu, Lattice::pntsv, Lattice::pntsw, PointAttributes, and values_different().

Referenced by compare_lattices().

◆ compare_meshes()

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.

Returns
The type of mismatch that was detected, if there is any.

Definition at line 822 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().

◆ construct_vert_mapping()

std::optional< GeoMismatch > blender::bke::compare_geometry::construct_vert_mapping ( const Mesh & mesh1,
const Mesh & mesh2,
IndexMapping & verts,
IndexMapping & edges )
static

Tries to construct a (bijective) mapping from the vertices of the first mesh to the vertices of the second mesh, such that:

  • Edge topology is preserved under this mapping, i.e. if v_1 and v_2 are on an edge in mesh1 then f(v_1) and f(v_2) are on an edge in mesh2.
  • Face topology is preserved under this mapping, i.e. if v_1, ..., v_n form a face in mesh1, then f(v_1), ..., f(v_n) form a face in mesh2.
  • The mapping preserves all vertex attributes, i.e. if attr is some vertex attribute on mesh1, then for every vertex v of mesh1, attr(v) = attr(f(v)).
Returns
the type of mismatch that occurred if the mapping couldn't be constructed.

Definition at line 729 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().

◆ edges_from_vert_sets()

void blender::bke::compare_geometry::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

◆ ignored_attribute()

bool blender::bke::compare_geometry::ignored_attribute ( const StringRef id)
static

The UV selection & pin layers are ignored in the comparisons because the original flags they replace were ignored as well. Because of the lazy creation of these layers it would need careful handling of the test files to compare these layers. For now it has been decided to skip them.

Definition at line 536 of file geometry_compare.cc.

References blender::bke::attribute_name_is_anonymous(), ELEM, and ignored_attribute().

Referenced by ignored_attribute(), sort_domain_using_attributes(), and verify_attributes_compatible().

◆ make_set_sizes_one()

void blender::bke::compare_geometry::make_set_sizes_one ( IndexMapping & indices)
static

Definition at line 679 of file geometry_compare.cc.

References indices, and make_set_sizes_one().

Referenced by compare_meshes(), and make_set_sizes_one().

◆ mismatch_to_string()

const char * blender::bke::compare_geometry::mismatch_to_string ( const GeoMismatch & mismatch)

◆ sort_corners_based_on_domain()

bool blender::bke::compare_geometry::sort_corners_based_on_domain ( const Span< int > corner_domain1,
const Span< int > corner_domain2,
const IndexMapping & domain,
IndexMapping & corners )
static

◆ sort_curves()

◆ sort_domain_using_attributes()

std::optional< GeoMismatch > blender::bke::compare_geometry::sort_domain_using_attributes ( const AttributeAccessor & attributes1,
const AttributeAccessor & attributes2,
const AttrDomain domain,
const Span< StringRef > excluded_attributes,
IndexMapping & maps,
const float threshold )
static

◆ sort_edges()

◆ sort_faces_based_on_corners()

bool blender::bke::compare_geometry::sort_faces_based_on_corners ( const IndexMapping & corners,
const Span< int > face_offsets1,
const Span< int > face_offsets2,
IndexMapping & faces )
static

◆ sort_indices()

template<typename T>
void blender::bke::compare_geometry::sort_indices ( MutableSpan< int > indices,
const Span< T > values,
const int component_i )
static

Sort the indices using the values. For vectors of floats, the sorting happens based on the given component.

Definition at line 133 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().

◆ sort_indices_with_id_maps()

void blender::bke::compare_geometry::sort_indices_with_id_maps ( MutableSpan< int > indices,
const Span< int > values,
const Span< int > values_to_sorted,
const Span< int > set_ids )
static

Sort the indices using the set ids of the values.

Definition at line 179 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().

◆ sort_per_set_based_on_attributes()

template<typename T>
void blender::bke::compare_geometry::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

◆ sort_per_set_with_id_maps()

void blender::bke::compare_geometry::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 )
static

◆ update_set_ids()

template<typename T>
bool blender::bke::compare_geometry::update_set_ids ( MutableSpan< int > set_ids,
const Span< T > values1,
const Span< T > values2,
const Span< int > sorted_to_values1,
const Span< int > sorted_to_values2,
const float threshold,
const int component_i )
static

Split the sets into smaller sets based on the sorted attribute values.

Returns
false if the attributes don't line up.

Definition at line 307 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().

◆ update_set_ids_with_id_maps()

bool blender::bke::compare_geometry::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

Split the sets into smaller sets based on the set ids of the sorted values.

Returns
false if the attributes don't line up.

Definition at line 348 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().

◆ update_set_sizes()

void blender::bke::compare_geometry::update_set_sizes ( const Span< int > set_ids,
MutableSpan< int > set_sizes )
static

◆ values_different()

template<typename T>
bool blender::bke::compare_geometry::values_different ( const T value1,
const T value2,
const float threshold,
const int component_i )
static

Checks if the two values are different. For float types, the equality is checked based on a threshold.

Definition at line 249 of file geometry_compare.cc.

References ASSERT_AND_ASSUME, BLI_assert_unreachable, compare_threshold_relative(), blender::is_same_any_v, T, and values_different().

Referenced by compare_lattices(), update_set_ids(), and values_different().

◆ verify_attributes_compatible()