This adds a new function, `compare_meshes`, as a replacement for `BKE_mesh_cmp`. The main benefits of the new version are the following: - The code is written in c++, and makes use of the new attributes API. - It adds an additional check, to see if the meshes only differ by their indices. This is useful to verify correctness of new algorithmic changes in mesh code, which might produce mesh elements in a different order than the original algorithm. The tests will still fail, but the error will show that the indices changed. Some downsides: - The code is more complex, due to having to be index-independent. - The code is probably slower due to having to do comparisons "index- independently". I have not tested this, as correctness was my priority for this patch. A future update could look to improve the speed, if that is desired. - This is technically a breaking API change, since it changes the returned values of `rna_Mesh_unit_test_compare`. I don't think that there are many people (if any) using this, besides our own unit tests. All tests that pass with `BKE_mesh_cmp` still pass with the new version. **NOTE:** Currently, mesh edge indices are allowed to be different in the comparison, because `BKE_mesh_cmp` also allowed this. There are some tests which would fail otherwise. These tests should be updated, and then the corresponding code as well. I wrote up a more detailed explanation of the algorithm here: https://hackmd.io/@bo-JY945TOmvepQ1tAWy6w/SyuaFtay6 Pull Request: https://projects.blender.org/blender/blender/pulls/112794
61 lines
1.3 KiB
C++
61 lines
1.3 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_assert.h"
|
|
#include "BLI_math_vector_types.hh"
|
|
|
|
namespace blender {
|
|
|
|
/**
|
|
* A version of `int2` used as a key for hash-maps, agnostic of the arbitrary order of the two
|
|
* vertices in a mesh edge.
|
|
*/
|
|
struct OrderedEdge {
|
|
int v_low;
|
|
int v_high;
|
|
|
|
OrderedEdge(const int v1, const int v2)
|
|
{
|
|
if (v1 < v2) {
|
|
v_low = v1;
|
|
v_high = v2;
|
|
}
|
|
else {
|
|
v_low = v2;
|
|
v_high = v1;
|
|
}
|
|
}
|
|
OrderedEdge(const int2 edge) : OrderedEdge(edge[0], edge[1]) {}
|
|
OrderedEdge(const uint v1, const uint v2) : OrderedEdge(int(v1), int(v2)) {}
|
|
|
|
uint64_t hash() const
|
|
{
|
|
return (this->v_low << 8) ^ this->v_high;
|
|
}
|
|
|
|
friend bool operator==(const OrderedEdge &e1, const OrderedEdge &e2)
|
|
{
|
|
return e1.v_low == e2.v_low && e1.v_high == e2.v_high;
|
|
}
|
|
|
|
friend bool operator!=(const OrderedEdge &e1, const OrderedEdge &e2)
|
|
{
|
|
return !(e1 == e2);
|
|
}
|
|
|
|
friend bool operator<(const OrderedEdge &e1, const OrderedEdge &e2)
|
|
{
|
|
if (e1.v_low != e2.v_low) {
|
|
return e1.v_low < e2.v_low;
|
|
}
|
|
return e1.v_high < e2.v_high;
|
|
}
|
|
|
|
friend std::ostream &operator<<(std::ostream &stream, const OrderedEdge &e);
|
|
};
|
|
|
|
} // namespace blender
|