[Bf-blender-cvs] [371a6799c44] sculpt-dev: Sculpt-dev: Fix local collpase mode

Joseph Eagar noreply at git.blender.org
Mon Mar 14 22:20:04 CET 2022


Commit: 371a6799c443e30dcff9fe3017453f198871c16b
Author: Joseph Eagar
Date:   Mon Mar 14 14:19:23 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB371a6799c443e30dcff9fe3017453f198871c16b

Sculpt-dev: Fix local collpase mode

* Also disabled "cleanup" mode, need to rewrite
  the vertex dissolve func it uses.

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

M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_brush_types.c
M	source/blender/editors/space_file/fsmenu.c

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

diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index 637d73b3efc..353c4ca202e 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -198,7 +198,7 @@ static void edge_queue_create_local(struct EdgeQueueContext *eq_ctx,
                                     float radius,
                                     const bool use_frontface,
                                     const bool use_projected,
-                                    bool is_collapse);
+                                    PBVHTopologyUpdateMode local_mode);
 
 void bmesh_disk_edge_append(BMEdge *e, BMVert *v);
 void bmesh_radial_loop_append(BMEdge *e, BMLoop *l);
@@ -1449,7 +1449,11 @@ typedef struct EdgeQueueContext {
 
   MinMaxHeap *heap_mm;
   int max_heap_mm;
-  TableGSet *used_verts;
+  // TableGSet *used_verts;
+  BMVert **used_verts;
+  int used_verts_size;
+  int tot_used_verts;
+
   float view_normal[3];
   bool use_view_normal;
   float limit_min, limit_max, limit_mid;
@@ -1457,8 +1461,10 @@ typedef struct EdgeQueueContext {
   const float *center;
   float center_proj[3]; /* for when we use projected coords. */
   float radius_squared;
-  float limit_len;
-  float limit_len_squared;
+  float limit_len_min;
+  float limit_len_max;
+  float limit_len_min_sqr;
+  float limit_len_max_sqr;
 
   bool (*edge_queue_tri_in_range)(const struct EdgeQueueContext *q, BMVert *vs[3], float no[3]);
   bool (*edge_queue_vert_in_range)(const struct EdgeQueueContext *q, BMVert *v);
@@ -1505,18 +1511,42 @@ static void edge_queue_insert_unified(EdgeQueueContext *eq_ctx, BMEdge *e)
 {
   if (/*BLI_mm_heap_len(eq_ctx->heap_mm) < eq_ctx->max_heap_mm &&*/ !(e->head.hflag &
                                                                       BM_ELEM_TAG)) {
-    float len = len_squared_v3v3(e->v1->co, e->v2->co);
+    float lensqr = len_squared_v3v3(e->v1->co, e->v2->co);
+
+    float len = sqrtf(lensqr);
+
+    eq_ctx->avg_elen += len;
+    eq_ctx->min_elen = min_ff(eq_ctx->min_elen, len);
+    eq_ctx->max_elen = max_ff(eq_ctx->max_elen, len);
+    eq_ctx->totedge++;
 
-    len += (BLI_thread_frand(0) - 0.5f) * 0.1 * eq_ctx->limit_mid;
+    // lensqr += (BLI_thread_frand(0) - 0.5f) * 0.1 * eq_ctx->limit_mid;
 
-    BLI_mm_heap_insert(eq_ctx->heap_mm, len, e);
+    BLI_mm_heap_insert(eq_ctx->heap_mm, lensqr, e);
     e->head.hflag |= BM_ELEM_TAG;
   }
 }
 
 static void edge_queue_insert_val34_vert(EdgeQueueContext *eq_ctx, BMVert *v)
 {
-  BLI_table_gset_add(eq_ctx->used_verts, v);
+  // BLI_table_gset_add(eq_ctx->used_verts, v);
+  eq_ctx->tot_used_verts++;
+
+  if (!eq_ctx->used_verts || eq_ctx->tot_used_verts > eq_ctx->used_verts_size) {
+    int newlen = (eq_ctx->tot_used_verts + 1);
+    newlen += newlen >> 1;
+
+    eq_ctx->used_verts_size = newlen;
+    if (eq_ctx->used_verts) {
+      eq_ctx->used_verts = (BMVert **)MEM_reallocN(eq_ctx->used_verts, newlen * sizeof(BMVert *));
+    }
+    else {
+      eq_ctx->used_verts = (BMVert **)MEM_malloc_arrayN(
+          newlen, sizeof(BMVert *), "eq_ctx->used_verts");
+    }
+  }
+
+  eq_ctx->used_verts[eq_ctx->tot_used_verts - 1] = v;
 }
 
 BLI_INLINE float calc_curvature_weight(EdgeQueueContext *eq_ctx, BMVert *v1, BMVert *v2)
@@ -1841,12 +1871,12 @@ static void long_edge_queue_face_add(EdgeQueueContext *eq_ctx, BMFace *f, bool i
 
       float len_sq = calc_edge_length(eq_ctx, l_iter->e->v1, l_iter->e->v2);
 
-      if (len_sq > eq_ctx->limit_len_squared) {
+      if (len_sq > eq_ctx->limit_len_max_sqr) {
         long_edge_queue_edge_add_recursive(eq_ctx,
                                            l_iter->radial_next,
                                            l_iter,
                                            len_sq,
-                                           eq_ctx->limit_len,
+                                           eq_ctx->limit_len_max,
                                            DEPTH_START_LIMIT +
                                                1);  // ignore_frontface ? 0 : DEPTH_START_LIMIT+1);
       }
@@ -2039,9 +2069,9 @@ static void unified_edge_queue_task_cb(void *__restrict userdata,
 
         /* subdivide walks the mesh a bit for better transitions in the topology */
 
-        if ((eq_ctx->mode & PBVH_Subdivide) && (len_sq > eq_ctx->limit_len_squared)) {
+        if ((eq_ctx->mode & PBVH_Subdivide) && (len_sq > eq_ctx->limit_len_max_sqr)) {
           long_edge_queue_edge_add_recursive_2(
-              tdata, l_iter->radial_next, l_iter, len_sq, eq_ctx->limit_len, 0, true);
+              tdata, l_iter->radial_next, l_iter, len_sq, eq_ctx->limit_len_max, 0, true);
         }
 
         if (edge_queue_test(eq_ctx, pbvh, l_iter->e)) {
@@ -2468,6 +2498,8 @@ static void edge_queue_init(EdgeQueueContext *eq_ctx,
   eq_ctx->center = center;
   copy_v3_v3(eq_ctx->view_normal, view_normal);
   eq_ctx->radius_squared = radius * radius;
+  eq_ctx->limit_len_min_sqr = eq_ctx->limit_len_min * eq_ctx->limit_len_min;
+  eq_ctx->limit_len_max_sqr = eq_ctx->limit_len_max * eq_ctx->limit_len_max;
 
 #ifdef USE_EDGEQUEUE_FRONTFACE
   eq_ctx->use_view_normal = use_frontface;
@@ -2479,8 +2511,8 @@ static void edge_queue_init(EdgeQueueContext *eq_ctx,
 static bool edge_queue_test(EdgeQueueContext *eq_ctx, PBVH *pbvh, BMEdge *e)
 {
   float len = len_squared_v3v3(e->v1->co, e->v2->co);
-  float min = pbvh->bm_min_edge_len * pbvh->bm_min_edge_len;
-  float max = pbvh->bm_max_edge_len * pbvh->bm_max_edge_len;
+  float min = eq_ctx->limit_len_min_sqr;
+  float max = eq_ctx->limit_len_max_sqr;
 
   bool ret = false;
 
@@ -2511,20 +2543,18 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
                                       float radius,
                                       const bool use_frontface,
                                       const bool use_projected,
-                                      const bool local_mode)
+                                      PBVHTopologyUpdateMode local_mode)
 {
   if (local_mode) {
     edge_queue_create_local(
-        eq_ctx, pbvh, center, view_normal, radius, use_frontface, use_projected, false);
+        eq_ctx, pbvh, center, view_normal, radius, use_frontface, use_projected, local_mode);
     return;
   }
 
   eq_ctx->radius_squared = radius * radius;
-  eq_ctx->limit_len_squared = pbvh->bm_max_edge_len * pbvh->bm_max_edge_len;
 
-#ifdef USE_EDGEQUEUE_EVEN_SUBDIV
-  eq_ctx->limit_len = pbvh->bm_max_edge_len;
-#endif
+  eq_ctx->limit_len_min = pbvh->bm_min_edge_len;
+  eq_ctx->limit_len_max = pbvh->bm_max_edge_len;
 
   edge_queue_init(eq_ctx, use_projected, use_frontface, center, view_normal, radius);
 
@@ -2597,6 +2627,9 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
     }
   }
 
+  BMVert **verts = NULL;
+  BLI_array_declare(verts);
+
   for (int i = 0; i < count; i++) {
     EdgeQueueThreadData *td = tdata + i;
 
@@ -2626,6 +2659,7 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
       if (mv1->flag & SCULPTVERT_NEED_VALENCE) {
         BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)e->v1});
       }
+
       if (mv2->flag & SCULPTVERT_NEED_VALENCE) {
         BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)e->v2});
       }
@@ -2643,6 +2677,12 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
         return;
       }
 
+      BLI_array_append(verts, e->v1);
+      BLI_array_append(verts, e->v2);
+
+      e->v1->head.hflag |= BM_ELEM_TAG;
+      e->v2->head.hflag |= BM_ELEM_TAG;
+
       if (edge_queue_test(eq_ctx, pbvh, e)) {
         edge_queue_insert_unified(eq_ctx, e);
       }
@@ -2654,6 +2694,18 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
   }
   BLI_array_free(tdata);
 
+  for (int i = 0; i < BLI_array_len(verts); i++) {
+    BMVert *v = verts[i];
+
+    if (v->head.hflag & BM_ELEM_TAG) {
+      v->head.hflag &= ~BM_ELEM_TAG;
+
+      edge_queue_insert_val34_vert(eq_ctx, v);
+    }
+  }
+
+  BLI_array_free(verts);
+
   if (push_subentry) {
     BM_log_entry_add_ex(pbvh->bm, pbvh->bm_log, true);
   }
@@ -2698,12 +2750,14 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
                                     float radius,
                                     const bool use_frontface,
                                     const bool use_projected,
-                                    bool is_collapse)
+                                    PBVHTopologyUpdateMode local_mode)
 {
-  eq_ctx->limit_len = pbvh->bm_min_edge_len;
-  eq_ctx->limit_len_squared = eq_ctx->limit_len * eq_ctx->limit_len;
+  eq_ctx->limit_len_min = pbvh->bm_min_edge_len;
+  eq_ctx->limit_len_max = pbvh->bm_max_edge_len;
   eq_ctx->local_mode = true;
 
+  float oldlimit = pbvh->bm_min_edge_len;
+
   edge_queue_init(eq_ctx, use_projected, use_frontface, center, view_normal, radius);
 
   EdgeQueueThreadData *tdata = NULL;
@@ -2718,7 +2772,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
       memset(&td, 0, sizeof(td));
       td.pbvh = pbvh;
       td.node = node;
-      td.is_collapse = is_collapse;
+      td.is_collapse = local_mode & PBVH_LocalCollapse;
       td.eq_ctx = eq_ctx;
 
       BLI_array_append(tdata, td);
@@ -2780,7 +2834,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
     for (int j = 0; j < 2; j++) {
       BMVert *v = j ? e->v2 : e->v1;
 
-      if (!is_collapse) {
+      if (!(local_mode & PBVH_LocalCollapse)) {
         if (!(v->head.hflag & BM_ELEM_TAG)) {
           v->head.hflag |= BM_ELEM_TAG;
           MSculptVert *mv = BKE_PBVH_SCULPTVERT(pbvh->cd_sculpt_vert, v);
@@ -2788,6 +2842,8 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
           if (mv->flag & SCULPTVERT_NEED_VALENCE) {
             BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)v});
           }
+
+          edge_queue_insert_val34_vert(eq_ctx, v);
         }
       }
     }
@@ -2816,7 +2872,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
     edges[i]->head.hflag |= BM_ELEM_TAG;
   }
 
-  int totstep = is_collapse ? 3 : 3;
+  int totstep 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list