GPencil: New filter in Onion by keyframe type
authorAntonioya <blendergit@gmail.com>
Thu, 16 May 2019 12:00:31 +0000 (14:00 +0200)
committerAntonioya <blendergit@gmail.com>
Thu, 16 May 2019 12:01:48 +0000 (14:01 +0200)
This new filter allows to select only some type of keyframe (keyframe, breakdown, etc).

This was a request of artists that are used to work with other 2D softwares.

Also some cleanup to remove aninmatable option to some properties.

release/scripts/startup/bl_ui/properties_data_gpencil.py
source/blender/draw/engines/gpencil/gpencil_draw_utils.c
source/blender/makesdna/DNA_gpencil_types.h
source/blender/makesrna/intern/rna_gpencil.c

index e96ec95..1874af4 100644 (file)
@@ -258,6 +258,7 @@ class DATA_PT_gpencil_onion_skinning(DataButtonsPanel, Panel):
         col = layout.column()
         col.prop(gpd, "onion_mode")
         col.prop(gpd, "onion_factor", text="Opacity", slider=True)
+        col.prop(gpd, "onion_keyframe_type")
 
         if gpd.onion_mode == 'ABSOLUTE':
             col = layout.column(align=True)
index 71e83da..7f979c4 100644 (file)
@@ -1229,6 +1229,7 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache,
   int last = gpf->framenum;
 
   colflag = (bool)gpd->onion_flag & GP_ONION_GHOST_PREVCOL;
+  const short onion_keytype = gpd->onion_keytype;
 
   /* -------------------------------
    * 1) Draw Previous Frames First
@@ -1249,6 +1250,10 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache,
     if ((mode == GP_ONION_MODE_SELECTED) && ((gf->flag & GP_FRAME_SELECT) == 0)) {
       continue;
     }
+    /* verify keyframe type */
+    if ((onion_keytype > -1) && (gf->key_type != onion_keytype)) {
+      continue;
+    }
     /* absolute range */
     if (mode == GP_ONION_MODE_ABSOLUTE) {
       if ((gpf->framenum - gf->framenum) > step) {
@@ -1305,6 +1310,10 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache,
     if ((mode == GP_ONION_MODE_SELECTED) && ((gf->flag & GP_FRAME_SELECT) == 0)) {
       continue;
     }
+    /* verify keyframe type */
+    if ((onion_keytype > -1) && (gf->key_type != onion_keytype)) {
+      continue;
+    }
     /* absolute range */
     if (mode == GP_ONION_MODE_ABSOLUTE) {
       if ((gf->framenum - gpf->framenum) > step) {
index bb38311..007be02 100644 (file)
@@ -518,7 +518,8 @@ typedef struct bGPdata {
 
   /** Draw mode for strokes (eGP_DrawMode). */
   short draw_mode;
-  char _pad3[2];
+  /** Keyframe type for onion filter  (eBezTriple_KeyframeType plus All option) */
+  short onion_keytype;
 
   bGPgrid grid;
 
index 737dbe3..8d3bfdd 100644 (file)
@@ -76,6 +76,36 @@ static EnumPropertyItem rna_enum_gpencil_onion_modes_items[] = {
     {0, NULL, 0, NULL, NULL},
 };
 
+const EnumPropertyItem rna_enum_onion_keyframe_type_items[] = {
+    {-1, "ALL", ICON_ACTION, "All Types", "Include all Keyframe types"},
+    {BEZT_KEYTYPE_KEYFRAME,
+     "KEYFRAME",
+     ICON_KEYTYPE_KEYFRAME_VEC,
+     "Keyframe",
+     "Normal keyframe - e.g. for key poses"},
+    {BEZT_KEYTYPE_BREAKDOWN,
+     "BREAKDOWN",
+     ICON_KEYTYPE_BREAKDOWN_VEC,
+     "Breakdown",
+     "A breakdown pose - e.g. for transitions between key poses"},
+    {BEZT_KEYTYPE_MOVEHOLD,
+     "MOVING_HOLD",
+     ICON_KEYTYPE_MOVING_HOLD_VEC,
+     "Moving Hold",
+     "A keyframe that is part of a moving hold"},
+    {BEZT_KEYTYPE_EXTREME,
+     "EXTREME",
+     ICON_KEYTYPE_EXTREME_VEC,
+     "Extreme",
+     "An 'extreme' pose, or some other purpose as needed"},
+    {BEZT_KEYTYPE_JITTER,
+     "JITTER",
+     ICON_KEYTYPE_JITTER_VEC,
+     "Jitter",
+     "A filler or baked keyframe for keying on ones, or some other purpose as needed"},
+    {0, NULL, 0, NULL, NULL},
+};
+
 static const EnumPropertyItem rna_enum_gplayer_move_type_items[] = {
     {-1, "UP", 0, "Up", ""},
     {1, "DOWN", 0, "Down", ""},
@@ -1737,6 +1767,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
   RNA_def_property_int_sdna(prop, NULL, "gstep");
   RNA_def_property_range(prop, 0, 120);
   RNA_def_property_int_default(prop, 1);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop,
                            "Frames Before",
                            "Maximum number of frames to show before current frame "
@@ -1747,6 +1778,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
   RNA_def_property_int_sdna(prop, NULL, "gstep_next");
   RNA_def_property_range(prop, 0, 120);
   RNA_def_property_int_default(prop, 1);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop,
                            "Frames After",
                            "Maximum number of frames to show after current frame "
@@ -1756,6 +1788,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
   prop = RNA_def_property(srna, "use_ghost_custom_colors", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(
       prop, NULL, "onion_flag", GP_ONION_GHOST_PREVCOL | GP_ONION_GHOST_NEXTCOL);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop, "Use Custom Ghost Colors", "Use custom colors for ghost frames");
   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
 
@@ -1779,6 +1812,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "use_ghosts_always", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_GHOST_ALWAYS);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop,
                            "Always Show Ghosts",
                            "Ghosts are shown in renders and animation playback. Useful for "
@@ -1788,17 +1822,27 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
   prop = RNA_def_property(srna, "onion_mode", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "onion_mode");
   RNA_def_property_enum_items(prop, rna_enum_gpencil_onion_modes_items);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop, "Mode", "Mode to display frames");
   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
 
+  prop = RNA_def_property(srna, "onion_keyframe_type", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_sdna(prop, NULL, "onion_keytype");
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+  RNA_def_property_enum_items(prop, rna_enum_onion_keyframe_type_items);
+  RNA_def_property_ui_text(prop, "Filter By Type", "Type of keyframe (for filtering)");
+  RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
   prop = RNA_def_property(srna, "use_onion_fade", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_FADE);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(
       prop, "Fade", "Display onion keyframes with a fade in color transparency");
   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
 
   prop = RNA_def_property(srna, "use_onion_loop", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_LOOP);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop,
                            "Loop",
                            "Display first onion keyframes using next frame color to show "
@@ -1809,6 +1853,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
   RNA_def_property_float_sdna(prop, NULL, "onion_factor");
   RNA_def_property_float_default(prop, 0.5f);
   RNA_def_property_range(prop, 0.0, 1.0f);
+  RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
   RNA_def_property_ui_text(prop, "Onion Opacity", "Change fade opacity of displayed onion frames");
   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");