Commit: 72533b087acc69ae1f4fa6ec750ca50979ae278f
Author: Darshan Kadu
Date:   Tue Jun 13 14:04:55 2017 +0530
Branches: soc-2017-vertex_paint
https://developer.blender.org/rB72533b087acc69ae1f4fa6ec750ca50979ae278f

added vertex mask feature

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

M       release/scripts/startup/bl_ui/space_view3d.py
M       source/blender/blenkernel/intern/paint.c
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/editors/space_view3d/view3d_header.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py 
b/release/scripts/startup/bl_ui/space_view3d.py
index 9245def7473..643a4b8cc00 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -170,7 +170,7 @@ class VIEW3D_MT_editor_menus(Menu):
             mesh = obj.data
             if mesh.use_paint_mask:
                 layout.menu("VIEW3D_MT_select_paint_mask")
-            elif mesh.use_paint_mask_vertex and mode_string == 'PAINT_WEIGHT':
+            elif mesh.use_paint_mask_vertex and (mode_string == 'PAINT_WEIGHT' 
or mode_string == 'PAINT_VERTEX'):
                 layout.menu("VIEW3D_MT_select_paint_mask_vertex")
         elif mode_string != 'SCULPT':
             layout.menu("VIEW3D_MT_select_%s" % mode_string.lower())
diff --git a/source/blender/blenkernel/intern/paint.c 
b/source/blender/blenkernel/intern/paint.c
index b8dbfc6f71b..e56db89097d 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -452,7 +452,7 @@ bool BKE_paint_select_vert_test(Object *ob)
                 (ob->type == OB_MESH) &&
                 (ob->data != NULL) &&
                 (((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_VERT_SEL) &&
-                (ob->mode & OB_MODE_WEIGHT_PAINT)
+                (ob->mode & OB_MODE_WEIGHT_PAINT || ob->mode & 
OB_MODE_VERTEX_PAINT)
                 );
 }
 
@@ -670,6 +670,7 @@ void BKE_sculptsession_free_vwpaint_data(struct 
SculptSession *ss)
        MEM_SAFE_FREE(ss->modes.vwpaint.total_weight);
        MEM_SAFE_FREE(ss->modes.vwpaint.max_weight);
        MEM_SAFE_FREE(ss->modes.vwpaint.previous_color);
+       MEM_SAFE_FREE(ss->modes.vwpaint.previous_accum);
 }
 
 /* Write out the sculpt dynamic-topology BMesh to the Mesh */
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index 53d67dd1c0c..7fe05644a46 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -3362,6 +3362,9 @@ static int vpaint_mode_toggle_exec(bContext *C, 
wmOperator *op)
                if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
                        BKE_mesh_flush_select_from_polys(me);
                }
+               else if (me->editflag & ME_EDIT_PAINT_VERT_SEL) {
+                       BKE_mesh_flush_select_from_verts(me);
+               }
 
                /* If the cache is not released by a cancel or a done, free it 
now. */
                if (ob->sculpt->cache) {
@@ -3556,6 +3559,7 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
        char *col;
        data->ob->sculpt->modes.vwpaint.tot_loops_hit[n] = 0;
        const bool use_face_sel = (data->me->editflag & ME_EDIT_PAINT_FACE_SEL) 
!= 0;
+       const bool use_vert_sel = (data->me->editflag & ME_EDIT_PAINT_VERT_SEL) 
!= 0;
 
        SculptBrushTest test;
        sculpt_brush_test_init(ss, &test);
@@ -3570,7 +3574,9 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
                        if (BKE_brush_curve_strength(data->brush, test.dist, 
cache->radius) > 0.0) {
                                /* If the vertex is selected for painting. */
                                const MVert *mv = &data->me->mvert[v_index];
-                               if (!use_face_sel || mv->flag & SELECT) {
+                               const bool v_flag = 
data->me->mvert[v_index].flag;
+
+                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT) {
                                        ss->modes.vwpaint.tot_loops_hit[n] += 
ss->modes.vwpaint.vert_to_loop[v_index].count;
                                        /* if a vertex is within the brush 
region, then add it's color to the blend. */
                                        for (int j = 0; j < 
ss->modes.vwpaint.vert_to_loop[v_index].count; j++) {
@@ -3626,6 +3632,7 @@ static void do_vpaint_brush_draw_task_cb_ex(
        float brush_size_pressure, brush_alpha_value, brush_alpha_pressure;
        get_brush_alpha_data(scene, ss, brush, &brush_size_pressure, 
&brush_alpha_value, &brush_alpha_pressure);
        const bool use_face_sel = (data->me->editflag & ME_EDIT_PAINT_FACE_SEL) 
!= 0;
+       const bool use_vert_sel = (data->me->editflag & ME_EDIT_PAINT_VERT_SEL) 
!= 0;
 
        SculptBrushTest test;
        sculpt_brush_test_init(ss, &test);
@@ -3642,9 +3649,10 @@ static void do_vpaint_brush_draw_task_cb_ex(
                        const int v_index = ccgdm ? 
data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
                        const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 
1.0f;
                        const MVert *mv = &data->me->mvert[v_index];
+                       const bool v_flag = data->me->mvert[v_index].flag;
 
                        /* If the vertex is selected for painting. */
-                       if (!use_face_sel || mv->flag & SELECT) {
+                       if (!(use_face_sel || use_vert_sel) || v_flag & SELECT) 
{
                                /* Calc the dot prod. between ray norm on surf 
and current vert
                                 * (ie splash prevention factor), and only 
paint front facing verts. */
                                const float view_dot = (vd.no) ? 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no) : 1.0;
@@ -3711,6 +3719,7 @@ static void do_vpaint_brush_blur_task_cb_ex(
        float brush_size_pressure, brush_alpha_value, brush_alpha_pressure;
        get_brush_alpha_data(scene, ss, brush, &brush_size_pressure, 
&brush_alpha_value, &brush_alpha_pressure);
        const bool use_face_sel = (data->me->editflag & ME_EDIT_PAINT_FACE_SEL) 
!= 0;
+       const bool use_vert_sel = (data->me->editflag & ME_EDIT_PAINT_VERT_SEL) 
!= 0;
 
        SculptBrushTest test;
        sculpt_brush_test_init(ss, &test);
@@ -3726,13 +3735,14 @@ static void do_vpaint_brush_blur_task_cb_ex(
                        const int v_index = ccgdm ? 
data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
                        const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 
1.0f;
                        const MVert *mv = &data->me->mvert[v_index];
+                       const bool v_flag = data->me->mvert[v_index].flag;
 
                        const float view_dot = (vd.no) ? 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no) : 1.0;
                        if (view_dot > 0.0f) {
                                const float brush_fade = 
BKE_brush_curve_strength(brush, test.dist, cache->radius);
 
                                /* If the vertex is selected for painting. */
-                               if (!use_face_sel || mv->flag & SELECT) {
+                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT) {
                                        /* Get the average poly color */
                                        unsigned int color_final = 0;
                                        int total_hit_loops = 0;
@@ -3807,6 +3817,7 @@ static void do_vpaint_brush_smear_task_cb_ex(
        get_brush_alpha_data(scene, ss, brush, &brush_size_pressure, 
&brush_alpha_value, &brush_alpha_pressure);
        float brush_dir[3];
        const bool use_face_sel = (data->me->editflag & ME_EDIT_PAINT_FACE_SEL) 
!= 0;
+       const bool use_vert_sel = (data->me->editflag & ME_EDIT_PAINT_VERT_SEL) 
!= 0;
 
        sub_v3_v3v3(brush_dir, cache->location, cache->last_location);
        if (normalize_v3(brush_dir) != 0.0f) {
@@ -3825,9 +3836,10 @@ static void do_vpaint_brush_smear_task_cb_ex(
                                const int v_index = ccgdm ? 
data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
                                const float grid_alpha = ccgdm ? 1.0f / 
vd.gridsize : 1.0f;
                                const MVert *mv_curr = 
&data->me->mvert[v_index];
+                               const bool v_flag = 
data->me->mvert[v_index].flag;
 
                                /* if the vertex is selected for painting. */
-                               if (!use_face_sel || mv_curr->flag & SELECT) {
+                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT) {
                                        /* Calc the dot prod. between ray norm 
on surf and current vert
                                        (ie splash prevention factor), and only 
paint front facing verts. */
                                        const float view_dot = (vd.no) ? 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no) : 1.0;
diff --git a/source/blender/editors/space_view3d/view3d_header.c 
b/source/blender/editors/space_view3d/view3d_header.c
index bf1bdf68619..70caee66b29 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -350,7 +350,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext 
*C)
                        PointerRNA meshptr;
 
                        RNA_pointer_create(ob->data, &RNA_Mesh, ob->data, 
&meshptr);
-                       if (ob->mode & (OB_MODE_TEXTURE_PAINT | 
OB_MODE_VERTEX_PAINT)) {
+                       if (ob->mode & (OB_MODE_TEXTURE_PAINT)) {
                                uiItemR(layout, &meshptr, "use_paint_mask", 
UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
                        }
                        else {

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

Reply via email to