[Bf-blender-cvs] [da365bc2adb] master: Fix T102163: GPencil:Set start point Operator make stroke deleted

Antonio Vazquez noreply at git.blender.org
Sun Oct 30 16:15:25 CET 2022


Commit: da365bc2adbf1c89c53136f832df9dfe7b998504
Author: Antonio Vazquez
Date:   Sun Oct 30 16:15:11 2022 +0100
Branches: master
https://developer.blender.org/rBda365bc2adbf1c89c53136f832df9dfe7b998504

Fix T102163: GPencil:Set start point Operator make stroke deleted

There were two problems:

* The stroke was deleted if the last point was selected. Now
the stroke is flipped because is faster.

* If the second point was selected, the first point was removed
because the internal api, removed one point strokes by
default.  This was done becaus ethe tools that used this API
did not need one point strokes as result. Now this optional 
and keep one point strokes.

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

M	source/blender/blenkernel/BKE_gpencil_geom.h
M	source/blender/blenkernel/intern/gpencil_geom.cc
M	source/blender/editors/gpencil/gpencil_edit.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h
index b9219814c08..976961f27ae 100644
--- a/source/blender/blenkernel/BKE_gpencil_geom.h
+++ b/source/blender/blenkernel/BKE_gpencil_geom.h
@@ -332,8 +332,12 @@ bool BKE_gpencil_stroke_stretch(struct bGPDstroke *gps,
  * \param gps: Target stroke.
  * \param index_from: the index of the first point to be used in the trimmed result.
  * \param index_to: the index of the last point to be used in the trimmed result.
+ * \param keep_point: Keep strokes with one point. False remove the single points strokes
  */
-bool BKE_gpencil_stroke_trim_points(struct bGPDstroke *gps, int index_from, int index_to);
+bool BKE_gpencil_stroke_trim_points(struct bGPDstroke *gps,
+                                    int index_from,
+                                    int index_to,
+                                    const bool keep_point);
 /**
  * Split the given stroke into several new strokes, partitioning
  * it based on whether the stroke points have a particular flag
diff --git a/source/blender/blenkernel/intern/gpencil_geom.cc b/source/blender/blenkernel/intern/gpencil_geom.cc
index 52fcdef8a43..9297663b157 100644
--- a/source/blender/blenkernel/intern/gpencil_geom.cc
+++ b/source/blender/blenkernel/intern/gpencil_geom.cc
@@ -789,7 +789,10 @@ bool BKE_gpencil_stroke_stretch(bGPDstroke *gps,
 /** \name Stroke Trim
  * \{ */
 
-bool BKE_gpencil_stroke_trim_points(bGPDstroke *gps, const int index_from, const int index_to)
+bool BKE_gpencil_stroke_trim_points(bGPDstroke *gps,
+                                    const int index_from,
+                                    const int index_to,
+                                    const bool keep_point)
 {
   bGPDspoint *pt = gps->points, *new_pt;
   MDeformVert *dv, *new_dv;
@@ -800,7 +803,7 @@ bool BKE_gpencil_stroke_trim_points(bGPDstroke *gps, const int index_from, const
     return false;
   }
 
-  if (new_count == 1) {
+  if ((!keep_point) && (new_count == 1)) {
     if (gps->dvert) {
       BKE_gpencil_free_stroke_weights(gps);
       MEM_freeN(gps->dvert);
@@ -894,7 +897,7 @@ bool BKE_gpencil_stroke_split(bGPdata *gpd,
   /* Trim the original stroke into a shorter one.
    * Keep the end point. */
 
-  BKE_gpencil_stroke_trim_points(gps, 0, old_count);
+  BKE_gpencil_stroke_trim_points(gps, 0, old_count, false);
   BKE_gpencil_stroke_geometry_update(gpd, gps);
   return true;
 }
@@ -917,7 +920,7 @@ bool BKE_gpencil_stroke_shrink(bGPDstroke *gps, const float dist, const short mo
     if (gps->totpoints == 1) {
       second_last = &pt[1];
       if (len_v3v3(&second_last->x, &pt->x) < dist) {
-        BKE_gpencil_stroke_trim_points(gps, 0, 0);
+        BKE_gpencil_stroke_trim_points(gps, 0, 0, false);
         return true;
       }
     }
@@ -969,7 +972,7 @@ bool BKE_gpencil_stroke_shrink(bGPDstroke *gps, const float dist, const short mo
     index_start = index_end = 0; /* no length left to cut */
   }
 
-  BKE_gpencil_stroke_trim_points(gps, index_start, index_end);
+  BKE_gpencil_stroke_trim_points(gps, index_start, index_end, false);
 
   if (gps->totpoints == 0) {
     return false;
@@ -3562,8 +3565,8 @@ void BKE_gpencil_stroke_start_set(bGPDstroke *gps, int start_idx)
   }
 
   bGPDstroke *gps_b = BKE_gpencil_stroke_duplicate(gps, true, false);
-  BKE_gpencil_stroke_trim_points(gps_b, 0, start_idx - 1);
-  BKE_gpencil_stroke_trim_points(gps, start_idx, gps->totpoints - 1);
+  BKE_gpencil_stroke_trim_points(gps_b, 0, start_idx - 1, true);
+  BKE_gpencil_stroke_trim_points(gps, start_idx, gps->totpoints - 1, true);
 
   /* Join both strokes. */
   BKE_gpencil_stroke_join(gps, gps_b, false, false, false, false);
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 6181b9810e3..66f86a3e0c1 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -3848,7 +3848,12 @@ static int gpencil_stroke_start_set_exec(bContext *C, wmOperator *op)
             for (int i = 0; i < gps->totpoints; i++) {
               pt = &gps->points[i];
               if (pt->flag & GP_SPOINT_SELECT) {
-                BKE_gpencil_stroke_start_set(gps, i);
+                if (i == gps->totpoints - 1) {
+                  BKE_gpencil_stroke_flip(gps);
+                }
+                else {
+                  BKE_gpencil_stroke_start_set(gps, i);
+                }
                 BKE_gpencil_stroke_geometry_update(gpd, gps);
                 changed = true;
                 break;



More information about the Bf-blender-cvs mailing list