Commit: 38b5045205656dffa01b01f225434814bcb06f51
Author: Nathan Vollmer
Date:   Tue Apr 4 23:00:02 2017 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB38b5045205656dffa01b01f225434814bcb06f51

fixed masking bug, & pbvh freeing bug. Still trying to figure out grids...

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

M       source/blender/blenkernel/BKE_paint.h
M       source/blender/blenkernel/intern/object.c
M       source/blender/blenkernel/intern/paint.c
M       source/blender/blenkernel/intern/subsurf_ccg.c
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/editors/sculpt_paint/sculpt.c
M       source/blender/editors/sculpt_paint/sculpt_intern.h

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

diff --git a/source/blender/blenkernel/BKE_paint.h 
b/source/blender/blenkernel/BKE_paint.h
index 3a46e8281a1..d8ef476988c 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -214,6 +214,7 @@ typedef struct SculptSession {
        unsigned int *tot_loops_hit;
        float *max_weight;
        unsigned int *previous_color;
+       bool building_vp_handle;
 } SculptSession;
 
 void BKE_sculptsession_free(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/object.c 
b/source/blender/blenkernel/intern/object.c
index ebe809143c2..1554ff3d75f 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2740,7 +2740,7 @@ void BKE_object_sculpt_modifiers_changed(Object *ob)
 {
        SculptSession *ss = ob->sculpt;
 
-       if (ss) {
+       if (ss && ss->building_vp_handle == false) {
                if (!ss->cache) {
                        /* we free pbvh on changes, except during sculpt since 
it can't deal with
                         * changing PVBH node organization, we hope topology 
does not change in
diff --git a/source/blender/blenkernel/intern/paint.c 
b/source/blender/blenkernel/intern/paint.c
index b1006f3807c..07fe63929cd 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -875,6 +875,9 @@ void BKE_sculpt_update_mesh_elements(Scene *scene, Sculpt 
*sd, Object *ob,
        ss->modifiers_active = sculpt_modifiers_active(scene, sd, ob);
        ss->show_diffuse_color = (sd->flags & SCULPT_SHOW_DIFFUSE) != 0;
 
+       /* This flag prevents PBVH from being freed when creating the vp_handle 
for texture paint */
+       ss->building_vp_handle = false;
+
        if (need_mask) {
                if (mmd == NULL) {
                        if (!CustomData_has_layer(&me->vdata, CD_PAINT_MASK)) {
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c 
b/source/blender/blenkernel/intern/subsurf_ccg.c
index 53dae7a141b..6927bdaa438 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -4419,7 +4419,8 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh 
*dm)
        if (!ob->sculpt)
                return NULL;
 
-       grid_pbvh = ccgDM_use_grid_pbvh(ccgdm);
+       /* In vwpaint, we always use a grid_pbvh for multires/subsurf */
+       grid_pbvh = (!(ob->mode & OB_MODE_SCULPT)) || 
ccgDM_use_grid_pbvh(ccgdm);
 
        if (ob->sculpt->pbvh) {
                if (grid_pbvh) {
@@ -4441,8 +4442,8 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh 
*dm)
        /* no pbvh exists yet, we need to create one. only in case of multires
         * we build a pbvh over the modified mesh, in other cases the base mesh
         * is being sculpted, so we build a pbvh from that. */
-       /* Note: VWPaint do not support PBVH_GRIDS at the moment. */
-       if (grid_pbvh && ob->mode & OB_MODE_SCULPT) {
+       /* Note: vwpaint always builds a pbvh over the modified mesh. */
+       if (grid_pbvh) {
                ccgdm_create_grids(dm);
 
                numGrids = ccgDM_getNumGrids(dm);
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index f0e275a00d1..5ee2ae12b18 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -81,6 +81,8 @@
 
 #include "bmesh.h"
 #include "bmesh_tools.h"
+#include "BKE_subsurf.h"
+#include "BKE_ccg.h"
 
 /* small structure to defer applying weight-paint results */
 struct WPaintDefer {
@@ -1656,9 +1658,10 @@ static void do_weight_paint_vertex(
 /       copied from sculpt.c                                  ****/
 static void vertex_paint_init_session(Scene *scene, Object *ob)
 {
-       if (!ob->sculpt)
-         ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt session");
-       BKE_sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, 
0, false);
+       if (!ob->sculpt) {
+               ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt 
session");
+               BKE_sculpt_update_mesh_elements(scene, 
scene->toolsettings->sculpt, ob, 0, false);
+       }
 }
 
 static void vertex_paint_init_session_maps(Object *ob) {
@@ -2112,7 +2115,9 @@ static bool wpaint_stroke_test_start(bContext *C, 
wmOperator *op, const float mo
        }
 
        /* painting on subsurfs should give correct points too, this returns 
me->totvert amount */
+       ob->sculpt->building_vp_handle = true;
        wpd->vp_handle = ED_vpaint_proj_handle_create(scene, ob, 
&wpd->vertexcosnos);
+       ob->sculpt->building_vp_handle = false;
 
        /* imat for normals */
        mul_m4_m4m4(mat, wpd->vc.rv3d->viewmat, ob->obmat);
@@ -2271,7 +2276,7 @@ static void calc_brushdata_symm(VPaint *vd, StrokeCache 
*cache, const char symm,
 }
 
 static void do_wpaint_brush_blur_task_cb_ex(
-        void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
UNUSED(thread_id))
+               void *userdata, void *UNUSED(userdata_chunk), const int n, 
const int UNUSED(thread_id))
 {
        SculptThreadedTaskData *data = userdata;
        SculptSession *ss = data->ob->sculpt;
@@ -2292,7 +2297,7 @@ static void do_wpaint_brush_blur_task_cb_ex(
                sculpt_brush_test_init(ss, &test);
 
                /* Test to see if the vertex coordinates are within the 
spherical brush region. */
-               if (sculpt_brush_test(&test, vd.co)) {
+               if (sculpt_brush_test_sq(&test, vd.co)) {
                        const int vertexIndex = vd.vert_indices[vd.i];
 
                        /* Get the average poly color */
@@ -2301,11 +2306,11 @@ static void do_wpaint_brush_blur_task_cb_ex(
 
                        for (int j = 0; j < 
ss->vert_to_poly[vertexIndex].count; j++) {
                                int polyIndex = 
ss->vert_to_poly[vertexIndex].indices[j];
-                               MPoly poly = data->me->mpoly[polyIndex];
+                               MPoly *poly = &data->me->mpoly[polyIndex];
 
-                               total_hit_loops += poly.totloop;
-                               for (int k = 0; k < poly.totloop; ++k) {
-                                       int loopIndex = poly.loopstart + k;
+                               total_hit_loops += poly->totloop;
+                               for (int k = 0; k < poly->totloop; ++k) {
+                                       int loopIndex = poly->loopstart + k;
                                        MLoop loop = data->me->mloop[loopIndex];
                                        MDeformVert *dv = 
&data->me->dvert[loop.v];
                                        MDeformWeight *dw = 
defvert_verify_index(dv, data->wpi->active.index);
@@ -2313,7 +2318,7 @@ static void do_wpaint_brush_blur_task_cb_ex(
                                }
                        }
                        if (total_hit_loops != 0) {
-                               const float fade = 
BKE_brush_curve_strength(brush, test.dist, cache->radius);
+                               const float fade = 
BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius);
                                const float dot = 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
 
                                finalColor /= total_hit_loops;
@@ -2327,7 +2332,7 @@ static void do_wpaint_brush_blur_task_cb_ex(
 }
 
 static void do_wpaint_brush_smudge_task_cb_ex(
-        void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
UNUSED(thread_id))
+               void *userdata, void *UNUSED(userdata_chunk), const int n, 
const int UNUSED(thread_id))
 {
        SculptThreadedTaskData *data = userdata;
        SculptSession *ss = data->ob->sculpt;
@@ -2350,7 +2355,7 @@ static void do_wpaint_brush_smudge_task_cb_ex(
                        sculpt_brush_test_init(ss, &test);
 
                        /* Test to see if the vertex coordinates are within the 
spherical brush region. */
-                       if (sculpt_brush_test(&test, vd.co)) {
+                       if (sculpt_brush_test_fast(&test, vd.co)) {
                                const float dot = 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
                                const int vertexIndex = vd.vert_indices[vd.i];
                                MVert *currentVert = 
&data->me->mvert[vertexIndex];
@@ -2397,7 +2402,7 @@ static void do_wpaint_brush_smudge_task_cb_ex(
 
 
 static void do_wpaint_brush_draw_task_cb_ex(
-        void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
UNUSED(thread_id))
+               void *userdata, void *UNUSED(userdata_chunk), const int n, 
const int UNUSED(thread_id))
 {
        SculptThreadedTaskData *data = userdata;
        SculptSession *ss = data->ob->sculpt;
@@ -2407,58 +2412,60 @@ static void do_wpaint_brush_draw_task_cb_ex(
        StrokeCache *cache = ss->cache;
        const float bstrength = cache->bstrength;
        float paintweight = BKE_brush_weight_get(scene, brush);
+       const float brush_alpha_value = BKE_brush_alpha_get(scene, brush);
+       const float brush_alpha_pressure =
+               brush_alpha_value * (BKE_brush_use_alpha_pressure(scene, brush) 
? ss->cache->pressure : 1.0f);
+       int face_mask_on = data->me->editflag & ME_EDIT_PAINT_FACE_SEL;
+       int vert_mask_on = data->me->editflag & ME_EDIT_PAINT_VERT_SEL;
 
        PBVHVertexIter vd;
        BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
        {
                SculptBrushTest test;
                sculpt_brush_test_init(ss, &test);
-               if (sculpt_brush_test(&test, vd.co)) {
+               if (sculpt_brush_test_sq(&test, vd.co)) {
                        const int vertexIndex = vd.vert_indices[vd.i];
-      MVert v = data->me->mvert[vertexIndex];
-      /* If the vertex is selected */
-      if (v.flag & 1) {
-                         const float dot = 
dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
-                         const float fade = BKE_brush_curve_strength(brush, 
test.dist, cache->radius);
-                         const float brush_alpha_value = 
BKE_brush_alpha_get(scene, brush);
-                         const float brush_alpha_pressure =
-                         brush_alpha_value * 
(BKE_brush_use_alpha_pressure(scene, brush) ? ss->cache->pressure : 1.0f);
-                         float actualStrength = bstrength * fade * dot * 
brush_alpha_pressure;
-                         float currentWeight;
-
-                         /* Spray logic */
-                         if (!(data->vp->flag & VP_SPRAY)) {
-                                 MDeformVert *dv = 
&data->me->dvert[vertexIndex];
-                                 MDeformWeight *dw;
-                                 dw = (data->vp->flag & VP_ONLYVGROUP) ? 
defvert_find_index(dv, data->wpi->active.index) :
-                                                                         
defvert_verify_index(dv, data->wpi->active.index);
-                                 currentWeight = dw->weight;
-                                 if (ss->max_weight[vertexIndex] < 0) {
-                                         ss->max_weight[vertexIndex] = 
min_ff(bstrength + dw->weight, 1.0f);
-                                 }
-                                 CLAMP(actualStrength, 0.0, 
ss->max_weight[vertexIndex] - dw->weight);
-                         }
-
-                         /* Splash Prevention */
-                         if (dot > 0.0){
-                                 switch (data->vp->flag) {
-                                         case VP_SPRAY:
-                                                 if (currentWeight < 
ss->max_weight[vertexIndex])
-                                                         
do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
actualStrength, paintweight);
-                                                 break;
-                                         default:
-                                                 
do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
actualStrength, paintweight);
-                                                 break;
-                                 }
-                         }
-      }
+                       char v_flag = data->me->mvert[vertexIndex].flag;
+                       /* If the vertex is selected */
+                       if (!(face_mask_on || vert_mask_on) || v_flag & SELECT) 
{
+                               const float dot = dot_vf

@@ 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