[Bf-blender-cvs] [e68667a8352] temp_bmesh_multires: Sculpt dyntopo:

Joseph Eagar noreply at git.blender.org
Mon Sep 13 08:40:28 CEST 2021


Commit: e68667a83526e1bd33a6f08a04ba520dcf92e476
Author: Joseph Eagar
Date:   Sun Sep 12 23:39:49 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rBe68667a83526e1bd33a6f08a04ba520dcf92e476

Sculpt dyntopo:

* A few more collapse fixes
* Fixed boudary handling in surface_smooth_v_safe

===================================================================

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index edea39f1d3e..77da0616b69 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -897,6 +897,7 @@ typedef struct SculptLayerEntry {
 #endif
 
 int BKE_pbvh_do_fset_symmetry(int fset, const int symflag, const float *co);
+bool BKE_pbvh_check_vert_boundary(PBVH *pbvh, struct BMVert *v);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index f9e90ede763..9ef47f0908b 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -592,7 +592,7 @@ BLI_INLINE void surface_smooth_v_safe(PBVH *pbvh, BMVert *v, float fac)
     MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(cd_dyn_vert, v2);
     const bool bound2 = mv2->flag & DYNVERT_SMOOTH_BOUNDARY;
 
-    if (bound1 != bound2) {
+    if (bound1 && !bound2) {
       continue;
     }
 
@@ -3440,13 +3440,13 @@ static bool bm_edge_collapse_is_degenerate_topology(BMEdge *e_first)
   return false;
 }
 
-static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
-                                     BMEdge *e,
-                                     BMVert *v1,
-                                     BMVert *v2,
-                                     GHash *deleted_verts,
-                                     BLI_Buffer *deleted_faces,
-                                     EdgeQueueContext *eq_ctx)
+ATTR_NO_OPT static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
+                                                 BMEdge *e,
+                                                 BMVert *v1,
+                                                 BMVert *v2,
+                                                 GHash *deleted_verts,
+                                                 BLI_Buffer *deleted_faces,
+                                                 EdgeQueueContext *eq_ctx)
 {
   BMVert *v_del, *v_conn;
 
@@ -3458,6 +3458,9 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
     return;
   }
 
+  pbvh_check_vert_boundary(pbvh, v1);
+  pbvh_check_vert_boundary(pbvh, v2);
+
   const int mupdateflag = DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
   // updateflag |= DYNVERT_NEED_TRIANGULATE;  // to check for non-manifold flaps
 
@@ -3466,17 +3469,29 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
   check_vert_fan_are_tris(pbvh, e->v1);
   check_vert_fan_are_tris(pbvh, e->v2);
 
+  MDynTopoVert *mv1 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v1);
+  MDynTopoVert *mv2 = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, v2);
+
   /* one of the two vertices may be masked, select the correct one for deletion */
-  if (DYNTOPO_MASK(eq_ctx->cd_vert_mask_offset, v1) <
-      DYNTOPO_MASK(eq_ctx->cd_vert_mask_offset, v2)) {
+  if (!(mv1->flag & DYNVERT_ALL_CORNER) || DYNTOPO_MASK(eq_ctx->cd_vert_mask_offset, v1) <
+                                               DYNTOPO_MASK(eq_ctx->cd_vert_mask_offset, v2)) {
     v_del = v1;
     v_conn = v2;
   }
   else {
     v_del = v2;
     v_conn = v1;
+
+    SWAP(MDynTopoVert *, mv1, mv2);
   }
 
+  if ((mv1->flag & DYNVERT_ALL_CORNER) ||
+      (mv1->flag & DYNVERT_ALL_BOUNDARY) != (mv2->flag & DYNVERT_ALL_BOUNDARY)) {
+    return;
+  }
+
+  bool snap = !(mv2->flag & DYNVERT_ALL_CORNER);
+
 #if 0
   // don't allow non-manifold case of
   // there being 3-valence verts
@@ -3595,79 +3610,81 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
   }
 #endif
 
+  BMLoop *l;
+
   // snap customdata
+  if (snap) {
+    int ni_conn = BM_ELEM_CD_GET_INT(v_conn, pbvh->cd_vert_node_offset);
+    const float v_ws[2] = {0.5f, 0.5f};
+    const void *v_blocks[2] = {v_del->head.data, v_conn->head.data};
+    CustomData_bmesh_interp(&pbvh->bm->vdata, v_blocks, v_ws, NULL, 2, v_conn->head.data);
+    BM_ELEM_CD_SET_INT(v_conn, pbvh->cd_vert_node_offset, ni_conn);
 
-  int ni_conn = BM_ELEM_CD_GET_INT(v_conn, pbvh->cd_vert_node_offset);
-  const float v_ws[2] = {0.5f, 0.5f};
-  const void *v_blocks[2] = {v_del->head.data, v_conn->head.data};
-  CustomData_bmesh_interp(&pbvh->bm->vdata, v_blocks, v_ws, NULL, 2, v_conn->head.data);
-  BM_ELEM_CD_SET_INT(v_conn, pbvh->cd_vert_node_offset, ni_conn);
+    BMLoop **ls = NULL;
+    void **blocks = NULL;
+    float *ws = NULL;
 
-  BMLoop *l;
-  BMLoop **ls = NULL;
-  void **blocks = NULL;
-  float *ws = NULL;
+    BLI_array_staticdeclare(ls, 64);
+    BLI_array_staticdeclare(blocks, 64);
+    BLI_array_staticdeclare(ws, 64);
 
-  BLI_array_staticdeclare(ls, 64);
-  BLI_array_staticdeclare(blocks, 64);
-  BLI_array_staticdeclare(ws, 64);
+    int totl = 0;
 
-  int totl = 0;
+    BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
+      MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
+      mv_l->flag |= mupdateflag;
 
-  BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
-    MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
-    mv_l->flag |= mupdateflag;
+      BLI_array_append(ls, l);
+      totl++;
+    }
+    BM_LOOPS_OF_VERT_ITER_END;
 
-    BLI_array_append(ls, l);
-    totl++;
-  }
-  BM_LOOPS_OF_VERT_ITER_END;
+    BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
+      MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
+      mv_l->flag |= mupdateflag;
 
-  BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
-    MDynTopoVert *mv_l = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l->v);
-    mv_l->flag |= mupdateflag;
+      BLI_array_append(ls, l);
+      totl++;
+    }
+    BM_LOOPS_OF_VERT_ITER_END;
 
-    BLI_array_append(ls, l);
-    totl++;
-  }
-  BM_LOOPS_OF_VERT_ITER_END;
+    float w = totl > 0 ? 1.0f / (float)(totl) : 1.0f;
 
-  float w = totl > 0 ? 1.0f / (float)(totl) : 1.0f;
+    for (int i = 0; i < totl; i++) {
+      BLI_array_append(blocks, ls[i]->head.data);
+      BLI_array_append(ws, w);
+    }
 
-  for (int i = 0; i < totl; i++) {
-    BLI_array_append(blocks, ls[i]->head.data);
-    BLI_array_append(ws, w);
-  }
+    // snap customdata
+    if (totl > 0) {
+      CustomData_bmesh_interp(
+          &pbvh->bm->ldata, (const void **)blocks, ws, NULL, totl, ls[0]->head.data);
+      //*
+      BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
+        BMLoop *l2 = l->v != v_del ? l->next : l;
 
-  // snap customdata
-  if (totl > 0) {
-    CustomData_bmesh_interp(
-        &pbvh->bm->ldata, (const void **)blocks, ws, NULL, totl, ls[0]->head.data);
-    //*
-    BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_del) {
-      BMLoop *l2 = l->v != v_del ? l->next : l;
+        if (l2 == ls[0]) {
+          continue;
+        }
 
-      if (l2 == ls[0]) {
-        continue;
+        CustomData_bmesh_copy_data(
+            &pbvh->bm->ldata, &pbvh->bm->ldata, ls[0]->head.data, &l2->head.data);
       }
+      BM_LOOPS_OF_VERT_ITER_END;
 
-      CustomData_bmesh_copy_data(
-          &pbvh->bm->ldata, &pbvh->bm->ldata, ls[0]->head.data, &l2->head.data);
-    }
-    BM_LOOPS_OF_VERT_ITER_END;
+      BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
+        BMLoop *l2 = l->v != v_conn ? l->next : l;
 
-    BM_LOOPS_OF_VERT_ITER_BEGIN (l, v_conn) {
-      BMLoop *l2 = l->v != v_conn ? l->next : l;
+        if (l2 == ls[0]) {
+          continue;
+        }
 
-      if (l2 == ls[0]) {
-        continue;
+        CustomData_bmesh_copy_data(
+            &pbvh->bm->ldata, &pbvh->bm->ldata, ls[0]->head.data, &l2->head.data);
       }
-
-      CustomData_bmesh_copy_data(
-          &pbvh->bm->ldata, &pbvh->bm->ldata, ls[0]->head.data, &l2->head.data);
+      BM_LOOPS_OF_VERT_ITER_END;
+      //*/
     }
-    BM_LOOPS_OF_VERT_ITER_END;
-    //*/
   }
 
   validate_vert_faces(pbvh, pbvh->bm, v_conn, false, true);
@@ -3750,7 +3767,17 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
   BM_log_vert_removed(pbvh->bm_log, v_del, pbvh->cd_vert_mask_offset);
 
   BLI_ghash_insert(deleted_verts, (void *)v_del, NULL);
-  BM_edge_collapse(pbvh->bm, e, v_del, true, true);
+
+  if (!snap) {
+    float co[3];
+
+    copy_v3_v3(co, v_conn->co);
+    BM_edge_collapse(pbvh->bm, e, v_del, true, true);
+    copy_v3_v3(v_conn->co, co);
+  }
+  else {
+    BM_edge_collapse(pbvh->bm, e, v_del, true, true);
+  }
 
   for (int i = 0; i < BLI_array_len(delvs); i++) {
     BMVert *v = delvs[i];
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 60901e24c2c..6a62f9b3a66 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -1530,6 +1530,11 @@ void bke_pbvh_update_vert_boundary(int cd_dyn_vert,
   BLI_array_free(fsets);
 }
 
+bool BKE_pbvh_check_vert_boundary(PBVH *pbvh, BMVert *v)
+{
+  return pbvh_check_vert_boundary(pbvh, v);
+}
+
 void BKE_pbvh_update_vert_boundary(int cd_dyn_vert,
                                    int cd_faceset_offset,
                                    BMVert *v,



More information about the Bf-blender-cvs mailing list