[Bf-blender-cvs] [f1f09b565e8] asset-greasepencil: GPencil: Select visible frame for preview image

Antonio Vazquez noreply at git.blender.org
Sat Jul 24 12:12:34 CEST 2021


Commit: f1f09b565e83d18796d3337ae971a3549948310f
Author: Antonio Vazquez
Date:   Sat Jul 24 12:12:25 2021 +0200
Branches: asset-greasepencil
https://developer.blender.org/rBf1f09b565e83d18796d3337ae971a3549948310f

GPencil: Select visible frame for preview image

The datablock must be in a frame inside the range to get a visible thumbnail.

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/editors/gpencil/gpencil_asset.c
M	source/blender/editors/render/render_preview.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 92e70b41e7b..406e6f35c02 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -171,6 +171,7 @@ struct bGPDcurve *BKE_gpencil_stroke_editcurve_new(const int tot_curve_points);
 #define GPENCIL_STRENGTH_MIN 0.003f
 
 bool BKE_gpencil_layer_is_editable(const struct bGPDlayer *gpl);
+void BKE_gpencil_frame_min_max(const struct bGPdata *gpd, int *r_min, int *r_max);
 
 /* How gpencil_layer_getframe() should behave when there
  * is no existing GP-Frame on the frame requested.
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 13a8d4f105f..67e1a6c17fc 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -3163,4 +3163,20 @@ void BKE_gpencil_frame_selected_hash(bGPdata *gpd, struct GHash *r_list)
   }
 }
 
+/* Get min and max frame number for all layers. */
+void BKE_gpencil_frame_min_max(const bGPdata *gpd, int *r_min, int *r_max)
+{
+  *r_min = INT_MAX;
+  *r_max = INT_MIN;
+  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+    LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
+      if (gpf->framenum < *r_min) {
+        *r_min = gpf->framenum;
+      }
+      if (gpf->framenum > *r_max) {
+        *r_max = gpf->framenum;
+      }
+    }
+  }
+}
 /** \} */
diff --git a/source/blender/editors/gpencil/gpencil_asset.c b/source/blender/editors/gpencil/gpencil_asset.c
index 34b19a34822..e0edc6e449d 100644
--- a/source/blender/editors/gpencil/gpencil_asset.c
+++ b/source/blender/editors/gpencil/gpencil_asset.c
@@ -195,20 +195,6 @@ static bool gpencil_asset_generic_poll(bContext *C)
   return ED_operator_view3d_active(C);
 }
 
-/* Helper: Get lower frame number from asset strokes. */
-static int gpencil_asset_get_first_franum(const bGPdata *gpd)
-{
-  int first_fra = INT_MAX;
-  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
-    LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
-      if (gpf->framenum < first_fra) {
-        first_fra = gpf->framenum;
-      }
-    }
-  }
-  return first_fra;
-}
-
 /* -------------------------------------------------------------------- */
 /** \name Create Grease Pencil data block Asset operator
  * \{ */
@@ -241,7 +227,6 @@ static bool gpencil_asset_create(const bContext *C,
                                  const bool retime_frames)
 {
   Main *bmain = CTX_data_main(C);
-  Scene *scene = CTX_data_scene(C);
   bool non_supported_feature = false;
 
   /* Create a copy of selected data block. */
@@ -356,9 +341,8 @@ static bool gpencil_asset_create(const bContext *C,
     strcpy(gpl_dst->info, "Asset_Layer");
   }
 
-  /* Ensure preview is done with first available frame. */
-  const int first_franum = gpencil_asset_get_first_franum(gpd);
-  CFRA = first_franum;
+  int f_min, f_max;
+  BKE_gpencil_frame_min_max(gpd, &f_min, &f_max);
 
   /* Mark as asset. */
   ED_asset_mark_id(C, &gpd->id);
@@ -367,7 +351,7 @@ static bool gpencil_asset_create(const bContext *C,
   if (retime_frames) {
     LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
       LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
-        gpf->framenum -= first_franum - 1;
+        gpf->framenum -= f_min - 1;
       }
     }
   }
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index b248d73411f..40b7751fc6c 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -62,6 +62,7 @@
 #include "BKE_colortools.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
+#include "BKE_gpencil.h"
 #include "BKE_icons.h"
 #include "BKE_idprop.h"
 #include "BKE_image.h"
@@ -1017,12 +1018,20 @@ static void gpencil_preview_render(IconPreview *preview, IconPreviewSize *previe
 
   BLI_assert(preview->id_copy && (preview->id_copy != preview->id));
 
+  /* Find the frame number to make preview visible. */
+  int f_min, f_max;
+  bGPdata *gpd = (bGPdata *)preview->id_copy;
+  BKE_gpencil_frame_min_max(gpd, &f_min, &f_max);
+  const int framenum = ((preview->scene->r.cfra < f_min) || (preview->scene->r.cfra > f_max)) ?
+                           f_min :
+                           preview->scene->r.cfra;
+
   struct ObjectPreviewData preview_data = {
       .pr_main = preview_main,
       /* Act on a copy. */
       .object = NULL,
       .datablock = (ID *)preview->id_copy,
-      .cfra = preview->scene->r.cfra,
+      .cfra = framenum,
       .sizex = preview_sized->sizex,
       .sizey = preview_sized->sizey,
   };



More information about the Bf-blender-cvs mailing list