[Bf-blender-cvs] [bd71007ebda] soc-2020-greasepencil-curve: GPencil: Implement select more/less curve points

Falk David noreply at git.blender.org
Wed Jul 15 11:56:28 CEST 2020


Commit: bd71007ebda79c0cadabdb83dae1c01bbd71fcfa
Author: Falk David
Date:   Wed Jul 15 11:55:18 2020 +0200
Branches: soc-2020-greasepencil-curve
https://developer.blender.org/rBbd71007ebda79c0cadabdb83dae1c01bbd71fcfa

GPencil: Implement select more/less curve points

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

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

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

diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c
index 05912d45b9c..70e8649dd94 100644
--- a/source/blender/editors/gpencil/gpencil_select.c
+++ b/source/blender/editors/gpencil/gpencil_select.c
@@ -922,52 +922,57 @@ static int gpencil_select_more_exec(bContext *C, wmOperator *UNUSED(op))
 
   bool changed = false;
   if (is_curve_edit) {
-    /* TODO: do curve select */
-    // GP_EDITABLE_STROKES_BEGIN (gp_iter, C, gpl, gps) {
-    //   if (gps->editcurve != NULL && gps->flag & GP_STROKE_SELECT) {
-    //     bGPDcurve *editcurve = gps->editcurve;
-    //     int i;
-
-    //     /* First Pass: Go in forward order,
-    //      * expanding selection if previous was selected (pre changes).
-    //      * - This pass covers the "after" edges of selection islands
-    //      */
-    //     bool prev_sel = false;
-    //     for (i = 0; i < editcurve->tot_curve_points; i++) {
-    //       BezTriple *bezt = &editcurve->curve_points[i].bezt;
-    //       if (bezt->f2 & SELECT) {
-    //         /* selected point - just set flag for next point */
-    //         prev_sel = true;
-    //       }
-    //       else {
-    //         /* unselected point - expand selection if previous was selected... */
-    //         if (prev_sel) {
-    //           BEZT_SEL_ALL(bezt);
-    //         }
-    //         prev_sel = false;
-    //       }
-    //     }
-
-    //     /* Second Pass: Go in reverse order, doing the same as before (except in opposite order)
-    //      * - This pass covers the "before" edges of selection islands
-    //      */
-    //     prev_sel = false;
-    //     for (i = editcurve->tot_curve_points - 1; i > 0; i--) {
-    //       BezTriple *bezt = &editcurve->curve_points[i].bezt;
-    //       if (bezt->f2 & SELECT) {
-    //         prev_sel = true;
-    //       }
-    //       else {
-    //         /* unselected point - expand selection if previous was selected... */
-    //         if (prev_sel) {
-    //           BEZT_SEL_ALL(bezt);
-    //         }
-    //         prev_sel = false;
-    //       }
-    //     }
-    //   }
-    // }
-    // GP_EDITABLE_STROKES_END(gp_iter);
+    GP_EDITABLE_STROKES_BEGIN (gp_iter, C, gpl, gps) {
+      if (gps->editcurve != NULL && gps->flag & GP_STROKE_SELECT) {
+        bGPDcurve *editcurve = gps->editcurve;
+        int i;
+
+        /* First Pass: Go in forward order,
+         * expanding selection if previous was selected (pre changes).
+         * - This pass covers the "after" edges of selection islands
+         */
+        bool prev_sel = false;
+        for (i = 0; i < editcurve->tot_curve_points; i++) {
+          bGPDcurve_point *gpc_pt = &editcurve->curve_points[i];
+          BezTriple *bezt = &gpc_pt->bezt;
+          if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+            /* selected point - just set flag for next point */
+            prev_sel = true;
+          }
+          else {
+            /* unselected point - expand selection if previous was selected... */
+            if (prev_sel) {
+              gpc_pt->flag |= GP_CURVE_POINT_SELECT;
+              BEZT_SEL_ALL(bezt);
+              changed = true;
+            }
+            prev_sel = false;
+          }
+        }
+
+        /* Second Pass: Go in reverse order, doing the same as before (except in opposite order)
+         * - This pass covers the "before" edges of selection islands
+         */
+        prev_sel = false;
+        for (i = editcurve->tot_curve_points - 1; i > 0; i--) {
+          bGPDcurve_point *gpc_pt = &editcurve->curve_points[i];
+          BezTriple *bezt = &gpc_pt->bezt;
+          if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+            prev_sel = true;
+          }
+          else {
+            /* unselected point - expand selection if previous was selected... */
+            if (prev_sel) {
+              gpc_pt->flag |= GP_CURVE_POINT_SELECT;
+              BEZT_SEL_ALL(bezt);
+              changed = true;
+            }
+            prev_sel = false;
+          }
+        }
+      }
+    }
+    GP_EDITABLE_STROKES_END(gp_iter);
   }
   else {
     CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
@@ -1065,49 +1070,54 @@ static int gpencil_select_less_exec(bContext *C, wmOperator *UNUSED(op))
 
   bool changed = false;
   if (is_curve_edit) {
-    /* TODO: do curve select */
-    // GP_EDITABLE_STROKES_BEGIN (gp_iter, C, gpl, gps) {
-    //   if (gps->editcurve != NULL && gps->flag & GP_STROKE_SELECT) {
-    //     bGPDcurve *editcurve = gps->editcurve;
-    //     int i;
-
-    //     bool prev_sel = false;
-    //     for (i = 0; i < editcurve->tot_curve_points; i++) {
-    //       BezTriple *bezt = &editcurve->curve_points[i].bezt;
-    //       if (bezt->f2 & SELECT) {
-    //         /* shrink if previous wasn't selected */
-    //         if (prev_sel == false) {
-    //           BEZT_DESEL_ALL(bezt);
-    //         }
-    //         prev_sel = true;
-    //       }
-    //       else {
-    //         /* mark previous as being unselected - and hence, is trigger for shrinking */
-    //         prev_sel = false;
-    //       }
-    //     }
-
-    //     /* Second Pass: Go in reverse order, doing the same as before (except in opposite order)
-    //      * - This pass covers the "before" edges of selection islands
-    //      */
-    //     prev_sel = false;
-    //     for (i = editcurve->tot_curve_points - 1; i > 0; i--) {
-    //       BezTriple *bezt = &editcurve->curve_points[i].bezt;
-    //       if (bezt->f2 & SELECT) {
-    //         /* shrink if previous wasn't selected */
-    //         if (prev_sel == false) {
-    //           BEZT_DESEL_ALL(bezt);
-    //         }
-    //         prev_sel = true;
-    //       }
-    //       else {
-    //         /* mark previous as being unselected - and hence, is trigger for shrinking */
-    //         prev_sel = false;
-    //       }
-    //     }
-    //   }
-    // }
-    // GP_EDITABLE_STROKES_END(gp_iter);
+    GP_EDITABLE_STROKES_BEGIN (gp_iter, C, gpl, gps) {
+      if (gps->editcurve != NULL && gps->flag & GP_STROKE_SELECT) {
+        bGPDcurve *editcurve = gps->editcurve;
+        int i;
+
+        bool prev_sel = false;
+        for (i = 0; i < editcurve->tot_curve_points; i++) {
+          bGPDcurve_point *gpc_pt = &editcurve->curve_points[i];
+          BezTriple *bezt = &gpc_pt->bezt;
+          if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+            /* shrink if previous wasn't selected */
+            if (prev_sel == false) {
+              gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
+              BEZT_DESEL_ALL(bezt);
+              changed = true;
+            }
+            prev_sel = true;
+          }
+          else {
+            /* mark previous as being unselected - and hence, is trigger for shrinking */
+            prev_sel = false;
+          }
+        }
+
+        /* Second Pass: Go in reverse order, doing the same as before (except in opposite order)
+         * - This pass covers the "before" edges of selection islands
+         */
+        prev_sel = false;
+        for (i = editcurve->tot_curve_points - 1; i > 0; i--) {
+          bGPDcurve_point *gpc_pt = &editcurve->curve_points[i];
+          BezTriple *bezt = &gpc_pt->bezt;
+          if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+            /* shrink if previous wasn't selected */
+            if (prev_sel == false) {
+              gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
+              BEZT_DESEL_ALL(bezt);
+              changed = true;
+            }
+            prev_sel = true;
+          }
+          else {
+            /* mark previous as being unselected - and hence, is trigger for shrinking */
+            prev_sel = false;
+          }
+        }
+      }
+    }
+    GP_EDITABLE_STROKES_END(gp_iter);
   }
   else {
     CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
@@ -2472,49 +2482,43 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op)
     return OPERATOR_CANCELLED;
   }
 
-  if (is_curve_edit) {
-    /* TODO: do curve select */
-  }
-  else {
-    /* Select any visible stroke that uses any of these colors. */
-    CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
-      bGPDspoint *pt;
-      int i;
-      bool gps_selected = false;
-      /* Check all stroke points. */
-      for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
-        if (pt->vert_color[3] == 0.0f) {
-          continue;
-        }
+  /* Select any visible stroke that uses any of these colors. */
+  CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
+    bGPDspoint *pt;
+    int i;
+    bool gps_selected = false;
+    /* Check all stroke points. */
+    for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+      if (pt->vert_color[3] == 0.0f) {
+        continue;
+      }
 
-        /* Only check Hue to get value and saturation full ranges. */
-        float hsv[3];
-        /* Round Hue value. */
-        rgb_to_hsv_compat_v(pt->vert_color, hsv);
-        uint key = truncf(hsv[0] * range);
+      /* Only check Hue to get value and saturation full ranges. */
+      float hsv[3];
+      /* Round Hue value. */
+      rgb_to_hsv_compat_v(pt->vert_color, hsv);
+      uint key = truncf(hsv[0] * range);
 
-        if (BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
-          pt->flag |= GP_SPOINT_SELECT;
-          gps_selected = true;
-        }
+      if (BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
+        pt->flag |= GP_SPOINT_SELECT;
+        gps_selected = true;
       }
+    }
 
-      if (gps_selected) {
-        gps->flag |= GP_STROKE_SELECT;
-        changed = true;
+    if (gps_selected) {
+      gps->flag |= GP_STROKE_SELECT;
 
-        /* Extend stroke selection. */
-        if (selectmode == GP_SELECTMODE_STROKE) {
-          bGPDspoint *pt1 = NULL;
+      /* Extend stroke selection. */
+      if (selectmode == GP_SELECTMODE_STROKE) {
+        bGPDspoint *pt1 = NULL;
 
-          for (i = 0, pt1 = gps->points; i < gps->totpoints; i++, pt1++) {
-            pt1->flag |= GP_SPOINT_SELECT;
-          }
+        for (i = 0, pt1 = gps->points; i < gps->

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list