[Bf-blender-cvs] [fe0036c586d] blender-v2.83-release: Fix T76563: Transforming an auto-aligned point won't set it aligned

Campbell Barton noreply at git.blender.org
Fri May 15 15:16:16 CEST 2020


Commit: fe0036c586d334a17a0b6bc008790749f58273be
Author: Campbell Barton
Date:   Fri May 15 22:48:00 2020 +1000
Branches: blender-v2.83-release
https://developer.blender.org/rBfe0036c586d334a17a0b6bc008790749f58273be

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.

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

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/fcurve.c
M	source/blender/editors/space_graph/graph_buttons.c
M	source/blender/editors/space_view3d/view3d_buttons.c
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert.h
M	source/blender/editors/transform/transform_convert_curve.c
M	source/blender/editors/util/ed_transverts.c

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

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



More information about the Bf-blender-cvs mailing list