Commit: 4286fbaf5cce28d23d0f02d2298c2f4292a36b38
Author: Nathan Vollmer
Date:   Thu Aug 4 15:51:45 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB4286fbaf5cce28d23d0f02d2298c2f4292a36b38

implemented brush normal based splash prevention

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

M       source/blender/editors/sculpt_paint/paint_vertex.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index f45edff..d1a4b5b 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2435,6 +2435,11 @@ static void calc_area_normal(
   }
 }
 
+static float dot_vf3vs3(const float brushNormal[3], const short 
vertexNormal[3]){
+  float normal[3];
+  normal_short_to_float_v3(normal, vertexNormal);
+  return dot_v3v3(brushNormal, normal);;
+}
 
 /* Flip all the editdata across the axis/axes specified by symm. Used to
 * calculate multiple modifications to the mesh when symmetry is enabled. */
@@ -2511,6 +2516,7 @@ static void do_wpaint_brush_blur_task_cb_ex(
 
     //Test to see if the vertex coordinates are within the spherical brush 
region.
     if (sculpt_brush_test(&test, vd.co)) {
+      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
       const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
       int vertexIndex = vd.vert_indices[vd.i];
 
@@ -2536,7 +2542,8 @@ static void do_wpaint_brush_blur_task_cb_ex(
 
         const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
         int vertexIndex = vd.vert_indices[vd.i];
-        do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
fade * bstrength, (float)finalColor);
+        if (dot > 0.0)
+          do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
dot * fade * bstrength, (float)finalColor);
       }
     }
     BKE_pbvh_vertex_iter_end;
@@ -2570,6 +2577,7 @@ static void do_wpaint_brush_smudge_task_cb_ex(
 
       //Test to see if the vertex coordinates are within the spherical brush 
region.
       if (sculpt_brush_test(&test, vd.co)) {
+        float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
         const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
         int vertexIndex = vd.vert_indices[vd.i];
         MVert *currentVert = &data->me->mvert[vertexIndex];
@@ -2604,10 +2612,10 @@ static void do_wpaint_brush_smudge_task_cb_ex(
             }
           }
         }
-        if (shouldColor) {
+        if (shouldColor && dot > 0.0) {
           const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
           int vertexIndex = vd.vert_indices[vd.i];
-          do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
fade * bstrength, (float)finalWeight);
+          do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, 
dot * fade * bstrength, (float)finalWeight);
         }
       }
       BKE_pbvh_vertex_iter_end;
@@ -2637,9 +2645,11 @@ static void do_wpaint_brush_draw_task_cb_ex(
 
     //Test to see if the vertex coordinates are within the spherical brush 
region.
     if (sculpt_brush_test(&test, vd.co)) {
+      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
       const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
       int vertexIndex = vd.vert_indices[vd.i];
-      do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, fade 
* bstrength, paintweight);
+      if (dot > 0.0)
+        do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, dot 
* fade * bstrength, paintweight);
     }
     BKE_pbvh_vertex_iter_end;
   }
@@ -2665,20 +2675,22 @@ static void do_wpaint_brush_calc_ave_weight_cb_ex(
   {
     //Test to see if the vertex coordinates are within the spherical brush 
region.
     if (sculpt_brush_test_fast(&test, vd.co)) {
-      if (BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 
0.0) {
-        int vertexIndex = vd.vert_indices[vd.i];
+      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+      if (dot > 0.0)
+        if (BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 
0.0) {
+          int vertexIndex = vd.vert_indices[vd.i];
 
-        ss->totloopsHit[n] += ss->vert_to_loop[vertexIndex].count;
-        //if a vertex is within the brush region, then add it's weight to the 
total weight.
-        for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
-          int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
+          ss->totloopsHit[n] += ss->vert_to_loop[vertexIndex].count;
+          //if a vertex is within the brush region, then add it's weight to 
the total weight.
+          for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
+            int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
 
-          MLoop loop = data->me->mloop[loopIndex];
-          MDeformVert *dv = &data->me->dvert[loop.v];
-          MDeformWeight *dw = defvert_verify_index(dv, 
data->wpi->active.index);
-          weight += dw->weight;
+            MLoop loop = data->me->mloop[loopIndex];
+            MDeformVert *dv = &data->me->dvert[loop.v];
+            MDeformWeight *dw = defvert_verify_index(dv, 
data->wpi->active.index);
+            weight += dw->weight;
+          }
         }
-      }
     }
     BKE_pbvh_vertex_iter_end;
   }
@@ -3564,15 +3576,18 @@ static void do_vpaint_brush_draw_task_cb_ex(
                
                //Test to see if the vertex coordinates are within the 
spherical brush region.
                if (sculpt_brush_test(&test, vd.co)) {
+      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+
                        const float fade = BKE_brush_curve_strength(brush, 
test.dist, cache->radius);
                        int vertexIndex = vd.vert_indices[vd.i];
                        
-                       //if a vertex is within the brush region, then paint 
each loop that vertex owns.
-                       for (int j = 0; j < 
ss->vert_to_loop[vertexIndex].count; ++j) {
-                               int loopIndex = 
ss->vert_to_loop[vertexIndex].indices[j];
-                               //Mix the new color with the original based on 
the brush strength and the curve.
-                               lcol[loopIndex] = vpaint_blend(data->vp, 
lcol[loopIndex], lcolorig[loopIndex], data->vpd->paintcol, 255.0 * fade * 
bstrength, 255.0);
-                       }
+      if (dot > 0.0)
+                         //if a vertex is within the brush region, then paint 
each loop that vertex owns.
+                         for (int j = 0; j < 
ss->vert_to_loop[vertexIndex].count; ++j) {
+                                 int loopIndex = 
ss->vert_to_loop[vertexIndex].indices[j];
+                                 //Mix the new color with the original based 
on the brush strength and the curve.
+                                 lcol[loopIndex] = vpaint_blend(data->vp, 
lcol[loopIndex], lcolorig[loopIndex], data->vpd->paintcol, 255.0 * fade * 
bstrength * dot, 255.0);
+                         }
                }
                BKE_pbvh_vertex_iter_end;
        }
@@ -3605,44 +3620,47 @@ static void do_vpaint_brush_blur_task_cb_ex(
 
                //Test to see if the vertex coordinates are within the 
spherical brush region.
                if (sculpt_brush_test(&test, vd.co)) {
-                       const float fade = BKE_brush_curve_strength(brush, 
test.dist, cache->radius);
-                       int vertexIndex = vd.vert_indices[vd.i];
-                       
-                       //Get the average poly color
-                       totalHitLoops = 0;
-                       finalColor = 0;
-                       blend[0] = 0;
-                       blend[1] = 0; 
-                       blend[2] = 0; 
-                       blend[3] = 0;
-                       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];
-                               totalHitLoops += poly.totloop;
-                               for (int k = 0; k < poly.totloop; k++) {
-                                       unsigned int loopIndex = poly.loopstart 
+ k;
-                                       col = (char *)(&lcol[loopIndex]);
-          // Color is squared to compensate the sqrt color encoding.
-          blend[0] += (unsigned long)col[0] * (unsigned long)col[0];
-          blend[1] += (unsigned long)col[1] * (unsigned long)col[1];
-          blend[2] += (unsigned long)col[2] * (unsigned long)col[2];
-          blend[3] += (unsigned long)col[3] * (unsigned long)col[3];
-                               }
-                       }
-                       if (totalHitLoops != 0) {
-                               col = (char*)(&finalColor);
-                               col[0] = (unsigned 
char)round(sqrtl(divide_round_ul(blend[0], totalHitLoops)));
-        col[1] = (unsigned char)round(sqrtl(divide_round_ul(blend[1], 
totalHitLoops)));
-        col[2] = (unsigned char)round(sqrtl(divide_round_ul(blend[2], 
totalHitLoops)));
-        col[3] = (unsigned char)round(sqrtl(divide_round_ul(blend[3], 
totalHitLoops)));
-
-                               //if a vertex is within the brush region, then 
paint each loop that vertex owns.
-                               for (int j = 0; j < 
ss->vert_to_loop[vertexIndex].count; ++j) {
-                                       int loopIndex = 
ss->vert_to_loop[vertexIndex].indices[j];
-                                       //Mix the new color with the original 
based on the brush strength and the curve.
-                                       lcol[loopIndex] = 
vpaint_blend(data->vp, lcol[loopIndex], lcolorig[loopIndex], *((unsigned 
int*)col), 255.0 * fade * bstrength, 255.0);
-                               }
-                       }
+      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+      if (dot > 0.0){
+        const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
+        int vertexIndex = vd.vert_indices[vd.i];
+
+        //Get the average poly color
+        totalHitLoops = 0;
+        finalColor = 0;
+        blend[0] = 0;
+        blend[1] = 0;
+        blend[2] = 0;
+        blend[3] = 0;
+        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];
+          totalHitLoops += poly.totloop;
+          for (int k = 0; k < poly.totloop; k++) {
+            unsigned int loopIndex = poly.loopstart + k;
+            col = (char *)(&lcol[loopIndex]);
+            // Color is squared to compensate the sqrt color encoding.
+            blend[0] += (unsigned long)col[0] * (unsigned long)col[0];
+            blend[1] += (unsigned long)col[1] * (unsigned long)col[1];
+            blend[2] += (unsigned long)col[2] * (unsigned long)col[2];
+            blend[3] += (unsigned long)col[3] * (unsigned long)col[3];
+          }
+        }
+        if (totalHitLoops != 0) {
+          col = (char*)(&finalColor);
+          col[0] = (unsigned char)round(sqrtl(divide_round_ul(blend[0], 
totalHitLoops)));
+          col[1] = (unsigned char)round(sqrtl(divide_round_ul(blend[1], 
totalHitLoops)));
+          col[2] = (unsigned char)round(sqrtl(divide_round_ul(blend[2], 
totalHitLoops)));
+          col[3] = (unsigned char)round(sqrtl(divide_round_ul(blend[3], 
totalHitLoops)));
+
+          //if a vertex is within the brush region, then paint each loop that 
vertex owns.
+          for (int

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