From 3cfa61291b3a16efaf962cde2b5a8dd2280ed335 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 6 Sep 2023 21:15:07 +1000 Subject: [PATCH] Fix curve set handle type not respecting hidden handles The handle selection should be ignored when hidden. Now set handle type considers all handles selected when handles are hidden and the knot is selected. --- source/blender/blenkernel/BKE_curve.h | 4 +++- source/blender/blenkernel/intern/curve.cc | 16 ++++++++++------ source/blender/editors/curve/editcurve.cc | 5 ++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 0645235fa50..f63aa7d04ef 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -212,7 +212,9 @@ void BKE_nurbList_duplicate(struct ListBase *lb1, const struct ListBase *lb2); * - 5: Set align, like 3 but no toggle. * - 6: Clear align (setting #HD_FREE), like 3 but no toggle. */ -void BKE_nurbList_handles_set(struct ListBase *editnurb, char code); +void BKE_nurbList_handles_set(struct ListBase *editnurb, + eNurbHandleTest_Mode handle_mode, + char code); void BKE_nurbList_handles_recalculate(struct ListBase *editnurb, bool calc_length, uint8_t flag); void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag); diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc index 40a14c2d87c..bd63f2aaa29 100644 --- a/source/blender/blenkernel/intern/curve.cc +++ b/source/blender/blenkernel/intern/curve.cc @@ -4214,7 +4214,9 @@ void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag) } } -void BKE_nurbList_handles_set(ListBase *editnurb, const char code) +void BKE_nurbList_handles_set(ListBase *editnurb, + eNurbHandleTest_Mode handle_mode, + const char code) { BezTriple *bezt; int a; @@ -4225,11 +4227,12 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) bezt = nu->bezt; a = nu->pntsu; while (a--) { - if ((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) { - if (bezt->f1 & SELECT) { + const short flag = BKE_nurb_bezt_handle_test_calc_flag(bezt, SELECT, handle_mode); + if ((flag & (1 << 0)) || (flag & (1 << 2))) { + if (flag & (1 << 0)) { bezt->h1 = code; } - if (bezt->f3 & SELECT) { + if (flag & (1 << 2)) { bezt->h2 = code; } if (bezt->h1 != bezt->h2) { @@ -4266,8 +4269,9 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code) bezt = nu->bezt; a = nu->pntsu; while (a--) { - if (((bezt->f1 & SELECT) && bezt->h1 != HD_FREE) || - ((bezt->f3 & SELECT) && bezt->h2 != HD_FREE)) { + const short flag = BKE_nurb_bezt_handle_test_calc_flag(bezt, SELECT, handle_mode); + if (((flag & (1 << 0)) && bezt->h1 != HD_FREE) || + ((flag & (1 << 2)) && bezt->h2 != HD_FREE)) { h_new = HD_AUTO; break; } diff --git a/source/blender/editors/curve/editcurve.cc b/source/blender/editors/curve/editcurve.cc index d59a7d1259c..36588fa14f3 100644 --- a/source/blender/editors/curve/editcurve.cc +++ b/source/blender/editors/curve/editcurve.cc @@ -3974,6 +3974,9 @@ static int set_handle_type_exec(bContext *C, wmOperator *op) ViewLayer *view_layer = CTX_data_view_layer(C); View3D *v3d = CTX_wm_view3d(C); const int handle_type = RNA_enum_get(op->ptr, "type"); + const bool hide_handles = (v3d && (v3d->overlay.handle_display == CURVE_HANDLE_NONE)); + const eNurbHandleTest_Mode handle_mode = hide_handles ? NURB_HANDLE_TEST_KNOT_ONLY : + NURB_HANDLE_TEST_EACH; uint objects_len; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data( @@ -3987,7 +3990,7 @@ static int set_handle_type_exec(bContext *C, wmOperator *op) } ListBase *editnurb = object_editcurve_get(obedit); - BKE_nurbList_handles_set(editnurb, handle_type); + BKE_nurbList_handles_set(editnurb, handle_mode, handle_type); WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); DEG_id_tag_update(static_cast(obedit->data), 0);