[Bf-blender-cvs] [56ae4089eb3] master: GPencil: Allow interpolation to use breakdown keyframe as extremes

Antonio Vazquez noreply at git.blender.org
Mon Nov 28 19:39:11 CET 2022


Commit: 56ae4089eb350d280580b38b6a9e9bd52c669809
Author: Antonio Vazquez
Date:   Mon Nov 28 19:32:18 2022 +0100
Branches: master
https://developer.blender.org/rB56ae4089eb350d280580b38b6a9e9bd52c669809

GPencil: Allow interpolation to use breakdown keyframe as extremes

Actually, the interpolation can be done only between keyframes different of breakdown type,
but in some cases, this is not convenient.

Now, a new option is displayed to allow the interpolation using breakdown keyframes
as interpolation extremes.

Reviewed By: mendio, pepeland

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

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/gpencil/gpencil_interpolate.c
M	source/blender/makesdna/DNA_scene_types.h

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 20021762d5a..b15e55a44f9 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -2073,6 +2073,7 @@ class _defs_gpencil_paint:
         def draw_settings(_context, layout, tool):
             props = tool.operator_properties("gpencil.interpolate")
             layout.prop(props, "layers")
+            layout.prop(props, "exclude_breakdowns")
             layout.prop(props, "flip")
             layout.prop(props, "smooth_factor")
             layout.prop(props, "smooth_steps")
@@ -2256,6 +2257,7 @@ class _defs_gpencil_edit:
             props = tool.operator_properties("gpencil.interpolate")
             layout.prop(props, "layers")
             layout.prop(props, "interpolate_selected_only")
+            layout.prop(props, "exclude_breakdowns")
             layout.prop(props, "flip")
             layout.prop(props, "smooth_factor")
             layout.prop(props, "smooth_steps")
diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c
index cc25ed66b3d..baf2919fd60 100644
--- a/source/blender/editors/gpencil/gpencil_interpolate.c
+++ b/source/blender/editors/gpencil/gpencil_interpolate.c
@@ -412,15 +412,19 @@ static void gpencil_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgp
 }
 
 /* Helper: Get previous keyframe (exclude breakdown type). */
-static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl, int cfra)
+static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl,
+                                                int cfra,
+                                                const bool exclude_breakdowns)
 {
-  if (gpl->actframe != NULL && gpl->actframe->framenum < cfra &&
-      gpl->actframe->key_type != BEZT_KEYTYPE_BREAKDOWN) {
-    return gpl->actframe;
+  if (gpl->actframe != NULL && gpl->actframe->framenum < cfra) {
+    if ((!exclude_breakdowns) ||
+        ((exclude_breakdowns) && (gpl->actframe->key_type != BEZT_KEYTYPE_BREAKDOWN))) {
+      return gpl->actframe;
+    }
   }
 
   LISTBASE_FOREACH_BACKWARD (bGPDframe *, gpf, &gpl->frames) {
-    if (gpf->key_type == BEZT_KEYTYPE_BREAKDOWN) {
+    if ((exclude_breakdowns) && (gpf->key_type == BEZT_KEYTYPE_BREAKDOWN)) {
       continue;
     }
     if (gpf->framenum >= cfra) {
@@ -433,10 +437,12 @@ static bGPDframe *gpencil_get_previous_keyframe(bGPDlayer *gpl, int cfra)
 }
 
 /* Helper: Get next keyframe (exclude breakdown type). */
-static bGPDframe *gpencil_get_next_keyframe(bGPDlayer *gpl, int cfra)
+static bGPDframe *gpencil_get_next_keyframe(bGPDlayer *gpl,
+                                            int cfra,
+                                            const bool exclude_breakdowns)
 {
   LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
-    if (gpf->key_type == BEZT_KEYTYPE_BREAKDOWN) {
+    if ((exclude_breakdowns) && (gpf->key_type == BEZT_KEYTYPE_BREAKDOWN)) {
       continue;
     }
     if (gpf->framenum <= cfra) {
@@ -455,6 +461,7 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
   bGPdata *gpd = tgpi->gpd;
   bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C);
   bGPDframe *actframe = active_gpl->actframe;
+  const bool exclude_breakdowns = (tgpi->flag & GP_TOOLFLAG_INTERPOLATE_EXCLUDE_BREAKDOWNS) != 0;
 
   /* save initial factor for active layer to define shift limits */
   tgpi->init_factor = (float)(tgpi->cframe - actframe->framenum) /
@@ -483,10 +490,10 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
     tgpil = MEM_callocN(sizeof(tGPDinterpolate_layer), "GPencil Interpolate Layer");
 
     tgpil->gpl = gpl;
-    bGPDframe *gpf = gpencil_get_previous_keyframe(gpl, scene->r.cfra);
+    bGPDframe *gpf = gpencil_get_previous_keyframe(gpl, scene->r.cfra, exclude_breakdowns);
     tgpil->prevFrame = BKE_gpencil_frame_duplicate(gpf, true);
 
-    gpf = gpencil_get_next_keyframe(gpl, scene->r.cfra);
+    gpf = gpencil_get_next_keyframe(gpl, scene->r.cfra, exclude_breakdowns);
     tgpil->nextFrame = BKE_gpencil_frame_duplicate(gpf, true);
 
     BLI_addtail(&tgpi->ilayers, tgpil);
@@ -692,6 +699,9 @@ static bool gpencil_interpolate_set_init_values(bContext *C, wmOperator *op, tGP
       tgpi->flag,
       (GPENCIL_EDIT_MODE(tgpi->gpd) && RNA_boolean_get(op->ptr, "interpolate_selected_only")),
       GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED);
+  SET_FLAG_FROM_TEST(tgpi->flag,
+                     RNA_boolean_get(op->ptr, "exclude_breakdowns"),
+                     GP_TOOLFLAG_INTERPOLATE_EXCLUDE_BREAKDOWNS);
 
   tgpi->flipmode = RNA_enum_get(op->ptr, "flip");
 
@@ -751,8 +761,9 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent
 
   /* Cannot interpolate if not between 2 frames. */
   int cfra = scene->r.cfra;
-  bGPDframe *gpf_prv = gpencil_get_previous_keyframe(gpl, cfra);
-  bGPDframe *gpf_next = gpencil_get_next_keyframe(gpl, cfra);
+  const bool exclude_breakdowns = RNA_boolean_get(op->ptr, "exclude_breakdowns");
+  bGPDframe *gpf_prv = gpencil_get_previous_keyframe(gpl, cfra, exclude_breakdowns);
+  bGPDframe *gpf_next = gpencil_get_next_keyframe(gpl, cfra, exclude_breakdowns);
   if (ELEM(NULL, gpf_prv, gpf_next)) {
     BKE_report(
         op->reports,
@@ -972,6 +983,12 @@ void GPENCIL_OT_interpolate(wmOperatorType *ot)
                   "Only Selected",
                   "Interpolate only selected strokes");
 
+  RNA_def_boolean(ot->srna,
+                  "exclude_breakdowns",
+                  false,
+                  "Exclude Breakdowns",
+                  "Exclude existing Breakdowns keyframes as interpolation extremes");
+
   RNA_def_enum(ot->srna,
                "flip",
                flip_modes,
@@ -1229,6 +1246,7 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
   const bool all_layers = (bool)(RNA_enum_get(op->ptr, "layers") == 1);
   const bool only_selected = (GPENCIL_EDIT_MODE(gpd) &&
                               (RNA_boolean_get(op->ptr, "interpolate_selected_only") != 0));
+  const bool exclude_breakdowns = RNA_boolean_get(op->ptr, "exclude_breakdowns");
 
   eGP_InterpolateFlipMode flipmode = RNA_enum_get(op->ptr, "flip");
 
@@ -1243,8 +1261,8 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
   BKE_curvemapping_init(ipo_settings->custom_ipo);
 
   /* Cannot interpolate if not between 2 frames. */
-  bGPDframe *gpf_prv = gpencil_get_previous_keyframe(active_gpl, cfra);
-  bGPDframe *gpf_next = gpencil_get_next_keyframe(active_gpl, cfra);
+  bGPDframe *gpf_prv = gpencil_get_previous_keyframe(active_gpl, cfra, exclude_breakdowns);
+  bGPDframe *gpf_next = gpencil_get_next_keyframe(active_gpl, cfra, exclude_breakdowns);
   if (ELEM(NULL, gpf_prv, gpf_next)) {
     BKE_report(
         op->reports,
@@ -1268,8 +1286,8 @@ static int gpencil_interpolate_seq_exec(bContext *C, wmOperator *op)
     if (!BKE_gpencil_layer_is_editable(gpl)) {
       continue;
     }
-    gpf_prv = gpencil_get_previous_keyframe(gpl, cfra);
-    gpf_next = gpencil_get_next_keyframe(gpl, cfra);
+    gpf_prv = gpencil_get_previous_keyframe(gpl, cfra, exclude_breakdowns);
+    gpf_next = gpencil_get_next_keyframe(gpl, cfra, exclude_breakdowns);
 
     /* Need a set of frames to interpolate. */
     if ((gpf_prv == NULL) || (gpf_next == NULL)) {
@@ -1433,6 +1451,9 @@ static void gpencil_interpolate_seq_ui(bContext *C, wmOperator *op)
     uiItemR(row, op->ptr, "interpolate_selected_only", 0, NULL, ICON_NONE);
   }
 
+  row = uiLayoutRow(layout, true);
+  uiItemR(row, op->ptr, "exclude_breakdowns", 0, NULL, ICON_NONE);
+
   row = uiLayoutRow(layout, true);
   uiItemR(row, op->ptr, "flip", 0, NULL, ICON_NONE);
 
@@ -1602,6 +1623,12 @@ void GPENCIL_OT_interpolate_sequence(wmOperatorType *ot)
                   "Only Selected",
                   "Interpolate only selected strokes");
 
+  RNA_def_boolean(ot->srna,
+                  "exclude_breakdowns",
+                  false,
+                  "Exclude Breakdowns",
+                  "Exclude existing Breakdowns keyframes as interpolation extremes");
+
   RNA_def_enum(ot->srna,
                "flip",
                flip_modes,
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 626af35671d..8832e044f5e 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1199,6 +1199,8 @@ typedef enum eGP_Interpolate_SettingsFlag {
   GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS = (1 << 0),
   /* apply interpolation to only selected */
   GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED = (1 << 1),
+  /* Exclude breakdown keyframe type as extreme */
+  GP_TOOLFLAG_INTERPOLATE_EXCLUDE_BREAKDOWNS = (1 << 2),
 } eGP_Interpolate_SettingsFlag;
 
 /** #GP_Interpolate_Settings.type */



More information about the Bf-blender-cvs mailing list