[Bf-blender-cvs] [56e2f93a3c0] temp-sculpt-cavity-mask: temp-sculpt-cavity-mask: Add another blur mode

Joseph Eagar noreply at git.blender.org
Sat Jun 25 21:51:03 CEST 2022


Commit: 56e2f93a3c0caf52a93b3b174baf033069565527
Author: Joseph Eagar
Date:   Sat Jun 25 12:48:35 2022 -0700
Branches: temp-sculpt-cavity-mask
https://developer.blender.org/rB56e2f93a3c0caf52a93b3b174baf033069565527

temp-sculpt-cavity-mask: Add another blur mode

Added second cavity mask blur mode based on
difference of two sizes of smooth kernels.

Note the code is somewhat hackish.  The
idea is for users to test both modes, after
which a decision will be made to keep one
or both modes, and the final code written.

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

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/sculpt_paint/sculpt_automasking.cc
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_sculpt_paint.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index d80d94d0186..3bde852b216 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -979,6 +979,8 @@ class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
             col.prop(sculpt, "invert_automasking_cavity", text="Invert Cavity")
             col.prop(sculpt, "automasking_cavity_factor", text="Cavity Factor")
             col.prop(sculpt, "automasking_cavity_blur_steps", text="Cavity Blur")
+            
+            col.prop(sculpt, "use_automasking_cavity_direct_blur", text="Blur Mode 2")
             col.prop(sculpt, "use_automasking_custom_cavity_curve", text="Use Curve")
 
             if sculpt.use_automasking_custom_cavity_curve:
diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.cc b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
index 64a9ad3f957..3f17cc6a247 100644
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
@@ -185,6 +185,20 @@ static float sculpt_automasking_cavity_factor_intern(SculptSession *ss,
   return (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_INVERT) ? 1.0f - factor : factor;
 }
 
+static float sculpt_automasking_cavity_factor_intern2(SculptSession *ss,
+                                                      AutomaskingCache *automasking,
+                                                      float factor)
+{
+  float sign = signf(factor);
+
+  factor = fabsf(factor) * automasking->settings.cavity_factor * 50.0f;
+
+  factor = factor * sign * 0.5f + 0.5f;
+  CLAMP(factor, 0.0f, 1.0f);
+
+  return (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_INVERT) ? 1.0f - factor : factor;
+}
+
 struct CavityBlurVert {
   int vertex;
   float dist;
@@ -207,10 +221,8 @@ struct CavityBlurVert {
   }
 };
 
-static void sculpt_calc_blurred_cavity(SculptSession *ss,
-                                       AutomaskingCache *automasking,
-                                       int steps,
-                                       int vertex)
+static void sculpt_calc_blurred_cavity(
+    SculptSession *ss, AutomaskingCache *automasking, int steps, int vertex, bool direct_blur_mode)
 {
   if (steps == 0) {
     ss->cavity_factor[vertex] = sculpt_automasking_cavity_factor_intern(ss, automasking, vertex);
@@ -219,6 +231,18 @@ static void sculpt_calc_blurred_cavity(SculptSession *ss,
     return;
   }
 
+  float sno1[3];
+  float sno2[3];
+  float sco1[3];
+  float sco2[3];
+  float len1_sum = 0.0f, len2_sum = 0.0f;
+  int sco1_num = 0, sco2_num = 0;
+
+  zero_v3(sno1);
+  zero_v3(sno2);
+  zero_v3(sco1);
+  zero_v3(sco2);
+
   Vector<CavityBlurVert, 64> queue;
   Set<int, 64> visit;
 
@@ -238,13 +262,34 @@ static void sculpt_calc_blurred_cavity(SculptSession *ss,
   factor_sum += sculpt_automasking_cavity_factor_intern(ss, automasking, vertex);
   factor_len++;
 
+  const float *co1 = SCULPT_vertex_co_get(ss, vertex);
+
   while (start != end) {
     CavityBlurVert &blurvert = queue[start];
     int v = blurvert.vertex;
     start = (start + 1) % queue.size();
 
+    float no[3];
+
+    const float *co = SCULPT_vertex_co_get(ss, v);
+    SCULPT_vertex_normal_get(ss, v, no);
+
+    float centdist = len_v3v3(co, co1);
+
+    add_v3_v3(sco1, co);
+    add_v3_v3(sno1, no);
+    len1_sum += centdist;
+    sco1_num++;
+
+    if (blurvert.depth < steps) {
+      add_v3_v3(sco2, co);
+      add_v3_v3(sno2, no);
+      len2_sum += centdist;
+      sco2_num++;
+    }
+
     if (blurvert.depth >= steps) {
-      break;
+      continue;
     }
 
     SculptVertexNeighborIter ni;
@@ -291,6 +336,44 @@ static void sculpt_calc_blurred_cavity(SculptSession *ss,
     factor_sum /= factor_len;
   }
 
+  if (sco1_num == sco2_num) {
+    printf("error! %d %d\n", sco1_num, sco2_num);
+  }
+
+  if (!sco1_num) {
+    copy_v3_v3(sco1, SCULPT_vertex_co_get(ss, vertex));
+  }
+  else {
+    mul_v3_fl(sco1, 1.0f / (float)sco1_num);
+    len1_sum /= sco1_num;
+  }
+
+  if (!sco2_num) {
+    copy_v3_v3(sco2, SCULPT_vertex_co_get(ss, vertex));
+  }
+  else {
+    mul_v3_fl(sco2, 1.0f / (float)sco2_num);
+    len2_sum /= sco2_num;
+  }
+
+  normalize_v3(sno1);
+  if (dot_v3v3(sno1, sno1) == 0.0f) {
+    SCULPT_vertex_normal_get(ss, vertex, sno1);
+  }
+
+  normalize_v3(sno2);
+  if (dot_v3v3(sno2, sno2) == 0.0f) {
+    SCULPT_vertex_normal_get(ss, vertex, sno2);
+  }
+
+  if (direct_blur_mode) {
+    float vec[3];
+    sub_v3_v3v3(vec, sco1, sco2);
+    factor_sum = dot_v3v3(vec, sno2) / len1_sum;
+
+    factor_sum = sculpt_automasking_cavity_factor_intern2(ss, automasking, factor_sum);
+  }
+
   ss->cavity_factor[vertex] = factor_sum;
   ss->cavity_stroke_id[vertex] = ss->stroke_id;
 }
@@ -300,7 +383,7 @@ static float sculpt_automasking_cavity_factor(AutomaskingCache *automasking,
                                               int vertex)
 {
   if (ss->cavity_stroke_id[vertex] != ss->stroke_id) {
-    sculpt_calc_blurred_cavity(ss, automasking, automasking->settings.cavity_blur_steps, vertex);
+    sculpt_calc_blurred_cavity(ss, automasking, automasking->settings.cavity_blur_steps, vertex, automasking->settings.cavity_blur_direct);
   }
 
   float factor = ss->cavity_factor[vertex];
@@ -556,6 +639,8 @@ static void SCULPT_automasking_cache_settings_update(AutomaskingCache *automaski
   automasking->settings.cavity_factor = sd->automasking_cavity_factor;
   automasking->settings.cavity_blur_steps = sd->automasking_cavity_blur_steps;
   automasking->settings.cavity_curve = sd->automasking_cavity_curve;
+
+  automasking->settings.cavity_blur_direct = sd->automasking_cavity_blur_direct;
 }
 
 AutomaskingCache *SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object *ob)
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 207efe0b87a..1ed5428eaf5 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -397,6 +397,7 @@ typedef struct AutomaskingSettings {
   float cavity_factor;
   int cavity_blur_steps;
   struct CurveMapping *cavity_curve;
+  bool cavity_blur_direct;
 } AutomaskingSettings;
 
 typedef struct AutomaskingCache {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 7d4535e0623..120a5808ac9 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1016,8 +1016,9 @@ typedef struct Sculpt {
 
   int automasking_cavity_blur_steps;
   float automasking_cavity_factor;
-  char _pad[4];
+  char _pad[3];
 
+  char automasking_cavity_blur_direct;
   struct CurveMapping *automasking_cavity_curve;
   struct Object *gravity_object;
 } Sculpt;
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index e37f31ffffd..c18e58db4dd 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -906,6 +906,11 @@ static void rna_def_sculpt(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Invert Cavity Mask", "Invert cavity masking.");
   RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
 
+  prop = RNA_def_property(srna, "use_automasking_cavity_direct_blur", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "automasking_cavity_blur_direct", 1);
+  RNA_def_property_ui_text(prop, "Blur Mode 2", "Blur Mode 2");
+  RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
+
   prop = RNA_def_property(srna, "invert_automasking_cavity", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "automasking_flags", BRUSH_AUTOMASKING_CAVITY_INVERT);
   RNA_def_property_ui_text(prop, "Invert Cavity Mask", "Invert cavity masking.");



More information about the Bf-blender-cvs mailing list