Commit: 600ce2488c05b93b184a4f23c675fc8654dc0abe
Author: Nathan Vollmer
Date:   Fri Aug 5 21:32:29 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB600ce2488c05b93b184a4f23c675fc8654dc0abe

added spray support to weight paint. Vertex paint spray support is giving me 
grief...

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

M       source/blender/blenkernel/BKE_paint.h
M       source/blender/blenkernel/intern/paint.c
M       source/blender/editors/sculpt_paint/paint_vertex.c

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

diff --git a/source/blender/blenkernel/BKE_paint.h 
b/source/blender/blenkernel/BKE_paint.h
index 87c9d69..237add5 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -215,6 +215,7 @@ typedef struct SculptSession {
   unsigned long* totalAlpha;
   double* totalWeight;
   unsigned int *totloopsHit;
+  float *maxWeight;
 } SculptSession;
 
 void BKE_sculptsession_free(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/paint.c 
b/source/blender/blenkernel/intern/paint.c
index 815b33d..19c1090 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -770,6 +770,8 @@ void BKE_sculptsession_free(Object *ob)
       MEM_freeN(ob->sculpt->totalAlpha);
     if (ob->sculpt->totalWeight)
       MEM_freeN(ob->sculpt->totalWeight);
+    if (ob->sculpt->maxWeight)
+      MEM_freeN(ob->sculpt->maxWeight);
 
                MEM_freeN(ss);
 
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index d1a4b5b..6654efe 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -1498,7 +1498,7 @@ static void do_weight_paint_vertex_single(
        Mesh *me = ob->data;
        MDeformVert *dv = &me->dvert[index];
        bool topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
-       
+
        MDeformWeight *dw;
 
        /* mirror vars */
@@ -1767,12 +1767,14 @@ static void 
vertex_paint_init_session_average_arrays(Object *ob){
   int totNode = 0;
   //I think the totNodes might include internal nodes, and we really only need 
the tot leaves.
   BKE_pbvh_node_num_nodes(ob->sculpt->pbvh, &totNode);
+  Mesh *me = BKE_mesh_from_object(ob);
   ob->sculpt->totalRed = MEM_callocN(totNode*sizeof(unsigned long), 
"totalRed");
   ob->sculpt->totalGreen = MEM_callocN(totNode * sizeof(unsigned long), 
"totalGreen");
   ob->sculpt->totalBlue = MEM_callocN(totNode * sizeof(unsigned long), 
"totalBlue");
   ob->sculpt->totalAlpha = MEM_callocN(totNode * sizeof(unsigned long), 
"totalAlpha");
   ob->sculpt->totalWeight = MEM_callocN(totNode * sizeof(double), 
"totalWeight");
   ob->sculpt->totloopsHit = MEM_callocN(totNode * sizeof(unsigned int), 
"totloopsHit");
+  ob->sculpt->maxWeight = MEM_callocN(me->totvert * sizeof(float), 
"previouslyPainted");
 }
 
 /* *************** set wpaint operator ****************** */
@@ -2279,6 +2281,8 @@ static bool wpaint_stroke_test_start(bContext *C, 
wmOperator *op, const float mo
 
        vwpaint_update_cache_invariants(C, vd, ss, op, mouse);
 
+  for (int i = 0; i < me->totvert; ++i)
+    ss->maxWeight[i] = -1.0;
        return true;
 }
 
@@ -2635,21 +2639,43 @@ 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);
-
-  //for each vertex
+  const float maximum = bstrength;
+  
   PBVHVertexIter vd;
   BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
   {
     SculptBrushTest test;
     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)) {
-      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+      const int vertexIndex = vd.vert_indices[vd.i];
+      const 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 (dot > 0.0)
-        do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, dot 
* fade * bstrength, paintweight);
+      float actualStrength = bstrength * fade * dot;
+      float currentWeight;
+
+      //Spray logic
+      if (!(data->vp->flag & VP_SPRAY)) {
+        MDeformVert *dv = &data->me->dvert[vertexIndex];
+        MDeformWeight *dw;
+        dw = (data->vp->flag & VP_ONLYVGROUP) ? dw = defvert_find_index(dv, 
data->wpi->active.index) :
+                                                     defvert_verify_index(dv, 
data->wpi->active.index);
+        currentWeight = dw->weight;
+        if (ss->maxWeight[vertexIndex] < 0) ss->maxWeight[vertexIndex] = 
min(bstrength + dw->weight, 1.0);
+        CLAMP(actualStrength, 0.0, ss->maxWeight[vertexIndex] - dw->weight);
+      }
+      
+      //Splash Prevention
+      if (dot > 0.0){
+        switch (data->vp->flag) {
+          case VP_SPRAY:
+            if (currentWeight < ss->maxWeight[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;
+        }
+      }
     }
     BKE_pbvh_vertex_iter_end;
   }
@@ -3436,6 +3462,9 @@ static bool vpaint_stroke_test_start(bContext *C, struct 
wmOperator *op, const f
 
        vwpaint_update_cache_invariants(C, vp, ss, op, mouse);
 
+  for (int i = 0; i < me->totvert; ++i)
+    ss->maxWeight[i] = -1.0;
+
        return 1;
 }
 
@@ -3553,44 +3582,108 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
        data->ob->sculpt->totalAlpha[n] = blend[3];
 }
 
+//static void do_vpaint_brush_draw_task_cb_ex(
+//     void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
thread_id)
+//{
+//     SculptThreadedTaskData *data = userdata;
+//     SculptSession *ss = data->ob->sculpt;
+//
+//     Brush *brush = data->brush;
+//     StrokeCache *cache = ss->cache;
+//     const float bstrength = cache->bstrength;
+//
+//     unsigned int *lcol = data->lcol;
+//             
+//     unsigned int *lcolorig = data->vp->vpaint_prev;
+//
+//     //for each vertex
+//     PBVHVertexIter vd;
+//     BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
+//     {
+//             SculptBrushTest test;
+//             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)) {
+//      const 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 (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;
+//     }
+//}
+
 static void do_vpaint_brush_draw_task_cb_ex(
-       void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
thread_id)
+  void *userdata, void *UNUSED(userdata_chunk), const int n, const int 
thread_id)
 {
-       SculptThreadedTaskData *data = userdata;
-       SculptSession *ss = data->ob->sculpt;
+  SculptThreadedTaskData *data = userdata;
+  SculptSession *ss = data->ob->sculpt;
 
-       Brush *brush = data->brush;
-       StrokeCache *cache = ss->cache;
-       const float bstrength = cache->bstrength;
+  Brush *brush = data->brush;
+  StrokeCache *cache = ss->cache;
+  const float bstrength = cache->bstrength;
 
-       unsigned int *lcol = data->lcol;
-               
-       unsigned int *lcolorig = data->vp->vpaint_prev;
+  unsigned int *lcol = data->lcol;
 
-       //for each vertex
-       PBVHVertexIter vd;
-       BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
-       {
-               SculptBrushTest test;
-               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)) {
-      float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+  unsigned int *lcolorig = data->vp->vpaint_prev;
+
+  //for each vertex
+  PBVHVertexIter vd;
+  BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
+  {
+    SculptBrushTest test;
+    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)) {
+      int vertexIndex = vd.vert_indices[vd.i];
+      const float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+      const float fade = BKE_brush_curve_strength(brush, test.dist, 
cache->radius);
+      unsigned int actualColor = data->vpd->paintcol;
+      unsigned char *currentColor = &lcolorig[vertexIndex];
+
+      ////Spray logic
+      //if (!(data->vp->flag & VP_SPRAY)) {
+      //  //since float and uint both use 4 bytes, we just recycle weight 
paintings max weight for spray mode support.
+      //  if (ss->maxWeight[vertexIndex] < 0.0) 
+      //    *(ss->maxWeight + vertexIndex) = mcol_blend(data->vpd->paintcol, 
lcol[vertexIndex], bstrength);
+      //  actualColor = *(ss->maxWeight + vertexIndex);// 
ss->maxWeight[vertexIndex];
+      //  printf("0x%08x\n", actualColor);
+      //  printf("0x%08x\n", mcol_blend(lcol[vertexIndex], 
data->vpd->paintcol, bstrength));
+      //  
+      //  /*
+      //  unsigned char* brushcol = &data->vpd->paintcol;
+      //  unsigned char* maxcol = &ss->maxWeight[vertexIndex];
+      //  unsigned char col[4];
+      //  col[0] = brushcol[0];
+      //  col[1] = brushcol[1];
+      //  col[2] = brushcol[2];
+
+      //  CLAMP(col[0], 0.0, maxcol[0]);
+      //  CLAMP(col[1], 0.0, maxcol[1]);
+      //  CLAMP(col[2], 0.0, maxcol[2]);
+      //  col[3] = 255;
+      //  actualColor = *(unsigned int*)col;*/
+      //}
 
-                       const float fade = BKE_brush_curve_strength(brush, 
test.dist, cache->radius);
-                       int vertexIndex = vd.vert_indices[vd.i];
-                       
       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->vp

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