Implement a user preference for the default Auto Handle Smoothing mode.
authorAlexander Gavrilov <angavrilov@gmail.com>
Tue, 1 Oct 2019 18:38:44 +0000 (21:38 +0300)
committerAlexander Gavrilov <angavrilov@gmail.com>
Wed, 2 Oct 2019 17:42:37 +0000 (20:42 +0300)
The default was changed with an initial implementation of the feature.

With the feedback from animators, having a behavior which affects curves
outside of a changing range is not convenient for professional animators
working on high quality character animation. On the other hand, automatic
smoothing is better for casual animation of object motion.

This change adds an ability to change the default via User Preferences.

Differential Revision: https://developer.blender.org/D5875

13 files changed:
release/datafiles/userdef/userdef_default.c
release/scripts/startup/bl_ui/space_userpref.py
source/blender/blenkernel/BKE_blender_version.h
source/blender/blenkernel/intern/nla.c
source/blender/blenloader/intern/versioning_userdef.c
source/blender/collada/AnimationImporter.cpp
source/blender/collada/BCAnimationCurve.cpp
source/blender/editors/animation/drivers.c
source/blender/editors/animation/keyframing.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_userdef.c

index 7785c9d29625f68784a36d3f9e2cc079e73d7038..dc35187ab7ed2e8eda2a8cd38d2de91306f1b89f 100644 (file)
@@ -22,6 +22,7 @@
 #include "DNA_userdef_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_space_types.h"
+#include "DNA_anim_types.h"
 
 #include "BLI_math_rotation.h"
 
@@ -138,6 +139,7 @@ const UserDef U_default = {
     .glreslimit = 0,
     .curssize = 0,
     .color_picker_type = USER_CP_CIRCLE_HSV,
+    .auto_smoothing_new = FCURVE_SMOOTH_CONT_ACCEL,
     .ipo_new = BEZT_IPO_BEZ,
     .keyhandles_new = HD_AUTO_ANIM,
     .view_frame_type = ZOOM_FRAME_MODE_KEEP_RANGE,
index 8ccd8b573570408df0a90438991d2c54b309602f..4c90f987c50d6833dd1457548954e6a6ddf54973 100644 (file)
@@ -569,6 +569,7 @@ class USERPREF_PT_animation_fcurves(PreferencePanel, Panel):
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
         flow.prop(edit, "fcurve_unselected_alpha", text="F-Curve Visibility")
+        flow.prop(edit, "fcurve_new_auto_smoothing", text="Default Smoothing Mode")
         flow.prop(edit, "keyframe_new_interpolation_type", text="Default Interpolation")
         flow.prop(edit, "keyframe_new_handle_type", text="Default Handles")
         flow.prop(edit, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
index 21ef70b7bcd8863a6b4575007f232ae9d66b2a7e..7b879cc1a15e0b68ad4a2e34b1c8063d59a2c12b 100644 (file)
@@ -27,7 +27,7 @@
  * \note Use #STRINGIFY() rather than defining with quotes.
  */
 #define BLENDER_VERSION 281
-#define BLENDER_SUBVERSION 12
+#define BLENDER_SUBVERSION 13
 /** Several breakages with 280, e.g. collections vs layers. */
 #define BLENDER_MINVERSION 280
 #define BLENDER_MINSUBVERSION 0
index 2cc1083aba30bd4845d7cc6c62a7eb878010884e..09581debd9940579eb3f6043d5f86766e9bb0ce3 100644 (file)
@@ -1488,7 +1488,7 @@ void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
 
       /* set default flags */
       fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
-      fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+      fcu->auto_smoothing = U.auto_smoothing_new;
 
       /* store path - make copy, and store that */
       fcu->rna_path = BLI_strdupn("influence", 9);
@@ -1515,7 +1515,7 @@ void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
 
       /* set default flags */
       fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
-      fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+      fcu->auto_smoothing = U.auto_smoothing_new;
 
       /* store path - make copy, and store that */
       fcu->rna_path = BLI_strdupn("strip_time", 10);
index e769e72d8e1c9ced9b596ecbbd6e687c838f2404..3eaf45954f3073c0bf35730569d758a380fe1e58 100644 (file)
@@ -30,6 +30,7 @@
 #include "DNA_windowmanager_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_space_types.h"
+#include "DNA_anim_types.h"
 
 #include "BKE_addon.h"
 #include "BKE_colorband.h"
@@ -624,15 +625,20 @@ void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
     userdef->filebrowser_display_type = USER_TEMP_SPACE_DISPLAY_WINDOW;
   }
 
+  if (!USER_VERSION_ATLEAST(281, 13)) {
+    userdef->auto_smoothing_new = FCURVE_SMOOTH_CONT_ACCEL;
+
+    if (userdef->file_space_data.display_type == FILE_DEFAULTDISPLAY) {
+      memcpy(
+          &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
+    }
+  }
+
   /**
    * Include next version bump.
    */
   {
     /* pass */
-    if (userdef->file_space_data.display_type == FILE_DEFAULTDISPLAY) {
-      memcpy(
-          &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
-    }
   }
 
   if (userdef->pixelsize == 0.0f) {
index 79593f07383c280b63e880456f5cde8abec6f613..47325c4dececace210cbef4dbfd0b6220e2959b7 100644 (file)
@@ -104,7 +104,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
 
         fcu->flag = (FCURVE_VISIBLE | FCURVE_AUTO_HANDLES | FCURVE_SELECTED);
         fcu->array_index = 0;
-        fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+        fcu->auto_smoothing = U.auto_smoothing_new;
 
         for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
           BezTriple bez;
index bf32ec9148ce8b4cf216e33e5a5f39b9fe64de25..f944a77196c1db2777d154fa15b1b9e0ec67128f 100644 (file)
@@ -383,7 +383,7 @@ void BCAnimationCurve::adjust_range(const int frame_index)
 void BCAnimationCurve::add_value(const float val, const int frame_index)
 {
   FCurve *fcu = get_edit_fcurve();
-  fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+  fcu->auto_smoothing = U.auto_smoothing_new;
   insert_vert_fcurve(fcu, frame_index, val, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_NOFLAGS);
 
   if (fcu->totvert == 1) {
index 61c8da08954b6c3cf06d610af4c99cb118099dd8..64f7fe034dc2a12e7031943dea56974a73173c9c 100644 (file)
@@ -111,7 +111,7 @@ struct FCurve *alloc_driver_fcurve(const char rna_path[],
   FCurve *fcu = MEM_callocN(sizeof(FCurve), "FCurve");
 
   fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
-  fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+  fcu->auto_smoothing = U.auto_smoothing_new;
 
   /* store path - make copy, and store that */
   if (rna_path) {
index 0f8b87426594f05db4d06916c427c7167eaf676b..8203a9131fa8f1b45d8d0999de7f1f185a964e0f 100644 (file)
@@ -202,7 +202,7 @@ FCurve *verify_fcurve(Main *bmain,
     fcu = MEM_callocN(sizeof(FCurve), "FCurve");
 
     fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
-    fcu->auto_smoothing = FCURVE_SMOOTH_CONT_ACCEL;
+    fcu->auto_smoothing = U.auto_smoothing_new;
     if (BLI_listbase_is_empty(&act->curves)) {
       fcu->flag |= FCURVE_ACTIVE; /* first one added active */
     }
index 75f29695eb365a58d81c52ea30967d5c3e904961..b9f43c0e5792e94380c79fdd43a33a80153eee61 100644 (file)
@@ -728,11 +728,13 @@ typedef struct UserDef {
   short curssize;
   /** #eColorPicker_Types. */
   short color_picker_type;
+  /** Curve smoothing type for newly added F-Curves. */
+  char auto_smoothing_new;
   /** Interpolation mode for newly added F-Curves. */
   char ipo_new;
   /** Handle types for newly added keyframes. */
   char keyhandles_new;
-  char _pad11[3];
+  char _pad11[2];
   /** #eZoomFrame_Mode. */
   char view_frame_type;
 
index e72a55b5a9ec7de730f4f9659e35fd6c00a96539..458f031ceae30c7634739a401b523bc0caf6a3f0 100644 (file)
@@ -90,6 +90,7 @@ extern const EnumPropertyItem rna_enum_color_sets_items[];
 extern const EnumPropertyItem rna_enum_beztriple_keyframe_type_items[];
 extern const EnumPropertyItem rna_enum_beztriple_interpolation_mode_items[];
 extern const EnumPropertyItem rna_enum_beztriple_interpolation_easing_items[];
+extern const EnumPropertyItem rna_enum_fcurve_auto_smoothing_items[];
 extern const EnumPropertyItem rna_enum_keyframe_handle_type_items[];
 extern const EnumPropertyItem rna_enum_driver_target_rotation_mode_items[];
 
index 254f3bc371046b82b980f5cb86a778d82296eec9..424bb4a492f044011b4ead37eeaaeb2c706e5a39 100644 (file)
@@ -76,6 +76,22 @@ const EnumPropertyItem rna_enum_fmodifier_type_items[] = {
     {0, NULL, 0, NULL, NULL},
 };
 
+const EnumPropertyItem rna_enum_fcurve_auto_smoothing_items[] = {
+    {FCURVE_SMOOTH_NONE,
+     "NONE",
+     0,
+     "None",
+     "Automatic handles only take immediately adjacent keys into account"},
+    {FCURVE_SMOOTH_CONT_ACCEL,
+     "CONT_ACCEL",
+     0,
+     "Continuous Acceleration",
+     "Automatic handles are adjusted to avoid jumps in acceleration, resulting "
+     "in smoother curves. However, key changes may affect interpolation over a "
+     "larger stretch of the curve"},
+    {0, NULL, 0, NULL, NULL},
+};
+
 const EnumPropertyItem rna_enum_beztriple_keyframe_type_items[] = {
     {BEZT_KEYTYPE_KEYFRAME,
      "KEYFRAME",
@@ -2258,19 +2274,6 @@ static void rna_def_fcurve(BlenderRNA *brna)
        "Use custom hand-picked color for F-Curve"},
       {0, NULL, 0, NULL, NULL},
   };
-  static EnumPropertyItem prop_mode_smoothing_items[] = {
-      {FCURVE_SMOOTH_NONE,
-       "NONE",
-       0,
-       "None",
-       "Auto handles only take adjacent keys into account (legacy mode)"},
-      {FCURVE_SMOOTH_CONT_ACCEL,
-       "CONT_ACCEL",
-       0,
-       "Continuous Acceleration",
-       "Auto handles are placed to avoid jumps in acceleration"},
-      {0, NULL, 0, NULL, NULL},
-  };
 
   srna = RNA_def_struct(brna, "FCurve", NULL);
   RNA_def_struct_ui_text(srna, "F-Curve", "F-Curve defining values of a period of time");
@@ -2350,7 +2353,7 @@ static void rna_def_fcurve(BlenderRNA *brna)
   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
 
   prop = RNA_def_property(srna, "auto_smoothing", PROP_ENUM, PROP_NONE);
-  RNA_def_property_enum_items(prop, prop_mode_smoothing_items);
+  RNA_def_property_enum_items(prop, rna_enum_fcurve_auto_smoothing_items);
   RNA_def_property_ui_text(
       prop, "Auto Handle Smoothing", "Algorithm used to compute automatic handles");
   RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_FCurve_update_data");
index f08a3ce93a10d440f7c3a5e7f53ad0b679c119ad..07ce07710b1715ad47e3e751a08979b36ffb6319 100644 (file)
@@ -4657,6 +4657,13 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
       "Color for newly added transformation F-Curves (Location, Rotation, Scale) "
       "and also Color is based on the transform axis");
 
+  prop = RNA_def_property(srna, "fcurve_new_auto_smoothing", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, rna_enum_fcurve_auto_smoothing_items);
+  RNA_def_property_enum_sdna(prop, NULL, "auto_smoothing_new");
+  RNA_def_property_ui_text(prop,
+                           "New Curve Smoothing Mode",
+                           "Auto Handle Smoothing mode used for newly added F-Curves");
+
   prop = RNA_def_property(srna, "keyframe_new_interpolation_type", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_items(prop, rna_enum_beztriple_interpolation_mode_items);
   RNA_def_property_enum_sdna(prop, NULL, "ipo_new");