Fix T60126: Gradient affects hidden vertices when weight painting
authorJacques Lucke <mail@jlucke.com>
Tue, 22 Jan 2019 14:30:37 +0000 (15:30 +0100)
committerJacques Lucke <mail@jlucke.com>
Tue, 22 Jan 2019 14:31:10 +0000 (15:31 +0100)
Also includes some minor refactoring: use guard clauses instead of nested conditionals.

Reviewers: brecht

Differential Revision: https://developer.blender.org/D4238

source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c

index 7100bf33a474d0325fe526a74a69bd9470a72265..e94e8a2eee281b4e7eccca1fb9d15fd605822ca2 100644 (file)
@@ -625,13 +625,13 @@ static void gradientVertUpdate__mapFunc(
         const float UNUSED(no_f[3]), const short UNUSED(no_s[3]))
 {
        WPGradient_userData *grad_data = userData;
-       Mesh *me = grad_data->me;
-       if ((grad_data->use_select == false) || (me->mvert[index].flag & SELECT)) {
-               WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index];
-               if (vs->sco[0] != FLT_MAX) {
-                       gradientVert_update(grad_data, index);
-               }
+       WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index];
+
+       if (vs->sco[0] == FLT_MAX) {
+               return;
        }
+
+       gradientVert_update(grad_data, index);
 }
 
 static void gradientVertInit__mapFunc(
@@ -640,42 +640,46 @@ static void gradientVertInit__mapFunc(
 {
        WPGradient_userData *grad_data = userData;
        Mesh *me = grad_data->me;
+       WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index];
 
-       if ((grad_data->use_select == false) || (me->mvert[index].flag & SELECT)) {
-               /* run first pass only,
-                * the screen coords of the verts need to be cached because
-                * updating the mesh may move them about (entering feedback loop) */
-
-               if (BLI_BITMAP_TEST(grad_data->vert_visit, index) == 0) {
-                       WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index];
-                       if (ED_view3d_project_float_object(
-                                   grad_data->ar,
-                                   co, vs->sco,
-                                   V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK)
-                       {
-                               /* ok */
-                               MDeformVert *dv = &me->dvert[index];
-                               const MDeformWeight *dw;
-                               dw = defvert_find_index(dv, grad_data->def_nr);
-                               if (dw) {
-                                       vs->weight_orig = dw->weight;
-                                       vs->flag = VGRAD_STORE_DW_EXIST;
-                               }
-                               else {
-                                       vs->weight_orig = 0.0f;
-                                       vs->flag = VGRAD_STORE_NOP;
-                               }
+       if (grad_data->use_select && !(me->mvert[index].flag & SELECT)) {
+               copy_v2_fl(vs->sco, FLT_MAX);
+               return;
+       }
 
-                               BLI_BITMAP_ENABLE(grad_data->vert_visit, index);
+       if (me->mvert[index].flag & ME_HIDE) {
+               copy_v2_fl(vs->sco, FLT_MAX);
+               return;
+       }
 
-                               gradientVert_update(grad_data, index);
-                       }
-                       else {
-                               /* no go */
-                               copy_v2_fl(vs->sco, FLT_MAX);
-                       }
-               }
+       /* run first pass only,
+        * the screen coords of the verts need to be cached because
+        * updating the mesh may move them about (entering feedback loop) */
+       if (BLI_BITMAP_TEST(grad_data->vert_visit, index)) {
+               copy_v2_fl(vs->sco, FLT_MAX);
+               return;
+       }
+
+       if (ED_view3d_project_float_object(
+                   grad_data->ar,
+                   co, vs->sco,
+                   V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_NEAR) != V3D_PROJ_RET_OK)
+       {
+               return;
+       }
+
+       MDeformVert *dv = &me->dvert[index];
+       const MDeformWeight *dw = defvert_find_index(dv, grad_data->def_nr);
+       if (dw) {
+               vs->weight_orig = dw->weight;
+               vs->flag = VGRAD_STORE_DW_EXIST;
+       }
+       else {
+               vs->weight_orig = 0.0f;
+               vs->flag = VGRAD_STORE_NOP;
        }
+       BLI_BITMAP_ENABLE(grad_data->vert_visit, index);
+       gradientVert_update(grad_data, index);
 }
 
 static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEvent *event)