[Bf-blender-cvs] [9a6cc25a8b6] soc-2021-curves: Added support to enable move point & select multi

dilithjay noreply at git.blender.org
Sun Jan 2 11:03:17 CET 2022


Commit: 9a6cc25a8b631d15ff3bf0c817de96cc3da00df9
Author: dilithjay
Date:   Sun Jan 2 14:33:03 2022 +0530
Branches: soc-2021-curves
https://developer.blender.org/rB9a6cc25a8b631d15ff3bf0c817de96cc3da00df9

Added support to enable move point & select multi

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

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	source/blender/editors/curve/editcurve_pen.c

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

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 374a23ca440..a518b57f2da 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -7003,7 +7003,7 @@ def km_3d_view_tool_edit_curve_pen(params):
             ("curve.pen", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
              {"properties": [("delete_point", True),]}),
             ("curve.pen", {"type": params.tool_mouse, "value": 'PRESS', "shift": True},
-             {"properties": [("insert_point", True),]}),
+             {"properties": [("insert_point", True), ("select_multi", True),]}),
             ("curve.pen", {"type": params.tool_mouse, "value": 'DOUBLE_CLICK'},
              {"properties": [("make_vector", True),]}),
         ]},
diff --git a/source/blender/editors/curve/editcurve_pen.c b/source/blender/editors/curve/editcurve_pen.c
index d8de0a83f51..d427db45106 100644
--- a/source/blender/editors/curve/editcurve_pen.c
+++ b/source/blender/editors/curve/editcurve_pen.c
@@ -90,6 +90,8 @@ typedef struct CurvePenData {
   bool found_point;
   /* Whether multiple selected points should be moved. */
   bool multi_point;
+  /* Whether a point has already been selected. */
+  bool selection_made;
 
   Nurb *nu;
   BezTriple *bezt;
@@ -1282,27 +1284,21 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
   else if (ELEM(event->type, LEFTMOUSE)) {
     if (event->val == KM_PRESS) {
       ED_curve_nurb_vert_selected_find(cu, vc.v3d, &nu, &bezt, &bp);
-      if (select_point || move_point) {
-        short bezt_idx = 0;
-        if ((!nu || bezt || bp) && ED_curve_editnurb_select_pick_thresholded(
-                                       C, event->mval, sel_dist_mul, false, false, false)) {
-          cpd->found_point = true;
-          cpd->nu = nu;
-          cpd->bezt = bezt;
-          cpd->bp = bp;
+      cpd->nu = nu;
+      cpd->bezt = bezt;
+      cpd->bp = bp;
+
+      if (select_point || move_point || select_multi) {
+        if (move_point && (!nu || bezt || bp)) {
+          cpd->found_point = ED_curve_editnurb_select_pick_thresholded(
+              C, event->mval, sel_dist_mul, false, false, false);
+          cpd->selection_made = true;
         }
-        else if (!(bezt || bp) && get_closest_vertex_to_point_in_nurbs(&(cu->editnurb->nurbs),
-                                                                       &nu,
-                                                                       &bezt,
-                                                                       &bp,
-                                                                       &bezt_idx,
-                                                                       mval_fl,
-                                                                       sel_dist_mul,
-                                                                       &vc)) {
-          cpd->found_point = true;
-          cpd->nu = nu;
-          cpd->bezt = bezt;
-          cpd->bp = bp;
+        else {
+          short bezt_idx = 0;
+          cpd->found_point = get_closest_vertex_to_point_in_nurbs(
+              &(cu->editnurb->nurbs), &nu, &bezt, &bp, &bezt_idx, mval_fl, sel_dist_mul, &vc);
+          /* If point under mouse is selected, set cpd->multi_point to true. */
           if ((bezt && BEZT_ISSEL_IDX(bezt, bezt_idx)) || bp) {
             cpd->multi_point = true;
           }
@@ -1342,6 +1338,7 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
       }
 
       if (!cpd->acted && close_spline && cpd->found_point && !cpd->dragging) {
+        ED_curve_nurb_vert_selected_find(cu, vc.v3d, &nu, &bezt, &bp);
         if (cpd->nu && !(cpd->nu->flagu & CU_NURB_CYCLIC)) {
           copy_v2_v2_int(vc.mval, event->mval);
           cpd->acted = cpd->nu->pntsu > 2 &&
@@ -1385,24 +1382,26 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
         }
       }
 
-      if (!cpd->acted && select_multi) {
-        short bezt_idx;
-        get_closest_vertex_to_point_in_nurbs(
-            &(cu->editnurb->nurbs), &nu, &bezt, &bp, &bezt_idx, mval_fl, sel_dist_mul, &vc);
-        if (bezt) {
-          select_deselect_bezt(bezt, bezt_idx);
-        }
-        else if (bp) {
-          select_deselect_bp(bp);
+      if (!cpd->selection_made) {
+        if (!cpd->acted && select_multi) {
+          short bezt_idx;
+          get_closest_vertex_to_point_in_nurbs(
+              &(cu->editnurb->nurbs), &nu, &bezt, &bp, &bezt_idx, mval_fl, sel_dist_mul, &vc);
+          if (bezt) {
+            select_deselect_bezt(bezt, bezt_idx);
+          }
+          else if (bp) {
+            select_deselect_bp(bp);
+          }
+          else {
+            ED_curve_deselect_all(cu->editnurb);
+          }
         }
-        else {
-          ED_curve_deselect_all(cu->editnurb);
+        else if (!cpd->acted && select_point) {
+          ED_curve_editnurb_select_pick_thresholded(
+              C, event->mval, sel_dist_mul, false, false, false);
         }
       }
-      else if (!cpd->acted && select_point) {
-        ED_curve_editnurb_select_pick_thresholded(
-            C, event->mval, sel_dist_mul, false, false, false);
-      }
 
       if (cpd->msd != NULL) {
         MEM_freeN(cpd->msd);



More information about the Bf-blender-cvs mailing list