[Bf-blender-cvs] [b07494caad7] temp-gpencil-bezier-stroke-type: GPencil: Subdivide curve segment factor

Falk David noreply at git.blender.org
Mon Apr 26 08:41:35 CEST 2021


Commit: b07494caad7a5b373c353edbfa93c232e05c1097
Author: Falk David
Date:   Mon Apr 26 08:40:08 2021 +0200
Branches: temp-gpencil-bezier-stroke-type
https://developer.blender.org/rBb07494caad7a5b373c353edbfa93c232e05c1097

GPencil: Subdivide curve segment factor

Add a helper function to subdivide a curve segment at a specific factor

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

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 968dd3f3368..82aad79c874 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -1814,6 +1814,46 @@ static int gpencil_editcurve_subdivide_count(bGPDcurve *gpc, bool is_cyclic)
   return count;
 }
 
+/* Helper: Divide the curve segment at t, where t is a value between 0 and 1. */
+static void gpencil_editcurve_subdivide_curve_segment_factor(bGPDcurve_point *cpt_start,
+                                                             bGPDcurve_point *cpt_end,
+                                                             bGPDcurve_point *cpt_new,
+                                                             const float t)
+{
+  BLI_assert(t >= 0.0f && t <= 1.0f);
+
+  BezTriple *bezt_start = &cpt_start->bezt;
+  BezTriple *bezt_end = &cpt_end->bezt;
+  BezTriple *bezt_new = &cpt_new->bezt;
+  const float z = 1 - t, tt = t * t, zz = z * z, ttt = t * t * t, zzz = z * z * z;
+
+  for (int axis = 0; axis < 3; axis++) {
+    float p0, p1, p2, p3, m0, m1, q0, q1, b;
+    p0 = bezt_start->vec[1][axis];
+    p1 = bezt_start->vec[2][axis];
+    p2 = bezt_end->vec[0][axis];
+    p3 = bezt_end->vec[1][axis];
+
+    m0 = (t * p1) + (z * p0);
+    q0 = (tt * p2) + 2 * (t * z * p1) + (zz * p0);
+    b = (ttt * p3) + 3 * (tt * z * p2) + 3 * (t * zz * p1) + (zzz * p0);
+    q1 = (tt * p3) + 2 * (t * z * p2) + (zz * p1);
+    m1 = (t * p3) + (z * p2);
+
+    bezt_new->vec[0][axis] = q0;
+    bezt_new->vec[1][axis] = b;
+    bezt_new->vec[2][axis] = q1;
+
+    bezt_start->vec[2][axis] = m0;
+    bezt_end->vec[0][axis] = m1;
+  }
+
+  cpt_new->pressure = interpf(cpt_end->pressure, cpt_start->pressure, t);
+  cpt_new->strength = interpf(cpt_end->strength, cpt_start->strength, t);
+  interp_v4_v4v4(cpt_new->vert_color, cpt_start->vert_color, cpt_end->vert_color, t);
+  /* TODO: interpolate weights */
+}
+
 static void gpencil_editcurve_subdivide_curve_segment(bGPDcurve_point *cpt_start,
                                                       bGPDcurve_point *cpt_end,
                                                       bGPDcurve_point *cpt_new)



More information about the Bf-blender-cvs mailing list