[Bf-blender-cvs] [0f2f114be99] soc-2021-curves: Added vertex dissolve support for curve pen

dilithjay noreply at git.blender.org
Sat Aug 14 04:57:26 CEST 2021


Commit: 0f2f114be994f47ac895e9e50ac01e470bc4c450
Author: dilithjay
Date:   Sat Aug 14 00:32:34 2021 +0530
Branches: soc-2021-curves
https://developer.blender.org/rB0f2f114be994f47ac895e9e50ac01e470bc4c450

Added vertex dissolve support for curve pen

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

M	release/datafiles/locale
M	release/scripts/addons
M	source/blender/editors/curve/curve_intern.h
M	source/blender/editors/curve/editcurve.c
M	source/blender/editors/curve/editcurve_pen.c
M	source/tools

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index ca39c1459bc..35573b45adc 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit ca39c1459bcd99300afe3591fa5ffe40f5ba5eef
+Subproject commit 35573b45adc0cc00a29538a68567621ab571a88f
diff --git a/release/scripts/addons b/release/scripts/addons
index aebb668f75b..31abe549839 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit aebb668f75b57ba7cbd8f8f8ad41f0ddb4f27389
+Subproject commit 31abe549839bdb30ce0926142bcbf8a3d9236067
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 154757d47c9..819b565f778 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -145,6 +145,12 @@ void ED_curve_keyindex_update_nurb(struct EditNurb *editnurb, struct Nurb *nu, s
 bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb, View3D *v3d);
 int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, View3D *v3d, const float location_init[3]);
 bool curve_toggle_cyclic(View3D *v3d, ListBase *editnurb, int direction);
+void dissolve_bez_segment(BezTriple *bezt_prev,
+                          BezTriple *bezt_next,
+                          Nurb *nu,
+                          const Curve *cu,
+                          const int span_len,
+                          uint span_step[2]);
 
 /* helper functions */
 void ed_editnurb_translate_flag(struct ListBase *editnurb,
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 8a6287f3adb..6ee5a7dea06 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -6505,6 +6505,70 @@ static bool test_bezt_is_sel_any(const void *bezt_v, void *user_data)
   return BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt);
 }
 
+void dissolve_bez_segment(BezTriple *bezt_prev,
+                          BezTriple *bezt_next,
+                          const Nurb *nu,
+                          const Curve *cu,
+                          const int span_len,
+                          const uint span_step[2])
+{
+  int i_span_edge_len = span_len + 1;
+  const uint dims = 3;
+
+  const uint points_len = ((cu->resolu - 1) * i_span_edge_len) + 1;
+  float *points = MEM_mallocN(points_len * dims * sizeof(float), __func__);
+  float *points_stride = points;
+  const int points_stride_len = (cu->resolu - 1);
+
+  for (int segment = 0; segment < i_span_edge_len; segment++) {
+    BezTriple *bezt_a = &nu->bezt[mod_i((span_step[0] + segment) - 1, nu->pntsu)];
+    BezTriple *bezt_b = &nu->bezt[mod_i((span_step[0] + segment), nu->pntsu)];
+
+    for (int axis = 0; axis < dims; axis++) {
+      BKE_curve_forward_diff_bezier(bezt_a->vec[1][axis],
+                                    bezt_a->vec[2][axis],
+                                    bezt_b->vec[0][axis],
+                                    bezt_b->vec[1][axis],
+                                    points_stride + axis,
+                                    points_stride_len,
+                                    dims * sizeof(float));
+    }
+
+    points_stride += dims * points_stride_len;
+  }
+
+  BLI_assert(points_stride + dims == points + (points_len * dims));
+
+  float tan_l[3], tan_r[3], error_sq_dummy;
+  uint error_index_dummy;
+
+  sub_v3_v3v3(tan_l, bezt_prev->vec[1], bezt_prev->vec[2]);
+  normalize_v3(tan_l);
+  sub_v3_v3v3(tan_r, bezt_next->vec[0], bezt_next->vec[1]);
+  normalize_v3(tan_r);
+
+  curve_fit_cubic_to_points_single_fl(points,
+                                      points_len,
+                                      NULL,
+                                      dims,
+                                      FLT_EPSILON,
+                                      tan_l,
+                                      tan_r,
+                                      bezt_prev->vec[2],
+                                      bezt_next->vec[0],
+                                      &error_sq_dummy,
+                                      &error_index_dummy);
+
+  if (!ELEM(bezt_prev->h2, HD_FREE, HD_ALIGN)) {
+    bezt_prev->h2 = (bezt_prev->h2 == HD_VECT) ? HD_FREE : HD_ALIGN;
+  }
+  if (!ELEM(bezt_next->h1, HD_FREE, HD_ALIGN)) {
+    bezt_next->h1 = (bezt_next->h1 == HD_VECT) ? HD_FREE : HD_ALIGN;
+  }
+
+  MEM_freeN(points);
+}
+
 static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
 {
   Main *bmain = CTX_data_main(C);
@@ -6540,61 +6604,7 @@ static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
           BezTriple *bezt_prev = &nu->bezt[mod_i(span_step[0] - 1, nu->pntsu)];
           BezTriple *bezt_next = &nu->bezt[mod_i(span_step[1] + 1, nu->pntsu)];
 
-          int i_span_edge_len = span_len + 1;
-          const uint dims = 3;
-
-          const uint points_len = ((cu->resolu - 1) * i_span_edge_len) + 1;
-          float *points = MEM_mallocN(points_len * dims * sizeof(float), __func__);
-          float *points_stride = points;
-          const int points_stride_len = (cu->resolu - 1);
-
-          for (int segment = 0; segment < i_span_edge_len; segment++) {
-            BezTriple *bezt_a = &nu->bezt[mod_i((span_step[0] + segment) - 1, nu->pntsu)];
-            BezTriple *bezt_b = &nu->bezt[mod_i((span_step[0] + segment), nu->pntsu)];
-
-            for (int axis = 0; axis < dims; axis++) {
-              BKE_curve_forward_diff_bezier(bezt_a->vec[1][axis],
-                                            bezt_a->vec[2][axis],
-                                            bezt_b->vec[0][axis],
-                                            bezt_b->vec[1][axis],
-                                            points_stride + axis,
-                                            points_stride_len,
-                                            dims * sizeof(float));
-            }
-
-            points_stride += dims * points_stride_len;
-          }
-
-          BLI_assert(points_stride + dims == points + (points_len * dims));
-
-          float tan_l[3], tan_r[3], error_sq_dummy;
-          uint error_index_dummy;
-
-          sub_v3_v3v3(tan_l, bezt_prev->vec[1], bezt_prev->vec[2]);
-          normalize_v3(tan_l);
-          sub_v3_v3v3(tan_r, bezt_next->vec[0], bezt_next->vec[1]);
-          normalize_v3(tan_r);
-
-          curve_fit_cubic_to_points_single_fl(points,
-                                              points_len,
-                                              NULL,
-                                              dims,
-                                              FLT_EPSILON,
-                                              tan_l,
-                                              tan_r,
-                                              bezt_prev->vec[2],
-                                              bezt_next->vec[0],
-                                              &error_sq_dummy,
-                                              &error_index_dummy);
-
-          if (!ELEM(bezt_prev->h2, HD_FREE, HD_ALIGN)) {
-            bezt_prev->h2 = (bezt_prev->h2 == HD_VECT) ? HD_FREE : HD_ALIGN;
-          }
-          if (!ELEM(bezt_next->h1, HD_FREE, HD_ALIGN)) {
-            bezt_next->h1 = (bezt_next->h1 == HD_VECT) ? HD_FREE : HD_ALIGN;
-          }
-
-          MEM_freeN(points);
+          dissolve_bez_segment(bezt_prev, bezt_next, nu, cu, span_len, span_step);
         }
       }
     }
diff --git a/source/blender/editors/curve/editcurve_pen.c b/source/blender/editors/curve/editcurve_pen.c
index fc5e8c0f370..6a25e91b44d 100644
--- a/source/blender/editors/curve/editcurve_pen.c
+++ b/source/blender/editors/curve/editcurve_pen.c
@@ -942,7 +942,15 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
         found_point = nu != NULL;
 
         if (found_point) {
+          ED_curve_deselect_all(cu->editnurb);
           if (nu->type == CU_BEZIER) {
+            BezTriple *next_bezt = BKE_nurb_bezt_get_next(nu, bezt);
+            BezTriple *prev_bezt = BKE_nurb_bezt_get_prev(nu, bezt);
+            if (next_bezt && prev_bezt) {
+              const int bez_index = BKE_curve_nurb_vert_index_get(nu, bezt);
+              uint span_step[2] = {bez_index, bez_index};
+              dissolve_bez_segment(prev_bezt, next_bezt, nu, cu, 1, span_step);
+            }
             delete_bezt_from_nurb(bezt, nu);
           }
           if (nu->type == CU_NURBS) {
diff --git a/source/tools b/source/tools
index 82e4b979ab4..08de10dbd82 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 82e4b979ab424cad429a751a9a90c0e0c6ea077e
+Subproject commit 08de10dbd8234c242b1896a6813d2a6335288e74



More information about the Bf-blender-cvs mailing list