[Bf-blender-cvs] [7d5c3beb06c] temp_bmesh_multires: Sculpt dyntopo: Fix bug with edge collapse
Joseph Eagar
noreply at git.blender.org
Sat Aug 28 22:31:04 CEST 2021
Commit: 7d5c3beb06c208c6818f7718b53f601e37e2aa71
Author: Joseph Eagar
Date: Sat Aug 28 13:30:46 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB7d5c3beb06c208c6818f7718b53f601e37e2aa71
Sculpt dyntopo: Fix bug with edge collapse
===================================================================
M source/blender/blenkernel/intern/dyntopo.c
M source/blender/bmesh/intern/bmesh_log.c
===================================================================
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index e7ec51a2c62..938d39d0dbc 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -2452,28 +2452,16 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
int eflag = 0;
- // propegate flags to merged edges
BMLoop *l = f_adj->l_first;
do {
BMEdge *e2 = l->e;
- if (e2 != e) {
- eflag |= e2->head.hflag & ~BM_ELEM_HIDDEN;
- }
-
MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
mv_l->flag |= DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT | DYNVERT_NEED_VALENCE;
l = l->next;
} while (l != f_adj->l_first);
- do {
- BMEdge *e2 = l->e;
- e2->head.hflag |= eflag;
-
- l = l->next;
- } while (l != f_adj->l_first);
-
pbvh_bmesh_face_remove(pbvh, f_adj, true, true, true);
BM_face_kill(pbvh->bm, f_adj);
}
@@ -2628,23 +2616,25 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
n->flag |= PBVH_UpdateOtherVerts;
- bm_edges_from_tri(pbvh, old_tri, e_tri);
+ e_tri[0] = BM_edge_exists(old_tri[0], old_tri[1]);
+ e_tri[1] = BM_edge_exists(old_tri[1], old_tri[2]);
+ e_tri[2] = BM_edge_exists(old_tri[2], old_tri[0]);
+ if (!e_tri[0] || !e_tri[1] || !e_tri[2]) {
+ printf("%s: missing edges!\n", __func__);
+ bm_edges_from_tri(pbvh, old_tri, e_tri);
+ }
+
bm_edges_from_tri_example(pbvh, v_tri, e_tri);
BMFace *f2 = pbvh_bmesh_face_create(pbvh, ni, v_tri, e_tri, f, false, true);
BMLoop *l2 = f2->l_first;
- // sync edge flags
- // l2->next->e->head.hflag |= (l->next->e->head.hflag & ~BM_ELEM_HIDDEN);
- // l2->prev->e->head.hflag |= (l->prev->e->head.hflag & ~BM_ELEM_HIDDEN);
-
CustomData_bmesh_swap_data_simple(&pbvh->bm->edata, &l2->e->head.data, &l->e->head.data);
CustomData_bmesh_swap_data_simple(
&pbvh->bm->edata, &l2->next->e->head.data, &l->next->e->head.data);
CustomData_bmesh_swap_data_simple(
&pbvh->bm->edata, &l2->prev->e->head.data, &l->prev->e->head.data);
- // l2->prev->e->head.hflag |= (l->prev->e->head.hflag & ~BM_ELEM_HIDDEN);
pbvh_bmesh_copy_facedata(pbvh, pbvh->bm, f2, f);
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index dddcfb9505e..b9cdf16b500 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -493,6 +493,10 @@ static BMLogVert *bm_log_vert_alloc(BMLog *log,
static void bm_log_edge_bmedge_copy(
BMLog *log, BMLogEntry *entry, BMLogEdge *le, BMEdge *e, bool copy_customdata)
{
+ if (e->head.htype != BM_EDGE) {
+ printf("%s: e is not an edge; htype: %d\n", __func__, (int)e->head.htype);
+ }
+
le->v1 = (uint)BM_ELEM_GET_ID(log->bm, e->v1);
le->v2 = (uint)BM_ELEM_GET_ID(log->bm, e->v2);
@@ -797,7 +801,14 @@ static void bm_log_edges_restore(
continue;
}
- BMEdge *e = BM_edge_create(bm, v1, v2, NULL, BM_CREATE_SKIP_ID);
+ BMEdge *e = BM_edge_exists(v1, v2);
+ if (e) {
+ printf("%s: edge already %d existed\n", __func__, (int)id);
+ bm_free_id(bm, (BMElem *)e);
+ }
+ else {
+ e = BM_edge_create(bm, v1, v2, NULL, BM_CREATE_SKIP_ID);
+ }
e->head.hflag = le->hflag;
@@ -878,6 +889,22 @@ static void bm_log_faces_restore(
continue;
}
+#if 0
+ for (size_t j = 0; j < lf->len; j++) {
+ BMVert *v1 = bm_log_vert_from_id(log, lf->v_ids[j]);
+ BMVert *v2 = bm_log_vert_from_id(log, lf->v_ids[(j + 1) % lf->len]);
+
+ if (!v1 || !v2) {
+ continue;
+ }
+
+ if (!BM_edge_exists(v1, v2)) {
+ int id = POINTER_AS_INT(key);
+ printf("%s: missing edge, face %d had to create it\n", __func__, (int)id);
+ }
+ }
+#endif
+
BMFace *f = BM_face_create_verts(
bm, vs_tmp, (int)BLI_array_len(vs_tmp), NULL, BM_CREATE_SKIP_ID, true);
f->head.hflag = lf->hflag;
@@ -1542,7 +1569,6 @@ BMLogEntry *bm_log_entry_add_ex(
log->refcount++;
-#ifdef CUSTOMDATA
if (combine_with_last) {
if (!last_entry || last_entry == log->current_entry) {
if (log->current_entry) {
@@ -1569,7 +1595,6 @@ BMLogEntry *bm_log_entry_add_ex(
CustomData_bmesh_init_pool(&entry->ldata, 0, BM_LOOP);
CustomData_bmesh_init_pool(&entry->pdata, 0, BM_FACE);
}
-#endif
log->current_entry = entry;
@@ -2434,7 +2459,7 @@ void BM_log_edge_removed(BMLog *log, BMEdge *e)
*val = (void *)le;
#if 1
- /* If the vertex was modified before deletion, ensure that the
+ /* If the edge was modified before deletion, ensure that the
* original edge values are stored */
if ((le_mod = log_ghash_lookup(log, entry->modified_edges, key))) {
if (le->customdata) {
More information about the Bf-blender-cvs
mailing list