[Bf-blender-cvs] [3a978cc0ec0] temp-gpencil-bezier-stroke-type: GPencil: Add weight transfer for cyclic strokes

Falk David noreply at git.blender.org
Thu Apr 22 09:54:51 CEST 2021


Commit: 3a978cc0ec00e64a6dbd0d33d8a40c62c4fc5df1
Author: Falk David
Date:   Thu Apr 22 09:54:42 2021 +0200
Branches: temp-gpencil-bezier-stroke-type
https://developer.blender.org/rB3a978cc0ec00e64a6dbd0d33d8a40c62c4fc5df1

GPencil: Add weight transfer for cyclic strokes

This adds the code that transfers the weights for cyclic bezier strokes
to the polyline.

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

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

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

diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c
index f791c4e3e59..630128d09a2 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -1594,7 +1594,8 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps,
   /* Interpolate weights. */
   if (editcurve->dvert != NULL &&
       (update_all_attributes || (flag & GP_GEO_UPDATE_POLYLINE_WEIGHT))) {
-    for (int i = 0, idx = 0; i < editcurve->tot_curve_points - 1; i++) {
+    int idx = 0;
+    for (int i = 0; i < editcurve->tot_curve_points; i++) {
       MDeformVert *dv_curr = &editcurve->dvert[i];
       MDeformVert *dv_next = &editcurve->dvert[i + 1];
 
@@ -1623,7 +1624,40 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps,
       idx += segment_length;
     }
 
-    /* TODO: Deal with cyclic strokes. */
+    if (is_cyclic) {
+      /* Interpolate weights between last and first curve point. */
+      MDeformVert *dv_curr = &editcurve->dvert[editcurve->tot_curve_points - 1];
+      MDeformVert *dv_next = &editcurve->dvert[0];
+
+      if (dv_curr->totweight && dv_next->totweight) {
+        int segment_length = (adaptive) ? segment_length_cache[editcurve->tot_curve_points - 1] :
+                                          resolution;
+        for (int j = 0; j < segment_length; j++) {
+          MDeformVert *dvert = &gps->dvert[idx + j];
+          BKE_defvert_copy(dvert, dv_curr);
+          float t = (float)j / (float)segment_length;
+          for (int d = 0; d < dv_curr->totweight; d++) {
+            MDeformWeight *dw_a = BKE_defvert_ensure_index(dv_curr, d);
+            MDeformWeight *dw_b = BKE_defvert_ensure_index(dv_next, d);
+            MDeformWeight *dw_final = BKE_defvert_ensure_index(dvert, d);
+
+            if (dw_a->weight == dw_b->weight) {
+              dw_final->weight = dw_a->weight;
+            }
+            else {
+              dw_final->weight = smooth_interpf(dw_b->weight, dw_a->weight, t);
+            }
+          }
+        }
+      }
+    }
+    else {
+      /* Copy the weights of the last curve point. */
+      MDeformVert *dv_last = &editcurve->dvert[editcurve->tot_curve_points - 1];
+      MDeformVert *dvert = &gps->dvert[gps->totpoints - 1];
+      BKE_defvert_copy(dvert, dv_last);
+      BKE_defvert_sync(dvert, dv_last, true);
+    }
   }
 
   /* free temp data */



More information about the Bf-blender-cvs mailing list