Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-12-17 09:49:56 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-12-17 10:03:46 +0300
commitd7723df8466a9aa34ab51f5c3640ae17d48637eb (patch)
tree6226f4cea3f9b6cc26c5b30c9e2b8e1534137ceb /source/blender/bmesh/intern/bmesh_polygon_edgenet.c
parent9f84d5e546084e6d4360f421f35f34560c1ff4ee (diff)
BMesh: partial-connection could make duplicate edges
Avoiding to make duplicate edges is too involved, do a remove-duplicates pass at the end instead.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_polygon_edgenet.c')
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon_edgenet.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
index 85efffb82d3..d2a20bed373 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -1046,40 +1046,21 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi
/**
- * Check if creating a connection between 2 edges will later overlap when splicing vertices back together.
+ * Check if connecting vertices would cause an edge with duplicate verts.
*/
static bool bm_vert_partial_connect_check_overlap(
- BMVert **vert_arr, const int *remap,
+ const int *remap,
const int v_a_index, const int v_b_index)
{
- int v_a_remap = remap[v_a_index];
- int v_b_remap = remap[v_b_index];
-
- if (v_a_remap == -1 && v_b_remap == -1) {
- return false;
- }
- else if (UNLIKELY((v_a_remap == v_b_index) || (v_b_remap == v_a_index))) {
- /* connected to eachother */
+ /* connected to eachother */
+ if (UNLIKELY((remap[v_a_index] == v_b_index) ||
+ (remap[v_b_index] == v_a_index)))
+ {
return true;
}
else {
- /* check that creating an edge here will overlap an existing edge
- * once adjacent vertices are spliced together. */
- const int v_pair[2] = {v_a_index, v_b_index};
- for (int i = 0; i < 2; i++) {
- BMVert *v = vert_arr[v_pair[i]];
- BMEdge *e_iter = v->e;
- do {
- BMVert *v_step = BM_edge_other_vert(e_iter, v);
- const int v_step_index = BM_elem_index_get(v_step);
- if (remap[v_step_index] == v_pair[!i]) {
- return true;
- }
- } while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v)) != v->e);
- }
+ return false;
}
-
- return false;
}
@@ -1438,13 +1419,16 @@ bool BM_face_split_edgenet_connect_islands(
#ifdef USE_PARTIAL_CONNECT
if ((use_partial_connect == false) ||
(bm_vert_partial_connect_check_overlap(
- vert_arr, temp_vert_pairs.remap,
+ temp_vert_pairs.remap,
BM_elem_index_get(v_origin), index_other) == false))
#endif
{
BMVert *v_end = vert_arr[index_other];
edge_net_new[edge_net_new_index] = BM_edge_create(bm, v_origin, v_end, NULL, 0);
+#ifdef USE_PARTIAL_CONNECT
+ BM_elem_index_set(edge_net_new[edge_net_new_index], edge_net_new_index);
+#endif
edge_net_new_index++;
args.edge_arr_new_len++;
}
@@ -1462,12 +1446,15 @@ bool BM_face_split_edgenet_connect_islands(
#ifdef USE_PARTIAL_CONNECT
if ((use_partial_connect == false) ||
(bm_vert_partial_connect_check_overlap(
- vert_arr, temp_vert_pairs.remap,
+ temp_vert_pairs.remap,
BM_elem_index_get(v_origin), index_other) == false))
#endif
{
BMVert *v_end = vert_arr[index_other];
edge_net_new[edge_net_new_index] = BM_edge_create(bm, v_origin, v_end, NULL, 0);
+#ifdef USE_PARTIAL_CONNECT
+ BM_elem_index_set(edge_net_new[edge_net_new_index], edge_net_new_index);
+#endif
edge_net_new_index++;
args.edge_arr_new_len++;
}
@@ -1505,6 +1492,21 @@ finally:
BLI_assert(BM_edge_exists(tvp->v_orig, tvp->v_temp) == NULL);
BM_vert_splice(bm, tvp->v_orig, tvp->v_temp);
} while ((tvp = tvp->next));
+
+ /* Remove edges which have become doubles since splicing vertices together,
+ * its less trouble then detecting future-doubles on edge-creation. */
+ for (unsigned int i = edge_net_init_len; i < edge_net_new_len; i++) {
+ while (BM_edge_find_double(edge_net_new[i])) {
+ BM_edge_kill(bm, edge_net_new[i]);
+ edge_net_new_len--;
+ if (i == edge_net_new_len) {
+ break;
+ }
+ edge_net_new[i] = edge_net_new[edge_net_new_len];
+ }
+ }
+
+ *r_edge_net_new_len = edge_net_new_len;
}
#endif