The split edges code had a complex method of merging duplicate edges, going backwards to avoid shifting elements in a vector. Sometimes it could result in incorrect corner edge indices though, if it moved an index that matched one of the local variables (I think! I've bee trying to understand this all day and still struggling). Instead, replace it with a `VectorSet` that handles the deduplication by itself, and avoid creating the new edges until the end. I think this code could still be simpler if we tried to reduce the amount of things happening at the same time, making more code deal with the input or final state rather than an in-between one. But to avoid making the change too complicated I stopped here. Pull Request: https://projects.blender.org/blender/blender/pulls/108826
48 lines
1012 B
C++
48 lines
1012 B
C++
/* SPDX-FileCopyrightText: 2023 Blender Foundation
|
|
*
|
|
* 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)
|
|
{
|
|
BLI_assert(e1.v_low < e1.v_high);
|
|
BLI_assert(e2.v_low < e2.v_high);
|
|
return e1.v_low == e2.v_low && e1.v_high == e2.v_high;
|
|
}
|
|
};
|
|
|
|
} // namespace blender
|