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);