[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