[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