[Bf-blender-cvs] [296984b40e0] master: Modify Dopesheet block between keyframes

Antonio Vazquez noreply at git.blender.org
Wed Mar 17 12:57:52 CET 2021


Commit: 296984b40e038cb7c4508d7952678058adabc37e
Author: Antonio  Vazquez
Date:   Wed Mar 17 12:45:57 2021 +0100
Branches: master
https://developer.blender.org/rB296984b40e038cb7c4508d7952678058adabc37e

Modify Dopesheet block between keyframes

This makes more visible where ends each keyframe. To use, as we did before, full block sometimes looks hard to view where a keyframe ends.

Reviewed By: pepeland, mendio, Severin

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

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

M	source/blender/editors/animation/keyframes_draw.c

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

diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index b9ef69cf8bd..06107b6fee6 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -49,6 +49,7 @@
 #include "GPU_immediate.h"
 #include "GPU_state.h"
 
+#include "UI_interface.h"
 #include "UI_resources.h"
 #include "UI_view2d.h"
 
@@ -691,13 +692,16 @@ static void draw_keylist(View2D *v2d,
                          bool channelLocked,
                          int saction_flag)
 {
+  if (keys == NULL) {
+    return;
+  }
+
   const float icon_sz = U.widget_unit * 0.5f * yscale_fac;
   const float half_icon_sz = 0.5f * icon_sz;
-  const float quarter_icon_sz = 0.25f * icon_sz;
   const float smaller_sz = 0.35f * icon_sz;
   const float ipo_sz = 0.1f * icon_sz;
-
-  GPU_blend(GPU_BLEND_ALPHA);
+  const float gpencil_sz = smaller_sz * 0.8f;
+  const float screenspace_margin = (0.35f * (float)UI_UNIT_X) / UI_view2d_scale_get_x(v2d);
 
   /* locked channels are less strongly shown, as feedback for locked channels in DopeSheet */
   /* TODO: allow this opacity factor to be themed? */
@@ -705,175 +709,167 @@ static void draw_keylist(View2D *v2d,
 
   /* Show interpolation and handle type? */
   bool show_ipo = (saction_flag & SACTION_SHOW_INTERPOLATION) != 0;
-
   /* draw keyblocks */
-  if (keys) {
-    float sel_color[4], unsel_color[4];
-    float sel_mhcol[4], unsel_mhcol[4];
-    float ipo_color[4], ipo_color_mix[4];
-
-    /* cache colors first */
-    UI_GetThemeColor4fv(TH_STRIP_SELECT, sel_color);
-    UI_GetThemeColor4fv(TH_STRIP, unsel_color);
-    UI_GetThemeColor4fv(TH_DOPESHEET_IPOLINE, ipo_color);
-
-    sel_color[3] *= alpha;
-    unsel_color[3] *= alpha;
-    ipo_color[3] *= alpha;
-
-    copy_v4_v4(sel_mhcol, sel_color);
-    sel_mhcol[3] *= 0.8f;
-    copy_v4_v4(unsel_mhcol, unsel_color);
-    unsel_mhcol[3] *= 0.8f;
-    copy_v4_v4(ipo_color_mix, ipo_color);
-    ipo_color_mix[3] *= 0.5f;
-
-    uint block_len = 0;
-    uint gpencil_len = 0;
-    LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
-      if (actkeyblock_get_valid_hold(ab)) {
-        block_len++;
-      }
-      if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
-        block_len++;
-      }
-      if ((ab->next != NULL) && (ab->block.flag & ACTKEYBLOCK_FLAG_GPENCIL)) {
-        gpencil_len++;
+  float sel_color[4], unsel_color[4];
+  float sel_mhcol[4], unsel_mhcol[4];
+  float ipo_color[4], ipo_color_mix[4];
+
+  /* cache colors first */
+  UI_GetThemeColor4fv(TH_STRIP_SELECT, sel_color);
+  UI_GetThemeColor4fv(TH_STRIP, unsel_color);
+  UI_GetThemeColor4fv(TH_DOPESHEET_IPOLINE, ipo_color);
+
+  sel_color[3] *= alpha;
+  unsel_color[3] *= alpha;
+  ipo_color[3] *= alpha;
+
+  copy_v4_v4(sel_mhcol, sel_color);
+  sel_mhcol[3] *= 0.8f;
+  copy_v4_v4(unsel_mhcol, unsel_color);
+  unsel_mhcol[3] *= 0.8f;
+  copy_v4_v4(ipo_color_mix, ipo_color);
+  ipo_color_mix[3] *= 0.5f;
+
+  LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
+    /* Draw grease pencil bars between keyframes. */
+    if ((ab->next != NULL) && (ab->block.flag & ACTKEYBLOCK_FLAG_GPENCIL)) {
+      UI_draw_roundbox_corner_set(UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT);
+      float size = 1.0f;
+      switch (ab->next->key_type) {
+        case BEZT_KEYTYPE_BREAKDOWN:
+        case BEZT_KEYTYPE_MOVEHOLD:
+        case BEZT_KEYTYPE_JITTER:
+          size *= 0.5f;
+          break;
+        case BEZT_KEYTYPE_KEYFRAME:
+          size *= 0.8f;
+          break;
+        default:
+          break;
       }
+      UI_draw_roundbox_4fv(
+          &(const rctf){
+              .xmin = ab->cfra,
+              .xmax = min_ff(ab->next->cfra - (screenspace_margin * size), ab->next->cfra),
+              .ymin = ypos - gpencil_sz,
+              .ymax = ypos + gpencil_sz,
+          },
+          true,
+          0.25f * (float)UI_UNIT_X,
+          (ab->block.sel) ? sel_mhcol : unsel_mhcol);
     }
-
-    if ((block_len > 0) || (gpencil_len > 0)) {
-      GPUVertFormat *format = immVertexFormat();
-      uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-      uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
-      immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
-
-      /* Normal Dopesheet. */
-      if (block_len > 0) {
-        immBegin(GPU_PRIM_TRIS, 6 * block_len);
-        LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
-          int valid_hold = actkeyblock_get_valid_hold(ab);
-          if (valid_hold != 0) {
-            if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
-              /* draw "moving hold" long-keyframe block - slightly smaller */
-              immRectf_fast_with_color(pos_id,
-                                       color_id,
-                                       ab->cfra,
-                                       ypos - smaller_sz,
-                                       ab->next->cfra,
-                                       ypos + smaller_sz,
-                                       (ab->block.sel) ? sel_mhcol : unsel_mhcol);
-            }
-            else {
-              /* draw standard long-keyframe block */
-              immRectf_fast_with_color(pos_id,
-                                       color_id,
-                                       ab->cfra,
-                                       ypos - half_icon_sz,
-                                       ab->next->cfra,
-                                       ypos + half_icon_sz,
-                                       (ab->block.sel) ? sel_color : unsel_color);
-            }
-          }
-          if (show_ipo && actkeyblock_is_valid(ab) &&
-              (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
-            /* draw an interpolation line */
-            immRectf_fast_with_color(
-                pos_id,
-                color_id,
-                ab->cfra,
-                ypos - ipo_sz,
-                ab->next->cfra,
-                ypos + ipo_sz,
-                (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color);
-          }
+    else {
+      /* Draw other types. */
+      UI_draw_roundbox_corner_set(UI_CNR_NONE);
+
+      int valid_hold = actkeyblock_get_valid_hold(ab);
+      if (valid_hold != 0) {
+        if ((valid_hold & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
+          /* draw "moving hold" long-keyframe block - slightly smaller */
+          UI_draw_roundbox_4fv(
+              &(const rctf){
+                  .xmin = ab->cfra,
+                  .xmax = ab->next->cfra,
+                  .ymin = ypos - smaller_sz,
+                  .ymax = ypos + smaller_sz,
+              },
+              true,
+              3.0f,
+              (ab->block.sel) ? sel_mhcol : unsel_mhcol);
         }
-      }
-      /* Grease Pencil Dopesheet. */
-      else {
-        immBegin(GPU_PRIM_TRIS, 6 * gpencil_len);
-        LISTBASE_FOREACH (ActKeyColumn *, ab, keys) {
-          if (ab->next == NULL) {
-            continue;
-          }
-          immRectf_fast_with_color(pos_id,
-                                   color_id,
-                                   ab->cfra,
-                                   ypos - quarter_icon_sz,
-                                   ab->next->cfra,
-                                   ypos + quarter_icon_sz,
-                                   (ab->block.sel) ? sel_mhcol : unsel_mhcol);
+        else {
+          /* draw standard long-keyframe block */
+          UI_draw_roundbox_4fv(
+              &(const rctf){
+                  .xmin = ab->cfra,
+                  .xmax = ab->next->cfra,
+                  .ymin = ypos - half_icon_sz,
+                  .ymax = ypos + half_icon_sz,
+              },
+              true,
+              3.0f,
+              (ab->block.sel) ? sel_color : unsel_color);
         }
       }
-      immEnd();
-      immUnbindProgram();
+      if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
+        /* draw an interpolation line */
+        UI_draw_roundbox_4fv(
+            &(const rctf){
+                .xmin = ab->cfra,
+                .xmax = ab->next->cfra,
+                .ymin = ypos - ipo_sz,
+                .ymax = ypos + ipo_sz,
+            },
+            true,
+            3.0f,
+            (ab->block.conflict & ACTKEYBLOCK_FLAG_NON_BEZIER) ? ipo_color_mix : ipo_color);
+      }
     }
   }
 
-  if (keys) {
-    /* count keys */
-    uint key_len = 0;
-    LISTBASE_FOREACH (ActKeyColumn *, ak, keys) {
-      /* Optimization: if keyframe doesn't appear within 5 units (screenspace)
-       * in visible area, don't draw.
-       * This might give some improvements,
-       * since we current have to flip between view/region matrices.
-       */
-      if (IN_RANGE_INCL(ak->cfra, v2d->cur.xmin, v2d->cur.xmax)) {
-        key_len++;
-      }
+  GPU_blend(GPU_BLEND_ALPHA);
+
+  /* count keys */
+  uint key_len = 0;
+  LISTBASE_FOREACH (ActKeyColumn *, ak, keys) {
+    /* Optimization: if keyframe doesn't appear within 5 units (screenspace)
+     * in visible area, don't draw.
+     * This might give some improvements,
+     * since we current have to flip between view/region matrices.
+     */
+    if (IN_RANGE_INCL(ak->cfra, v2d->cur.xmin, v2d->cur.xmax)) {
+      key_len++;
     }
+  }
 
-    if (key_len > 0) {
-      /* draw keys */
-      GPUVertFormat *format = immVertexFormat();
-      uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-      uint size_id = GPU_vertformat_attr_add(format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
-      uint color_id = GPU_vertformat_attr_add(
-          format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
-      uint outline_color_id = GPU_vertformat_attr_add(
-          format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
-      uint flags_id = GPU_vertformat_attr_add(format, "flags", GPU_COMP_U32, 1, GPU_FETCH_INT);
-
-      GPU_program_point_size(true);
-      immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
-      immUniform1f("outline_scale", 1.0f);
-      immU

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list