Commit: 39a2294d38b0e740dbef47b423b78141d5a6d5a0
Author: Darshan Kadu
Date:   Thu Jun 22 15:55:08 2017 +0530
Branches: soc-2017-vertex_paint
https://developer.blender.org/rB39a2294d38b0e740dbef47b423b78141d5a6d5a0

added the non-occluded mode

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

M       release/scripts/startup/bl_ui/space_view3d_toolbar.py
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/makesdna/DNA_scene_types.h
M       source/blender/makesrna/intern/rna_sculpt_paint.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py 
b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index fa7ab428b08..c4085e4867d 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1797,6 +1797,7 @@ class VIEW3D_PT_tools_vertexpaint(Panel, 
View3DPaintPanel):
         # col.prop(vpaint, "mode", text="")
         row.prop(vpaint, "use_normal")
         col.prop(vpaint, "use_spray")
+        col.prop(vpaint, "use_occlude")
 
         self.unified_paint_settings(col, context)
 
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index 7fe05644a46..75f7b2745ca 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -934,7 +934,7 @@ BLI_INLINE unsigned int mcol_exclusion(unsigned int col1, 
unsigned int col2, int
 BLI_INLINE unsigned int mcol_luminocity(unsigned int col1, unsigned int col2, 
int fac)
 {
        unsigned char *cp1, *cp2, *cp;
-       int mfac, temp;
+       int mfac;
        unsigned int col = 0;
 
        if (fac == 0) {
@@ -966,7 +966,7 @@ BLI_INLINE unsigned int mcol_luminocity(unsigned int col1, 
unsigned int col2, in
 BLI_INLINE unsigned int mcol_saturation(unsigned int col1, unsigned int col2, 
int fac)
 {
        unsigned char *cp1, *cp2, *cp;
-       int mfac, temp;
+       int mfac;
        unsigned int col = 0;
 
        if (fac == 0) {
@@ -1000,7 +1000,7 @@ BLI_INLINE unsigned int mcol_saturation(unsigned int 
col1, unsigned int col2, in
 BLI_INLINE unsigned int mcol_hue(unsigned int col1, unsigned int col2, int fac)
 {
        unsigned char *cp1, *cp2, *cp;
-       int mfac, temp;
+       int mfac;
        unsigned int col = 0;
 
        if (fac == 0) {
@@ -3617,6 +3617,21 @@ static void handle_texture_brush(
        rgb_float_to_uchar((unsigned char *)r_color, rgba_br);
 }
 
+static bool is_non_occluded(StrokeCache *cache, PBVHVertexIter vd,
+                   float *dist, const float radius, const bool do_occlude) 
+{
+       if (cache->vc->ar && !do_occlude) {
+               float sco[2];
+               ED_view3d_project_float_v2_m4(cache->vc->ar, vd.co, sco, 
cache->projection_mat);
+               const float dist_sq = len_squared_v2v2(cache->mouse, sco);
+               *dist = sqrtf(dist_sq);
+               if (dist_sq <= radius*radius) {
+                       return true;
+               }
+       }
+       return false;
+}
+
 static void do_vpaint_brush_draw_task_cb_ex(
         void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
UNUSED(thread_id))
 {
@@ -3633,6 +3648,9 @@ static void do_vpaint_brush_draw_task_cb_ex(
        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;
+       float dist;
+       bool non_occlude;
+       const float radius = BKE_brush_size_get(scene, brush);
 
        SculptBrushTest test;
        sculpt_brush_test_init(ss, &test);
@@ -3641,8 +3659,11 @@ static void do_vpaint_brush_draw_task_cb_ex(
        PBVHVertexIter vd;
        BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
        {
-               /* Test to see if the vertex coordinates are within the 
spherical brush region. */
-               if (sculpt_brush_test(&test, vd.co)) {
+               const bool do_occlude = data->vp->flag&VP_OCCLUDE ? 1 : 0;
+               non_occlude = is_non_occluded(cache, vd, &dist, radius, 
do_occlude);
+               /* Test to see if the vertex coordinates are within the 
spherical brush region or 
+               *  occluded vertex for non-occluded mode. */
+               if (sculpt_brush_test(&test, vd.co) || non_occlude) {
                        /* Note: Grids are 1:1 with corners (aka loops).
                         * For grid based pbvh, take the vert whose loop 
cooresponds to the current grid.
                         * Otherwise, take the current vert. */
@@ -3652,13 +3673,14 @@ static void do_vpaint_brush_draw_task_cb_ex(
                        const bool v_flag = data->me->mvert[v_index].flag;
 
                        /* If the vertex is selected for painting. */
-                       if (!(use_face_sel || use_vert_sel) || v_flag & SELECT) 
{
+                       if (!(use_face_sel || use_vert_sel) || v_flag & SELECT 
|| non_occlude) {
                                /* 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;
+                           float view_dot = (vd.no && !non_occlude) ? 
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);
+                                       const float brush_fade = 
BKE_brush_curve_strength(brush, dist, radius);
                                        unsigned int color_final = 
data->vpd->paintcol;
+                                       dist = non_occlude ? dist : test.dist;
 
                                        /* If we're painting with a texture, 
sample the texture color and alpha. */
                                        float tex_alpha = 1.0;
@@ -3720,6 +3742,9 @@ static void do_vpaint_brush_blur_task_cb_ex(
        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;
+       float dist;
+       bool non_occlude;
+       const float radius = BKE_brush_size_get(scene, brush);
 
        SculptBrushTest test;
        sculpt_brush_test_init(ss, &test);
@@ -3728,8 +3753,11 @@ static void do_vpaint_brush_blur_task_cb_ex(
        PBVHVertexIter vd;
        BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
        {
-               /* Test to see if the vertex coordinates are within the 
spherical brush region. */
-               if (sculpt_brush_test(&test, vd.co)) {
+               const bool do_occlude = data->vp->flag&VP_OCCLUDE ? 1 : 0;
+               non_occlude = is_non_occluded(cache, vd, &dist, radius, 
do_occlude);
+               /* Test to see if the vertex coordinates are within the 
spherical brush region or
+               *  occluded vertex for non-occluded mode. */
+               if (sculpt_brush_test(&test, vd.co) || non_occlude) {
                        /* For grid based pbvh, take the vert whose loop 
cooresponds to the current grid. 
                        Otherwise, take the current vert. */
                        const int v_index = ccgdm ? 
data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
@@ -3737,12 +3765,12 @@ static void do_vpaint_brush_blur_task_cb_ex(
                        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;
+                       const float view_dot = (vd.no && !non_occlude) ? 
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 || use_vert_sel) || v_flag & 
SELECT) {
+                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT || non_occlude) {
                                        /* Get the average poly color */
                                        unsigned int color_final = 0;
                                        int total_hit_loops = 0;
@@ -3818,6 +3846,9 @@ static void do_vpaint_brush_smear_task_cb_ex(
        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;
+       float dist;
+       bool non_occlude;
+       const float radius = BKE_brush_size_get(scene, brush);
 
        sub_v3_v3v3(brush_dir, cache->location, cache->last_location);
        if (normalize_v3(brush_dir) != 0.0f) {
@@ -3829,8 +3860,11 @@ static void do_vpaint_brush_smear_task_cb_ex(
                PBVHVertexIter vd;
                BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
                {
-                       /* Test to see if the vertex coordinates are within the 
spherical brush region. */
-                       if (sculpt_brush_test(&test, vd.co)) {
+                       const bool do_occlude = data->vp->flag&VP_OCCLUDE ? 1 : 
0;
+                       non_occlude = is_non_occluded(cache, vd, &dist, radius, 
do_occlude);
+                       /* Test to see if the vertex coordinates are within the 
spherical brush region or
+                       *  occluded vertex for non-occluded mode. */
+                       if (sculpt_brush_test(&test, vd.co) || non_occlude) {
                                /* For grid based pbvh, take the vert whose 
loop cooresponds to the current grid.
                                Otherwise, take the current vert. */
                                const int v_index = ccgdm ? 
data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
@@ -3839,10 +3873,10 @@ static void do_vpaint_brush_smear_task_cb_ex(
                                const bool v_flag = 
data->me->mvert[v_index].flag;
 
                                /* if the vertex is selected for painting. */
-                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT) {
+                               if (!(use_face_sel || use_vert_sel) || v_flag & 
SELECT || non_occlude) {
                                        /* 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;
+                                       const float view_dot = (vd.no && 
!non_occlude) ? 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);
 
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index 3503abb606e..3cb1158f57d 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1175,6 +1175,7 @@ enum {
        VP_NORMALS      = (1 << 3),
        VP_SPRAY        = (1 << 4),
        // VP_MIRROR_X  = (1 << 5),  /* deprecated in 2.5x use (me->editflag & 
ME_EDIT_MIRROR_X) */
+       VP_OCCLUDE      = (1 << 6),
        VP_ONLYVGROUP   = (1 << 7)   /* weight paint only */
 };
 
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c 
b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 98dbfa3ae5f..630ea4ec0af 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -669,6 +669,11 @@ static void rna_def_vertex_paint(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of vertex and 
weight paint mode");
 
        /* vertex paint only */
+       prop = RNA_def_property(srna, "use_occlude", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_OCCLUDE);
+       RNA_def_property_ui_text(prop, "Occlude", "Only paint onto the vertices 
directly under the brush (slower)");

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to