[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