[Bf-blender-cvs] [75b1f625dd6] sculpt-mode-features: Mask tools: Option to mask only front faces with lasso mask
Pablo Dobarro
noreply at git.blender.org
Tue Mar 19 02:15:44 CET 2019
Commit: 75b1f625dd684c2a04d0b647a6e866f052b3fb90
Author: Pablo Dobarro
Date: Tue Mar 19 02:13:59 2019 +0100
Branches: sculpt-mode-features
https://developer.blender.org/rB75b1f625dd684c2a04d0b647a6e866f052b3fb90
Mask tools: Option to mask only front faces with lasso mask
It still needs to be added to the keymap or as a tool setting.
===================================================================
M source/blender/editors/sculpt_paint/paint_mask.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index 2f9706db636..c08ae425395 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -93,6 +93,9 @@ typedef struct MaskTaskData {
PaintMaskFloodMode mode;
float value;
float (*clip_planes_final)[4];
+ bool front_faces_only;
+ float trueViewDir[3];
+ float viewDir[3];
} MaskTaskData;
static void mask_flood_fill_task_cb(
@@ -391,10 +394,14 @@ static void mask_gesture_lasso_task_cb(
const float value = data->value;
PBVHVertexIter vi;
+ float vertex_normal[3];
bool any_masked = false;
BKE_pbvh_vertex_iter_begin(data->pbvh, node, vi, PBVH_ITER_UNIQUE) {
- if (is_effected_lasso(lasso_data, vi.co)) {
+ normal_short_to_float_v3(vertex_normal, vi.no);
+ float dp = dot_v3v3(lasso_data->task_data.viewDir, vertex_normal);
+ if (!lasso_data->task_data.front_faces_only) dp = 1;
+ if (is_effected_lasso(lasso_data, vi.co) && dp > 0) {
if (!any_masked) {
any_masked = true;
@@ -460,6 +467,20 @@ static int paint_mask_gesture_lasso_exec(bContext *C, wmOperator *op)
sculpt_undo_push_begin("Mask lasso fill");
+ data.task_data.front_faces_only = RNA_boolean_get(op->ptr, "front_faces_only");
+ float imat[4][4];
+ float mat[4][4];
+ float viewDir[3] = {0.0f, 0.0f, 1.0f};
+ if (data.task_data.front_faces_only) {
+ invert_m4_m4(imat, ob->obmat);
+ copy_m3_m4(mat, vc.rv3d->viewinv);
+ mul_m3_v3(mat, viewDir);
+ copy_m3_m4(mat, ob->imat);
+ mul_m3_v3(mat, viewDir);
+ normalize_v3_v3(data.task_data.viewDir, viewDir);
+ copy_v3_v3(data.task_data.trueViewDir, data.task_data.viewDir);
+ }
+
for (symmpass = 0; symmpass <= symm; ++symmpass) {
if ((symmpass == 0) ||
(symm & symmpass &&
@@ -471,6 +492,7 @@ static int paint_mask_gesture_lasso_exec(bContext *C, wmOperator *op)
/* flip the planes symmetrically as needed */
for (; j < 4; j++) {
flip_plane(clip_planes_final[j], clip_planes[j], symmpass);
+ flip_v3_v3(data.task_data.viewDir, data.task_data.trueViewDir, symmpass);
}
data.symmpass = symmpass;
@@ -534,4 +556,5 @@ void PAINT_OT_mask_lasso_gesture(wmOperatorType *ot)
RNA_def_enum(ot->srna, "mode", mode_items, PAINT_MASK_FLOOD_VALUE, "Mode", NULL);
RNA_def_float(ot->srna, "value", 1.0, 0, 1.0, "Value",
"Mask level to use when mode is 'Value'; zero means no masking and one is fully masked", 0, 1);
+ RNA_def_boolean(ot->srna, "front_faces_only", true, "Front faces only", "Affect only faces facing towards the view");
}
More information about the Bf-blender-cvs
mailing list