Commit: c6650146eb1c615293b1371992270520fe262c57
Author: Falk David
Date:   Wed Aug 12 16:45:03 2020 +0200
Branches: soc-2020-greasepencil-curve
https://developer.blender.org/rBc6650146eb1c615293b1371992270520fe262c57

GPencil: Extrude middle curve points

Previously, extruding one of the middle points of a curve would only
move the point. Now it creates a new curve from the point selected.

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

M       source/blender/editors/gpencil/gpencil_edit.c

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

diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 2c5d91bc9ad..82a09a63039 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -206,7 +206,8 @@ static int gpencil_editmode_toggle_exec(bContext *C, 
wmOperator *op)
 
   /* Recalculate editcurves for strokes where the geometry/vertex colors have 
changed */
   if (GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)) {
-    GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc) {
+    GP_EDITABLE_CURVES_BEGIN(gps_iter, C, gpl, gps, gpc)
+    {
       if (gpc->flag & GP_CURVE_NEEDS_STROKE_UPDATE) {
         BKE_gpencil_stroke_editcurve_update(gps, gpd->curve_edit_threshold);
         /* Update the selection from the stroke to the curve. */
@@ -1194,6 +1195,41 @@ static void gpencil_curve_extrude_points(bGPdata *gpd,
   const bool first_select = gpc->curve_points[0].flag & GP_CURVE_POINT_SELECT;
   const bool last_select = gpc->curve_points[old_num_points - 1].flag & 
GP_CURVE_POINT_SELECT;
 
+  /* iterate over middle points */
+  for (int i = 1; i < gpc->tot_curve_points - 1; i++) {
+    bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
+
+    /* Create new stroke if selected point */
+    if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+      bGPDstroke *gps_new = BKE_gpencil_stroke_duplicate(gps, false, false);
+      gps_new->points = NULL;
+      gps_new->flag &= ~GP_STROKE_CYCLIC;
+      gps_new->prev = gps_new->next = NULL;
+
+      gps_new->editcurve = BKE_gpencil_stroke_editcurve_new(2);
+      bGPDcurve *new_gpc = gps_new->editcurve;
+      for (int j = 0; j < new_gpc->tot_curve_points; j++) {
+        bGPDcurve_point *gpc_pt_new = &new_gpc->curve_points[j];
+        memcpy(gpc_pt_new, gpc_pt, sizeof(bGPDcurve_point));
+        gpc_pt_new->flag &= ~GP_CURVE_POINT_SELECT;
+        BEZT_DESEL_ALL(&gpc_pt_new->bezt);
+      }
+
+      /* select last point */
+      bGPDcurve_point *gpc_pt_last = &new_gpc->curve_points[1];
+      gpc_pt_last->flag |= GP_CURVE_POINT_SELECT;
+      BEZT_SEL_ALL(&gpc_pt_last->bezt);
+
+      BLI_insertlinkafter(&gpf->strokes, gps, gps_new);
+
+      gps_new->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
+      BKE_gpencil_stroke_geometry_update(gpd, gps_new);
+
+      gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
+      BEZT_DESEL_ALL(&gpc_pt->bezt);
+    }
+  }
+
   if (first_select || last_select) {
     int new_num_points = old_num_points;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to