From fe0036c586d334a17a0b6bc008790749f58273be Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 15 May 2020 22:48:00 +1000 Subject: Fix T76563: Transforming an auto-aligned point won't set it aligned When local origins are used or a single control point is selected, change the handle types from auto to aligned. --- source/blender/blenkernel/BKE_curve.h | 5 +-- source/blender/blenkernel/intern/curve.c | 11 +++++-- source/blender/blenkernel/intern/fcurve.c | 2 +- source/blender/editors/space_graph/graph_buttons.c | 2 +- .../blender/editors/space_view3d/view3d_buttons.c | 2 +- .../blender/editors/transform/transform_convert.c | 37 +++++++++++++++++++--- .../blender/editors/transform/transform_convert.h | 1 + .../editors/transform/transform_convert_curve.c | 4 ++- source/blender/editors/util/ed_transverts.c | 2 +- 9 files changed, 52 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 164867b228b..b919db0017c 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -259,8 +259,9 @@ void BKE_nurb_handles_calc(struct Nurb *nu); void BKE_nurb_handles_autocalc(struct Nurb *nu, int flag); void BKE_nurb_bezt_handle_test(struct BezTriple *bezt, const eBezTriple_Flag__Alias sel_flag, - const bool use_handle); -void BKE_nurb_handles_test(struct Nurb *nu, const bool use_handles); + const bool use_handle, + const bool use_around_local); +void BKE_nurb_handles_test(struct Nurb *nu, const bool use_handles, const bool use_around_local); /* **** Depsgraph evaluation **** */ diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index b4a8625c0bb..d8fd405b6e5 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -4151,7 +4151,8 @@ void BKE_nurb_handle_calc_simple_auto(Nurb *nu, BezTriple *bezt) */ void BKE_nurb_bezt_handle_test(BezTriple *bezt, const eBezTriple_Flag__Alias sel_flag, - const bool use_handle) + const bool use_handle, + const bool use_around_local) { short flag = 0; @@ -4174,6 +4175,10 @@ void BKE_nurb_bezt_handle_test(BezTriple *bezt, flag = (bezt->f2 & sel_flag) ? (SEL_F1 | SEL_F2 | SEL_F3) : 0; } + if (use_around_local) { + flag &= ~SEL_F2; + } + /* check for partial selection */ if (!ELEM(flag, 0, SEL_F1 | SEL_F2 | SEL_F3)) { if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM)) { @@ -4200,7 +4205,7 @@ void BKE_nurb_bezt_handle_test(BezTriple *bezt, #undef SEL_F3 } -void BKE_nurb_handles_test(Nurb *nu, const bool use_handle) +void BKE_nurb_handles_test(Nurb *nu, const bool use_handle, const bool use_around_local) { BezTriple *bezt; int a; @@ -4212,7 +4217,7 @@ void BKE_nurb_handles_test(Nurb *nu, const bool use_handle) bezt = nu->bezt; a = nu->pntsu; while (a--) { - BKE_nurb_bezt_handle_test(bezt, SELECT, use_handle); + BKE_nurb_bezt_handle_test(bezt, SELECT, use_handle, use_around_local); bezt++; } diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 439992a4113..a75f89435c8 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -1168,7 +1168,7 @@ void testhandles_fcurve(FCurve *fcu, eBezTriple_Flag sel_flag, const bool use_ha /* loop over beztriples */ for (a = 0, bezt = fcu->bezt; a < fcu->totvert; a++, bezt++) { - BKE_nurb_bezt_handle_test(bezt, sel_flag, use_handle); + BKE_nurb_bezt_handle_test(bezt, sel_flag, use_handle, false); } /* recalculate handles */ diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 8c931a0c4a3..d1feab6f24b 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -294,7 +294,7 @@ static void graphedit_activekey_handles_cb(bContext *C, void *fcu_ptr, void *bez bezt->h2 = HD_ALIGN; } else { - BKE_nurb_bezt_handle_test(bezt, SELECT, true); + BKE_nurb_bezt_handle_test(bezt, SELECT, true, false); } /* now call standard updates */ diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index 7965422c117..18425b88047 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -1005,7 +1005,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float } } BKE_nurb_test_2d(nu); - BKE_nurb_handles_test(nu, true); /* test for bezier too */ + BKE_nurb_handles_test(nu, true, false); /* test for bezier too */ nu = nu->next; } diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 6744f7b6262..65c0c20e0f3 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -83,16 +83,45 @@ #include "transform_convert.h" #include "transform_mode.h" +bool transform_mode_use_local_origins(const TransInfo *t) +{ + return ELEM(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL); +} + /** * Transforming around ourselves is no use, fallback to individual origins, * useful for curve/armatures. */ void transform_around_single_fallback(TransInfo *t) { - if ((t->data_len_all == 1) && - (ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) && - (ELEM(t->mode, TFM_RESIZE, TFM_ROTATION, TFM_TRACKBALL))) { - t->around = V3D_AROUND_LOCAL_ORIGINS; + if ((ELEM(t->around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN, V3D_AROUND_ACTIVE)) && + transform_mode_use_local_origins(t)) { + + bool is_data_single = false; + if (t->data_len_all == 1) { + is_data_single = true; + } + else if (t->data_len_all == 3) { + if (t->obedit_type == OB_CURVE) { + /* Special case check for curve, if we have a single curve bezier triple selected + * treat */ + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + if (!tc->data_len) { + continue; + } + if (tc->data_len == 3) { + const TransData *td = tc->data; + if ((td[0].loc == td[1].loc) && (td[1].loc == td[2].loc)) { + is_data_single = true; + } + } + break; + } + } + } + if (is_data_single) { + t->around = V3D_AROUND_LOCAL_ORIGINS; + } } } diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index f975d320e62..d4139898419 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -100,6 +100,7 @@ void flushTransTracking(TransInfo *t); /********************* intern **********************/ /* transform_convert.c */ +bool transform_mode_use_local_origins(const TransInfo *t); void transform_around_single_fallback(TransInfo *t); bool constraints_list_needinv(TransInfo *t, ListBase *list); void calc_distanceCurveVerts(TransData *head, TransData *tail); diff --git a/source/blender/editors/transform/transform_convert_curve.c b/source/blender/editors/transform/transform_convert_curve.c index 908cf7707f2..42ffe675dc5 100644 --- a/source/blender/editors/transform/transform_convert_curve.c +++ b/source/blender/editors/transform/transform_convert_curve.c @@ -167,6 +167,8 @@ void createTransCurveVerts(TransInfo *t) ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) : false; + bool use_around_origins_for_handles_test = ((t->around == V3D_AROUND_LOCAL_ORIGINS) && + transform_mode_use_local_origins(t)); float mtx[3][3], smtx[3][3]; copy_m3_m4(mtx, tc->obedit->obmat); @@ -342,7 +344,7 @@ void createTransCurveVerts(TransInfo *t) if (ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT, TFM_DUMMY) == 0) { /* sets the handles based on their selection, * do this after the data is copied to the TransData */ - BKE_nurb_handles_test(nu, !hide_handles); + BKE_nurb_handles_test(nu, !hide_handles, use_around_origins_for_handles_test); } } else { diff --git a/source/blender/editors/util/ed_transverts.c b/source/blender/editors/util/ed_transverts.c index 67a62473dc0..1c56ad878e2 100644 --- a/source/blender/editors/util/ed_transverts.c +++ b/source/blender/editors/util/ed_transverts.c @@ -111,7 +111,7 @@ void ED_transverts_update_obedit(TransVertStore *tvs, Object *obedit) } BKE_nurb_test_2d(nu); - BKE_nurb_handles_test(nu, true); /* test for bezier too */ + BKE_nurb_handles_test(nu, true, false); /* test for bezier too */ nu = nu->next; } } -- cgit v1.2.3