[Bf-blender-cvs] [aa03554f700] soc-2021-curves: Refactoring

Dilith Jayakody noreply at git.blender.org
Sun Jan 30 13:37:19 CET 2022


Commit: aa03554f700fce3570028135de29be456b6f4166
Author: Dilith Jayakody
Date:   Sun Jan 30 17:06:44 2022 +0530
Branches: soc-2021-curves
https://developer.blender.org/rBaa03554f700fce3570028135de29be456b6f4166

Refactoring

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

M	source/blender/editors/curve/editcurve_pen.c

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

diff --git a/source/blender/editors/curve/editcurve_pen.c b/source/blender/editors/curve/editcurve_pen.c
index 59881f85607..543c26fa555 100644
--- a/source/blender/editors/curve/editcurve_pen.c
+++ b/source/blender/editors/curve/editcurve_pen.c
@@ -217,84 +217,6 @@ static bool worldspace_to_screenspace(const float pos_3d[3],
          V3D_PROJ_RET_OK;
 }
 
-/* Get average of centers of all selected #BezTriple. */
-static void get_displacement_to_avg_selected_bezt(const ListBase *nurbs,
-                                                  float r_change[2],
-                                                  const wmEvent *event,
-                                                  const ViewContext *vc)
-{
-  float total[3] = {0.0f, 0.0f, 0.0f};
-  int count = 0;
-  FOREACH_SELECTED_BEZT_BEGIN(bezt, nurbs)
-  add_v3_v3(total, bezt->vec[1]);
-  count++;
-  FOREACH_SELECTED_BEZT_END
-
-  if (count) {
-    mul_v3_fl(total, 1.0f / count);
-    worldspace_to_screenspace(total, vc, r_change);
-    const float mval[2] = {UNPACK2(event->mval)};
-    negate_v2(r_change);
-    add_v2_v2(r_change, mval);
-  }
-}
-
-/* Move the handle of the newly added #BezTriple to mouse. */
-static void move_new_bezt_handles_to_mouse(const wmEvent *event,
-                                           const ViewContext *vc,
-                                           const bool link_handles,
-                                           ListBase *nurbs)
-{
-  float change[2];
-  get_displacement_to_avg_selected_bezt(nurbs, change, event, vc);
-
-  FOREACH_SELECTED_BEZT_BEGIN(bezt, nurbs)
-  if (bezt->h1 == HD_VECT && bezt->h2 == HD_VECT) {
-    bezt->h1 = HD_ALIGN;
-    bezt->h2 = HD_ALIGN;
-  }
-
-  const bool is_last_point = nu->pntsu > 1 && nu->bezt + nu->pntsu - 1 == bezt &&
-                             !(nu->flagu & CU_NURB_CYCLIC);
-
-  float bezt_loc[2];
-  worldspace_to_screenspace(bezt->vec[1], vc, bezt_loc);
-  add_v2_v2(bezt_loc, change);
-
-  float location[3];
-  screenspace_to_worldspace(bezt_loc, bezt->vec[1], vc, location);
-
-  /* If the new point is the last point of the curve, move the second handle to the mouse. */
-  if (is_last_point) {
-
-    copy_v3_v3(bezt->vec[2], location);
-
-    if (bezt->h2 != HD_FREE) {
-      float handle_vec[3];
-      sub_v3_v3v3(handle_vec, bezt->vec[1], location);
-      if (!link_handles) {
-        float handle_len = len_v3v3(bezt->vec[0], bezt->vec[1]);
-        normalize_v3_length(handle_vec, handle_len);
-      }
-      add_v3_v3v3(bezt->vec[0], bezt->vec[1], handle_vec);
-    }
-  }
-  else {
-    copy_v3_v3(bezt->vec[0], location);
-
-    if (bezt->h1 != HD_FREE) {
-      float handle_vec[3];
-      sub_v3_v3v3(handle_vec, bezt->vec[1], location);
-      if (!link_handles) {
-        float handle_len = len_v3v3(bezt->vec[2], bezt->vec[1]);
-        normalize_v3_length(handle_vec, handle_len);
-      }
-      add_v3_v3v3(bezt->vec[2], bezt->vec[1], handle_vec);
-    }
-  }
-  FOREACH_SELECTED_BEZT_END
-}
-
 static void move_bezt_by_change(BezTriple *bezt, const float change[3])
 {
   add_v3_v3(bezt->vec[0], change);
@@ -391,7 +313,10 @@ static void move_bp_to_location(BPoint *bp, const float mval[2], const ViewConte
   copy_v3_v3(bp->vec, location);
 }
 
-static bool get_selected_center(const ListBase *nurbs, float r_center[3], bool use_mid)
+static bool get_selected_center(const ListBase *nurbs,
+                                float r_center[3],
+                                const bool mid_only,
+                                const bool bezt_only)
 {
   int end_count = 0;
   zero_v3(r_center);
@@ -399,7 +324,7 @@ static bool get_selected_center(const ListBase *nurbs, float r_center[3], bool u
     if (nu1->type == CU_BEZIER) {
       for (int i = 0; i < nu1->pntsu; i++) {
         BezTriple *bezt = nu1->bezt + i;
-        if (use_mid) {
+        if (mid_only) {
           if (BEZT_ISSEL_ANY(bezt)) {
             add_v3_v3(r_center, bezt->vec[1]);
             end_count++;
@@ -421,7 +346,7 @@ static bool get_selected_center(const ListBase *nurbs, float r_center[3], bool u
         }
       }
     }
-    else {
+    else if (!bezt_only) {
       for (int i = 0; i < nu1->pntsu; i++) {
         if ((nu1->bp + i)->f1 & SELECT) {
           add_v3_v3(r_center, (nu1->bp + i)->vec);
@@ -439,14 +364,16 @@ static bool get_selected_center(const ListBase *nurbs, float r_center[3], bool u
 
 /* Move all selected points by an amount equivalent to the distance moved by mouse. */
 static void move_all_selected_points(ListBase *nurbs,
+                                     const bool bezt_only,
                                      const bool move_entire,
+                                     const bool handles_only,
                                      CurvePenData *cpd,
                                      const wmEvent *event,
                                      const ViewContext *vc)
 {
   float center[3] = {0.0f, 0.0f, 0.0f};
   float change[2], center_2d[2];
-  get_selected_center(nurbs, center, false);
+  get_selected_center(nurbs, center, false, bezt_only);
   worldspace_to_screenspace(center, vc, center_2d);
   float mval[2] = {UNPACK2(event->xy)};
   sub_v2_v2v2(change, mval, center_2d);
@@ -463,7 +390,7 @@ static void move_all_selected_points(ListBase *nurbs,
   float change_len = 0.0f;
   if (lock_angle) {
     float mval_3d[3], center_mid[3];
-    get_selected_center(nurbs, center_mid, true);
+    get_selected_center(nurbs, center_mid, true, true);
     screenspace_to_worldspace_int(event->mval, center_mid, vc, mval_3d);
     change_len = len_v3v3(center_mid, mval_3d);
   }
@@ -472,7 +399,7 @@ static void move_all_selected_points(ListBase *nurbs,
     if (nu->type == CU_BEZIER) {
       for (int i = 0; i < nu->pntsu; i++) {
         BezTriple *bezt = nu->bezt + i;
-        if (BEZT_ISSEL_IDX(bezt, 1) || (move_entire && BEZT_ISSEL_ANY(bezt))) {
+        if (!handles_only && (BEZT_ISSEL_IDX(bezt, 1) || (move_entire && BEZT_ISSEL_ANY(bezt)))) {
           float pos[2], dst[2];
           worldspace_to_screenspace(bezt->vec[1], vc, pos);
           add_v2_v2v2(dst, pos, change);
@@ -1223,6 +1150,11 @@ static void deselect_all_center_vertices(ListBase *nurbs)
   }
 }
 
+static bool is_last_bezt(const Nurb *nu, const BezTriple *bezt)
+{
+  return nu->pntsu > 1 && nu->bezt + nu->pntsu - 1 == bezt && !(nu->flagu & CU_NURB_CYCLIC);
+}
+
 /* Add new vertices connected to the selected vertices. */
 static void extrude_points_from_selected_vertices(const ViewContext *vc,
                                                   Object *obedit,
@@ -1236,7 +1168,7 @@ static void extrude_points_from_selected_vertices(const ViewContext *vc,
   if (!extrude_center) {
     deselect_all_center_vertices(nurbs);
   }
-  bool sel_exists = get_selected_center(nurbs, center, true);
+  bool sel_exists = get_selected_center(nurbs, center, true, false);
 
   float location[3];
   if (sel_exists) {
@@ -1307,6 +1239,9 @@ static void extrude_points_from_selected_vertices(const ViewContext *vc,
   if (bezt) {
     bezt->h1 = extrude_handle;
     bezt->h2 = extrude_handle;
+
+    BEZT_DESEL_ALL(bezt);
+    BEZT_SEL_IDX(bezt, is_last_bezt(nu, bezt) ? 2 : 0);
   }
   FOREACH_SELECTED_BEZT_END
 }
@@ -1686,13 +1621,14 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
   if (!cpd->free_toggle_pressed && is_extra_key_pressed(event, free_toggle)) {
     toggle_bezt_free_align_handles(nurbs);
     cpd->dragging = true;
+    cpd->link_handles = false;
   }
   cpd->free_toggle_pressed = is_extra_key_pressed(event, free_toggle);
 
   if (!cpd->link_handles_pressed && is_extra_key_pressed(event, link_handles)) {
     cpd->link_handles = !cpd->link_handles;
     if (cpd->link_handles) {
-      move_all_selected_points(nurbs, false, cpd, event, &vc);
+      move_all_selected_points(nurbs, false, false, true, cpd, event, &vc);
     }
     else {
       // Recalculate offset after link handles is turned off
@@ -1704,7 +1640,7 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
   if (!cpd->lock_angle_pressed && is_extra_key_pressed(event, lock_angle)) {
     cpd->lock_angle = !cpd->lock_angle;
     if (cpd->lock_angle) {
-      move_all_selected_points(nurbs, false, cpd, event, &vc);
+      move_all_selected_points(nurbs, false, false, true, cpd, event, &vc);
     }
     else {
       // Recalculate offset after lock angle is turned off
@@ -1719,6 +1655,13 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
     if (!cpd->dragging && WM_event_drag_test(event, event->prev_click_xy) &&
         event->val == KM_PRESS) {
       cpd->dragging = true;
+      if (cpd->new_point) {
+        FOREACH_SELECTED_BEZT_BEGIN(bezt, nurbs)
+        bezt->h1 = bezt->h2 = HD_ALIGN;
+        copy_v3_v3(bezt->vec[0], bezt->vec[1]);
+        copy_v3_v3(bezt->vec[2], bezt->vec[1]);
+        FOREACH_SELECTED_BEZT_END
+      }
     }
     if (cpd->dragging) {
       if (cpd->spline_nearby && move_seg && cpd->msd != NULL) {
@@ -1734,18 +1677,13 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
       /* If dragging a new control point, move handle point with mouse cursor. Else move entire
        * control point. */
       else if (cpd->new_point) {
-        if (is_extra_key_pressed(event, move_entire)) {
-          move_all_selected_points(nurbs, move_entire_pressed, cpd, event, &vc);
-        }
-        else {
-          move_new_bezt_handles_to_mouse(event, &vc, cpd->link_handles, nurbs);
-        }
+        move_all_selected_points(nurbs, true, move_entire_pressed, false, cpd, event, &vc);
         cpd->acted = true;
       }
       else if ((select_point || move_point) && !cpd->spline_nearby) {
         if (cpd->found_point) {
           if (move_point) {
-            move_all_selected_points(nurbs, move_entire_pressed, cpd, event, &vc);
+            move_all_selected_points(nurbs, false, move_entire_pressed, false, cpd, event, &vc);
             cpd->acted = true;
           }
         }



More information about the Bf-blender-cvs mailing list