[Bf-blender-cvs] [151cf0b9d92] sculpt-dev: Sculpt IPMask: Implement filter selection

Pablo Dobarro noreply at git.blender.org
Fri Feb 26 14:59:01 CET 2021


Commit: 151cf0b9d929bf1b4626f9dae935897cd41b0bba
Author: Pablo Dobarro
Date:   Fri Feb 26 00:43:46 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rB151cf0b9d929bf1b4626f9dae935897cd41b0bba

Sculpt IPMask: Implement filter selection

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/sculpt_paint/sculpt_filter_mask.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index e04c87af2ec..3dfebcb45ac 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1484,7 +1484,7 @@ class _defs_sculpt:
     def ipmask_filter():
         def draw_settings(_context, layout, tool):
             props = tool.operator_properties("sculpt.ipmask_filter")
-            layout.prop(props, "type", expand=False)
+            layout.prop(props, "filter_type", expand=False)
 
         return dict(
             idname="builtin.ipmask_filter",
diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mask.c b/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
index bf84a4919e9..7f46cdd4c48 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
@@ -326,13 +326,20 @@ void SCULPT_OT_mask_filter(struct wmOperatorType *ot)
 #define SCULPT_IPMASK_FILTER_GRANULARITY 1000
 
 typedef enum eSculptIPMaskFilterType {
-  MASK_FILTER_SMOOTH_SHARPEN,
-  MASK_FILTER_GROW_SHRINK,
-  MASK_FILTER_CONTRAST_INCREASE_DECREASE,
-  MASK_FILTER_INTENSITY_INCREASE_DECREASE,
-  MASK_FILTER_LINEAR_INTENSITY_INCREASE_DECREASE,
+  IPMASK_FILTER_SMOOTH_SHARPEN,
+  IPMASK_FILTER_GROW_SHRINK,
+  IPMASK_FILTER_CONTRAST_INCREASE_DECREASE,
+  IPMASK_FILTER_INTENSITY_INCREASE_DECREASE,
+  IPMASK_FILTER_LINEAR_INTENSITY_INCREASE_DECREASE,
 } eSculptIPMaskFilterType;
 
+static EnumPropertyItem prop_ipmask_filter_types[] = {
+    {IPMASK_FILTER_SMOOTH_SHARPEN, "SMOOTH_SHARPEN", 0, "Smooth/Sharpen", "Smooth and sharpen the mask"},
+    {IPMASK_FILTER_GROW_SHRINK, "GROW_SHRINK", 0, "Grow/Shrink", "Grow and shirnk the mask"},
+    {0, NULL, 0, NULL, NULL},
+};
+
+
 typedef enum MaskFilterStepDirectionType {
     MASK_FILTER_STEP_DIRECTION_FORWARD,
     MASK_FILTER_STEP_DIRECTION_BACKWARD,
@@ -345,7 +352,7 @@ typedef struct MaskFilterDeltaStep {
 } MaskFilterDeltaStep;
 
 /* Grown/Shrink vertex callbacks. */
-static float sculpt_ipmask_vertex_grow_cb(SculptSession *ss, const int vertex, const float *current_mask) {
+static float sculpt_ipmask_vertex_grow_cb(SculptSession *ss, const int vertex,  float *current_mask) {
         float max = 0.0f;
         SculptVertexNeighborIter ni;
         SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
@@ -358,7 +365,7 @@ static float sculpt_ipmask_vertex_grow_cb(SculptSession *ss, const int vertex, c
         return max;
 }
 
-static float sculpt_ipmask_vertex_shrink_cb(SculptSession *ss, const int vertex, const float *current_mask) {
+static float sculpt_ipmask_vertex_shrink_cb(SculptSession *ss, const int vertex,  float *current_mask) {
         float min = 1.0f;
         SculptVertexNeighborIter ni;
         SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
@@ -372,7 +379,7 @@ static float sculpt_ipmask_vertex_shrink_cb(SculptSession *ss, const int vertex,
 }
 
 /* Smooth/Sharpen vertex callbacks. */
-static float sculpt_ipmask_vertex_smooth_cb(SculptSession *ss, const int vertex, const float *current_mask) {
+static float sculpt_ipmask_vertex_smooth_cb(SculptSession *ss, const int vertex,  float *current_mask) {
   float accum = 0.0f;
   int total = 0;
   SculptVertexNeighborIter ni;
@@ -384,7 +391,7 @@ static float sculpt_ipmask_vertex_smooth_cb(SculptSession *ss, const int vertex,
   return total > 0? accum/total : current_mask[vertex];
 }
 
-static float sculpt_ipmask_vertex_sharpen_cb(SculptSession *ss, const int vertex, const float *current_mask) {
+static float sculpt_ipmask_vertex_sharpen_cb(SculptSession *ss, const int vertex, float *current_mask) {
   float accum = 0.0f;
   int total = 0;
   float vmask = current_mask[vertex];
@@ -449,10 +456,10 @@ static void ipmask_filter_compute_step_task_cb(void *__restrict userdata,
 {
   SculptIPMaskFilterTaskData *data = userdata;
         if (data->direction == MASK_FILTER_STEP_DIRECTION_FORWARD) {
-            data->next_mask[i] = sculpt_ipmask_vertex_grow_cb(data->ss, i, data->current_mask);
+            data->next_mask[i] = data->ss->filter_cache->mask_filter_step_forward(data->ss, i, data->current_mask);
         }
         else {
-            data->next_mask[i] = sculpt_ipmask_vertex_shrink_cb(data->ss, i, data->current_mask);
+            data->next_mask[i] = data->ss->filter_cache->mask_filter_step_backward(data->ss, i, data->current_mask);
         }
 }
 
@@ -623,7 +630,6 @@ static int sculpt_ipmask_filter_invoke(bContext *C, wmOperator *op, const wmEven
   Object *ob = CTX_data_active_object(C);
   Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
   SculptSession *ss = ob->sculpt;
-  const int mode = RNA_enum_get(op->ptr, "type");
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
   PBVH *pbvh = ob->sculpt->pbvh;
 
@@ -648,7 +654,17 @@ static int sculpt_ipmask_filter_invoke(bContext *C, wmOperator *op, const wmEven
 
   filter_cache->mask_delta_step = BLI_ghash_int_new("mask filter delta steps");
 
-
+  const int filter_type= RNA_enum_get(op->ptr, "filter_type");
+  switch (filter_type) {
+    case IPMASK_FILTER_SMOOTH_SHARPEN:
+      filter_cache->mask_filter_step_forward = sculpt_ipmask_vertex_smooth_cb;
+      filter_cache->mask_filter_step_backward = sculpt_ipmask_vertex_sharpen_cb;
+      break;
+    case IPMASK_FILTER_GROW_SHRINK:
+      filter_cache->mask_filter_step_forward = sculpt_ipmask_vertex_grow_cb;
+      filter_cache->mask_filter_step_backward = sculpt_ipmask_vertex_shrink_cb;
+      break;
+  }
 
   WM_event_add_modal_handler(C, op);
   return OPERATOR_RUNNING_MODAL;
@@ -677,8 +693,8 @@ void SCULPT_OT_ipmask_filter(struct wmOperatorType *ot)
   /* RNA. */
   RNA_def_enum(ot->srna,
                "filter_type",
-               prop_mask_filter_types,
-               MASK_FILTER_SMOOTH,
+               prop_ipmask_filter_types,
+               IPMASK_FILTER_GROW_SHRINK,
                "Type",
                "Filter that is going to be applied to the mask");
   RNA_def_int(ot->srna,
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index d8a2880d7cc..3d289bb13e2 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -1294,6 +1294,9 @@ typedef struct ExpandCache {
   float (*original_colors)[4];
 } ExpandCache;
 
+/* IPMask filter vertex callback function. */
+typedef float(SculptIPMaskFilterStepVertexCB)(struct SculptSession *, int, float *);
+
 typedef struct FilterCache {
   bool enabled_axis[3];
   bool enabled_force_axis[3];
@@ -1363,6 +1366,8 @@ typedef struct FilterCache {
 
   /* Mask Filter. */
   int mask_filter_current_step;
+  SculptIPMaskFilterStepVertexCB *mask_filter_step_forward;
+  SculptIPMaskFilterStepVertexCB *mask_filter_step_backward;
 
   GHash *mask_delta_step;



More information about the Bf-blender-cvs mailing list