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");
 }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to