[Bf-blender-cvs] [268682527fd] temp_bmesh_multires: Sculpt dyntopo: added a smoothing factor for sharp boundaries

Joseph Eagar noreply at git.blender.org
Fri Aug 27 23:19:45 CEST 2021


Commit: 268682527fd90dad2b692ef96482c62070951424
Author: Joseph Eagar
Date:   Fri Aug 27 14:18:50 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB268682527fd90dad2b692ef96482c62070951424

Sculpt dyntopo: added a smoothing factor for sharp boundaries

Works by projecting non-boundary verts onto boundary vert
normals and weighting by boundary_smooth_Factor.

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

M	release/scripts/startup/bl_ui/properties_paint_common.py
M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/editors/sculpt_paint/sculpt_smooth.c
M	source/blender/makesdna/DNA_brush_types.h
M	source/blender/makesrna/intern/rna_brush.c

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

diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 8025caa8bf9..8bdfab02afb 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -567,6 +567,7 @@ def brush_settings(layout, context, brush, popover=False):
                 slider=True,
             )
 
+            box.prop(brush, "boundary_smooth_factor");
             box.prop(brush, "use_weighted_smooth")
             box.prop(brush, "preserve_faceset_boundary")
 
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index 18e3c8bcb89..e7ec51a2c62 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -2570,6 +2570,22 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
     // BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v_tri, 3);
     BMFace *f = l->f;
 
+    bool ok = true;
+
+    for (int j = 0; j < (int)deleted_faces->count; j++) {
+      if (BLI_buffer_at(deleted_faces, BMFace *, j) == f) {
+        ok = false;
+      }
+    }
+
+    if (ok) {
+      BLI_buffer_append(deleted_faces, BMFace *, f);
+    }
+    else {
+      printf("tried to add same face to deleted list twice. %x %d\n", f, f->len);
+      continue;
+    }
+
     /* Check if a face using these vertices already exists. If so,
      * skip adding this face and mark the existing one for
      * deletion as well. Prevents extraneous "flaps" from being
@@ -2580,17 +2596,17 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
     if (UNLIKELY(existing_face = bm_face_exists_tri_from_loop_vert(l->next, v_conn)))
 #  endif
     {
-      bool ok = true;
+      bool ok2 = true;
 
       // check we're not already in deleted_faces
       for (int i = 0; i < (int)deleted_faces->count; i++) {
         if (BLI_buffer_at(deleted_faces, BMFace *, i) == existing_face) {
-          ok = false;
+          ok2 = false;
           break;
         }
       }
 
-      if (ok) {
+      if (ok2) {
         BLI_buffer_append(deleted_faces, BMFace *, existing_face);
       }
     }
@@ -2638,8 +2654,6 @@ static void pbvh_bmesh_collapse_edge(PBVH *pbvh,
       CustomData_bmesh_copy_data(
           &pbvh->bm->ldata, &pbvh->bm->ldata, l->prev->head.data, &l2->prev->head.data);
     }
-
-    BLI_buffer_append(deleted_faces, BMFace *, f);
   }
   BM_LOOPS_OF_VERT_ITER_END;
 #endif
diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.c b/source/blender/editors/sculpt_paint/sculpt_smooth.c
index 10cb81abbba..2b5e07eb861 100644
--- a/source/blender/editors/sculpt_paint/sculpt_smooth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_smooth.c
@@ -82,6 +82,7 @@ void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
   bool check_fsets = ss->cache->brush->flag2 & BRUSH_SMOOTH_PRESERVE_FACE_SETS;
 
   int bflag = SCULPT_BOUNDARY_MESH | SCULPT_BOUNDARY_SHARP;
+  float bound_smooth = ss->cache->brush->boundary_smooth_factor;
 
   if (check_fsets) {
     bflag |= SCULPT_BOUNDARY_FACE_SET;
@@ -92,13 +93,18 @@ void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
   const float *co = SCULPT_vertex_co_get(ss, vertex);
   float no[3];
 
-  if (projection > 0.0f) {
+  if (true || projection > 0.0f) {
     SCULPT_vertex_normal_get(ss, vertex, no);
   }
 
   const bool weighted = (ss->cache->brush->flag2 & BRUSH_SMOOTH_USE_AREA_WEIGHT) && !is_boundary;
   float *areas;
 
+  SculptCornerType ctype = SCULPT_CORNER_MESH | SCULPT_CORNER_SHARP;
+  if (check_fsets) {
+    ctype |= SCULPT_CORNER_FACE_SET;
+  }
+
   if (weighted) {
     int val = SCULPT_vertex_valence_get(ss, vertex);
     areas = BLI_array_alloca(areas, val);
@@ -126,6 +132,15 @@ void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
         copy_v3_v3(tmp, SCULPT_vertex_co_get(ss, ni.vertex));
         ok = true;
       }
+      else {
+        float t[3];
+
+        w *= bound_smooth;
+
+        sub_v3_v3v3(t, SCULPT_vertex_co_get(ss, ni.vertex), co);
+        madd_v3_v3v3fl(tmp, co, no, dot_v3v3(t, no));
+        ok = true;
+      }
     }
     else {
       /* Interior vertices use all neighbors. */
@@ -168,6 +183,10 @@ void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
   if (projection > 0.0f) {
     add_v3_v3(result, co);
   }
+
+  if (SCULPT_vertex_is_corner(ss, vertex, ctype)) {
+    interp_v3_v3v3(result, result, co, 1.0f - bound_smooth);
+  }
 }
 
 void SCULPT_neighbor_coords_average_interior_velocity(SculptSession *ss,
@@ -691,6 +710,7 @@ static void do_smooth_brush_task_cb_ex(void *__restrict userdata,
   }
 
   bool modified = false;
+  const float bound_smooth = ss->cache->brush->boundary_smooth_factor;
 
   BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
     if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -715,7 +735,7 @@ static void do_smooth_brush_task_cb_ex(void *__restrict userdata,
     else {
       float avg[3], val[3];
 
-      if (SCULPT_vertex_is_corner(ss, vd.vertex, ctype)) {
+      if (bound_smooth == 0.0f && SCULPT_vertex_is_corner(ss, vd.vertex, ctype)) {
         continue;
       }
 
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 1f23f0eb65a..21eb29171ba 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -283,12 +283,13 @@ typedef struct Brush {
   char gpencil_sculpt_tool;
   /** Active grease pencil weight tool. */
   char gpencil_weight_tool;
-  char _pad1[6];
+  char _pad1[2];
 
   float autosmooth_factor;
   float autosmooth_radius_factor;
   float autosmooth_projection;
-  int autosmooth_spacing; //spacing for BRUSH_CUSTOM_AUTOSMOOTH_SPACING
+  int autosmooth_spacing;  // spacing for BRUSH_CUSTOM_AUTOSMOOTH_SPACING
+  float boundary_smooth_factor;
 
   float tilt_strength_factor;
 
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 8d1d362b949..0c914aab040 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -3099,6 +3099,14 @@ static void rna_def_brush(BlenderRNA *brna)
                            "to generate sharper features. ");
   RNA_def_property_update(prop, 0, "rna_Brush_update");
 
+  prop = RNA_def_property(srna, "boundary_smooth_factor", PROP_FLOAT, PROP_FACTOR);
+  RNA_def_property_float_sdna(prop, NULL, "boundary_smooth_factor");
+  RNA_def_property_float_default(prop, 0);
+  RNA_def_property_range(prop, -2.0f, 2.0f);
+  RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
+  RNA_def_property_ui_text(prop, "Boundary Smoothing", "How much to smooth sharp boundaries ");
+  RNA_def_property_update(prop, 0, "rna_Brush_update");
+
   prop = RNA_def_property(srna, "vcol_boundary_exponent", PROP_FLOAT, PROP_FACTOR);
   RNA_def_property_float_sdna(prop, NULL, "vcol_boundary_exponent");
   RNA_def_property_float_default(prop, 0);



More information about the Bf-blender-cvs mailing list