[Bf-blender-cvs] [794da0fa14a] soc-2019-npr: GPENCIL: Sample function now handles weights as well.

YimingWu noreply at git.blender.org
Mon Jun 24 13:16:59 CEST 2019


Commit: 794da0fa14a336c455b341806614ce887361675b
Author: YimingWu
Date:   Mon Jun 24 19:16:18 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB794da0fa14a336c455b341806614ce887361675b

GPENCIL: Sample function now handles weights as well.

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

M	source/blender/blenkernel/intern/gpencil.c

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

diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index c6174ff0474..e448b15fe86 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1427,7 +1427,19 @@ void BKE_gpencil_dvert_ensure(bGPDstroke *gps)
 
 /* ************************************************** */
 
-/* weight not working yet! */
+MDeformVert* stroke_defvert_new_count(int totweight, int count)
+{
+  int i;
+
+  MDeformVert* dst = MEM_mallocN(count * sizeof(MDeformVert),"new_deformVert");
+
+  for (i = 0; i < count; i++) {
+      dst[i].dw = MEM_mallocN(sizeof(MDeformWeight) * totweight, "new_deformWeight");
+  }
+
+  return dst;
+}
+
 static int stroke_march_next_point(bGPDstroke *gps,
                                    int next_point_index,
                                    float *current,
@@ -1435,7 +1447,7 @@ static int stroke_march_next_point(bGPDstroke *gps,
                                    float *result,
                                    float *pressure,
                                    float *strength,
-                                   float* weight)
+                                   float* weights)
 {
   float remaining_till_next = 0.0f;
   float remaining_march = dist;
@@ -1465,7 +1477,12 @@ static int stroke_march_next_point(bGPDstroke *gps,
     copy_v3_v3(result, &gps->points[next_point_index]);
     *pressure = gps->points[next_point_index].pressure;
     *strength = gps->points[next_point_index].strength;
-    *weight = gps->dvert[next_point_index].dw->weight;
+    if(weights){
+      for(int j=0;j<gps->dvert->totweight;j++){
+        weights[j] = gps->dvert[next_point_index].dw[j].weight;
+      }
+    }
+    
     return 0;
   }
   else {
@@ -1475,6 +1492,13 @@ static int stroke_march_next_point(bGPDstroke *gps,
         gps->points[next_point_index - 1].pressure, gps->points[next_point_index].pressure, ratio);
     *strength = interpf(
         gps->points[next_point_index - 1].strength, gps->points[next_point_index].strength, ratio);
+    if(weights){
+      for(int j=0;j<gps->dvert->totweight;j++){
+        weights[j] = interpf(
+        gps->dvert[next_point_index - 1].dw[j].weight, gps->dvert[next_point_index].dw[j].weight, ratio);
+      }
+    }
+    
     return next_point_index;
   }
 }
@@ -1508,37 +1532,56 @@ bool BKE_gpencil_sample_stroke(bGPDstroke *gps, float dist)
   int count = (int)(length / dist) + 2;  // preserve some extra in case
 
   bGPDspoint *new_pt = MEM_callocN(sizeof(bGPDspoint) * count, "gp_stroke_points_sampled");
-  MDeformVert* new_dv;
+  MDeformVert* new_dv=NULL;
   if (gps->dvert != NULL) {
-    new_dv = MEM_callocN(gps->dvert, sizeof(*gps->dvert) * count);
+    new_dv = stroke_defvert_new_count(gps->dvert->totweight, count);
+    new_dv->totweight = gps->dvert->totweight;
+    new_dv->flag = gps->dvert->flag;
   }
 
   int next_point_index = 1;
   i = 0;
-  float pressure, strength, weight;
+  float pressure, strength, *weights=NULL;
+  if(new_dv)
+    weights = MEM_callocN(sizeof(float)*gps->dvert->totweight,"gp_stroke_point_weights_sampled");
+
+  // 1st point is always at the start
   copy_v3_v3(last_coord, &pt[0]);
-  // 1st point
   copy_v3_v3(&new_pt[i], last_coord);
   new_pt[i].pressure = pt[0].pressure;
   new_pt[i].strength = pt[0].strength;
+  if(new_dv){
+    for(int j=0;j<new_dv->totweight;j++){
+      new_dv[i].dw[j].weight = gps->dvert->dw[j].weight;
+    }
+  }
   i++;
+
+  // the rest
   while ((next_point_index = stroke_march_next_point(
-              gps, next_point_index, last_coord, dist, last_coord, &pressure, &strength, &weight)) > -1) {
+              gps, next_point_index, last_coord, dist, last_coord, &pressure, &strength, weights)) > -1) {
     copy_v3_v3(&new_pt[i], last_coord);
     new_pt[i].pressure = pressure;
     new_pt[i].strength = strength;
+    if(new_dv){
+      for(int j=0;j<new_dv->totweight;j++){
+        new_dv[i].dw[j].weight = weights[j];
+      }
+    }
     i++;
     if (next_point_index == 0)
       break;  // last point finished
   }
-
+  
   gps->points = new_pt;
-  gps->dvert = new_dv;
-
   gps->totpoints = i;
-
   MEM_freeN(pt);  // original
-  MEM_freeN(dv);
+
+  if(new_dv){
+    BKE_gpencil_free_stroke_weights(gps);
+    gps->dvert = new_dv;
+    MEM_freeN(weights);
+  }
 
   gps->flag |= GP_STROKE_RECALC_GEOMETRY;
   gps->tot_triangles = 0;



More information about the Bf-blender-cvs mailing list