[Bf-blender-cvs] [51efe8020e5] asset-browser: Support custom preview images for assets

Julian Eisel noreply at git.blender.org
Tue Nov 24 21:13:53 CET 2020


Commit: 51efe8020e5aa9b21ab1e78c9bee49072794ee30
Author: Julian Eisel
Date:   Tue Nov 24 21:07:21 2020 +0100
Branches: asset-browser
https://developer.blender.org/rB51efe8020e5aa9b21ab1e78c9bee49072794ee30

Support custom preview images for assets

Assets types that already support previews (objects, collections, images,
textures, materials, brushes, lights, worlds, scenes and screens) now support
custom previews too.
To assign a preview, the Asset Browser sidebar shows a "Load Custom Preview"
button. It opens a File Browser to select an image. Once an image is selected,
it overrides whatever preview was previously set. No reference to the image is
created, it basically copies the image to the data-block preview.

The button looks a bit out-of-place currently, that will be improved later.

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

M	release/scripts/addons
M	release/scripts/startup/bl_ui/space_filebrowser.py
M	source/blender/blenkernel/BKE_icons.h
M	source/blender/blenkernel/intern/icons.c
M	source/blender/editors/include/ED_util.h
M	source/blender/editors/render/render_preview.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/space_file/space_file.c
M	source/blender/editors/util/ed_util.c

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

diff --git a/release/scripts/addons b/release/scripts/addons
index 1416eacdbea..4346f20e61b 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 1416eacdbea17df75634fc972e75d0bb8dd195f9
+Subproject commit 4346f20e61b1d9c794333f8d5c203d59d735e46b
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 5f3f21d5336..5cd9f9b3587 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -576,10 +576,12 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel):
 
         layout.use_property_split = True
 
-        if active_file and active_asset:
-            layout.prop(active_file, "name")
-        else:
+        if not active_file or not active_asset:
             layout.label(text="No asset selected.")
+            return
+
+        layout.prop(active_file, "name")
+        layout.operator("ed.lib_id_load_custom_preview", icon='FILEBROWSER')
 
 
 class ASSETBROWSER_PT_metadata_details(asset_utils.AssetBrowserPanel, Panel):
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index f975e308570..67e7901cd86 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -131,6 +131,8 @@ void BKE_previewimg_clear_single(struct PreviewImage *prv, enum eIconSizes size)
 struct PreviewImage **BKE_previewimg_id_get_p(const struct ID *id);
 struct PreviewImage *BKE_previewimg_id_get(const struct ID *id);
 
+void BKE_previewimg_id_custom_set(struct ID *id, const char *path);
+
 bool BKE_previewimg_id_supports_jobs(const struct ID *id);
 
 /* free the preview image belonging to the id */
@@ -164,7 +166,8 @@ struct PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
                                                           bool force_update);
 
 void BKE_previewimg_cached_release(const char *name);
-void BKE_previewimg_cached_release_pointer(struct PreviewImage *prv);
+
+void BKE_previewimg_deferred_release(struct PreviewImage *prv);
 
 void BKE_previewimg_blend_write(struct BlendWriter *writer, const struct PreviewImage *prv);
 void BKE_previewimg_blend_read(struct BlendDataReader *reader, struct PreviewImage *prv);
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 58f4786af57..d6877b06462 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -232,6 +232,20 @@ static PreviewImage *previewimg_create_ex(size_t deferred_data_size)
   return prv_img;
 }
 
+static PreviewImage *previewimg_defered_create(const char *path, int source)
+{
+  /* We pack needed data for lazy loading (source type, in a single char, and path). */
+  const size_t deferred_data_size = strlen(path) + 2;
+  char *deferred_data;
+
+  PreviewImage *prv = previewimg_create_ex(deferred_data_size);
+  deferred_data = PRV_DEFERRED_DATA(prv);
+  deferred_data[0] = source;
+  memcpy(&deferred_data[1], path, deferred_data_size - 1);
+
+  return prv;
+}
+
 PreviewImage *BKE_previewimg_create(void)
 {
   return previewimg_create_ex(0);
@@ -372,11 +386,47 @@ PreviewImage *BKE_previewimg_id_ensure(ID *id)
   return NULL;
 }
 
+void BKE_previewimg_id_custom_set(ID *id, const char *path)
+{
+  PreviewImage **prv = BKE_previewimg_id_get_p(id);
+
+  /* Thumbnail previews must use the deferred pipeline. But we force them to be immediately
+   * generated here still. */
+
+  if (*prv) {
+    BKE_previewimg_deferred_release(*prv);
+  }
+  *prv = previewimg_defered_create(path, THB_SOURCE_IMAGE);
+
+  /* Can't lazy-render the preview on access. ID previews are saved to files and we want them to be
+   * there in time. Not only if something happened to have accessed it meanwhile. */
+  for (int i = 0; i < NUM_ICON_SIZES; i++) {
+    BKE_previewimg_ensure(*prv, i);
+    /* Prevent auto-updates. */
+    (*prv)->flag[i] |= PRV_USER_EDITED;
+  }
+}
+
 bool BKE_previewimg_id_supports_jobs(const ID *id)
 {
   return ELEM(GS(id->name), ID_OB, ID_MA, ID_TE, ID_LA, ID_WO, ID_IM, ID_BR);
 }
 
+void BKE_previewimg_deferred_release(PreviewImage *prv)
+{
+  if (prv) {
+    if (prv->tag & PRV_TAG_DEFFERED_RENDERING) {
+      /* We cannot delete the preview while it is being loaded in another thread... */
+      prv->tag |= PRV_TAG_DEFFERED_DELETE;
+      return;
+    }
+    if (prv->icon_id) {
+      BKE_icon_delete(prv->icon_id);
+    }
+    BKE_previewimg_freefunc(prv);
+  }
+}
+
 PreviewImage *BKE_previewimg_cached_get(const char *name)
 {
   return BLI_ghash_lookup(gCachedPreviews, name);
@@ -402,6 +452,7 @@ PreviewImage *BKE_previewimg_cached_ensure(const char *name)
 
 /**
  * Generate a PreviewImage from given file path, using thumbnails management, if not yet existing.
+ * Does not actually generate the preview, #BKE_previewimg_ensure() must be called for that.
  */
 PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
                                                    const char *path,
@@ -430,15 +481,7 @@ PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
   }
 
   if (!prv) {
-    /* We pack needed data for lazy loading (source type, in a single char, and path). */
-    const size_t deferred_data_size = strlen(path) + 2;
-    char *deferred_data;
-
-    prv = previewimg_create_ex(deferred_data_size);
-    deferred_data = PRV_DEFERRED_DATA(prv);
-    deferred_data[0] = source;
-    memcpy(&deferred_data[1], path, deferred_data_size - 1);
-
+    previewimg_defered_create(path, source);
     force_update = true;
   }
 
@@ -454,26 +497,11 @@ PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
   return prv;
 }
 
-void BKE_previewimg_cached_release_pointer(PreviewImage *prv)
-{
-  if (prv) {
-    if (prv->tag & PRV_TAG_DEFFERED_RENDERING) {
-      /* We cannot delete the preview while it is being loaded in another thread... */
-      prv->tag |= PRV_TAG_DEFFERED_DELETE;
-      return;
-    }
-    if (prv->icon_id) {
-      BKE_icon_delete(prv->icon_id);
-    }
-    BKE_previewimg_freefunc(prv);
-  }
-}
-
 void BKE_previewimg_cached_release(const char *name)
 {
   PreviewImage *prv = BLI_ghash_popkey(gCachedPreviews, name, MEM_freeN);
 
-  BKE_previewimg_cached_release_pointer(prv);
+  BKE_previewimg_deferred_release(prv);
 }
 
 /**
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 68ae3589064..d74a80045f1 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -53,6 +53,7 @@ void ED_spacedata_id_remap(struct ScrArea *area,
                            struct ID *new_id);
 
 void ED_OT_flush_edits(struct wmOperatorType *ot);
+void ED_OT_lib_id_load_custom_preview(struct wmOperatorType *ot);
 
 /* ************** XXX OLD CRUFT WARNING ************* */
 
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 9089b2e00e0..267d9a8c5bc 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -1474,7 +1474,7 @@ static void icon_preview_endjob(void *customdata)
 
     if (prv_img->tag & PRV_TAG_DEFFERED_DELETE) {
       BLI_assert(prv_img->tag & PRV_TAG_DEFFERED);
-      BKE_previewimg_cached_release_pointer(prv_img);
+      BKE_previewimg_deferred_release(prv_img);
     }
   }
 }
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 72b3b344813..2f0b7fba250 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -5510,6 +5510,7 @@ void ED_operatortypes_screen(void)
   WM_operatortype_append(ED_OT_undo_history);
 
   WM_operatortype_append(ED_OT_flush_edits);
+  WM_operatortype_append(ED_OT_lib_id_load_custom_preview);
 }
 
 /** \} */
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index f3c15bc2efa..e1052c586c5 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -756,7 +756,7 @@ static void file_space_subtype_item_extend(bContext *UNUSED(C),
   RNA_enum_items_add(item, totitem, rna_enum_space_file_browse_mode_items);
 }
 
-const char *file_context_dir[] = {"active_file", NULL};
+const char *file_context_dir[] = {"active_file", "active_id", NULL};
 
 static int /*eContextResult*/ file_context(const bContext *C,
                                            const char *member,
@@ -777,6 +777,15 @@ static int /*eContextResult*/ file_context(const bContext *C,
     CTX_data_pointer_set(result, &screen->id, &RNA_FileSelectEntry, file);
     return CTX_RESULT_OK;
   }
+  else if (CTX_data_equals(member, "active_id")) {
+    const FileDirEntry *file = filelist_file(sfile->files, params->active_file);
+
+    ID *id = filelist_file_get_id(sfile->files, file);
+    if (id) {
+      CTX_data_id_pointer_set(result, id);
+    }
+    return CTX_RESULT_OK;
+  }
   return CTX_RESULT_MEMBER_NOT_FOUND;
 }
 
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 76c261c9cba..43205427b0a 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -35,6 +35,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
+#include "BLI_fileops.h"
 #include "BLI_listbase.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
@@ -44,6 +45,7 @@
 
 #include "BKE_context.h"
 #include "BKE_global.h"
+#include "BKE_icons.h"
 #include "BKE_layer.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
@@ -51,6 +53,7 @@
 #include "BKE_object.h"
 #include "BKE_packedFile.h"
 #include "BKE_paint.h"
+#include "BKE_report.h"
 #include "BKE_screen.h"
 #include "BKE_undo_system.h"
 #include "BKE_workspace.h"
@@ -501,3 +504,68 @@ void ED_OT_flush_edits(wmOperatorType *ot)
   /* flags */
   ot->flag = OPTYPE_INTERNAL;
 }
+
+static bool lib_id_load_custom_preview_poll(bContext *C)
+{
+  const PointerRNA idptr = CTX_data_pointer_get(C, "active_id");
+  BLI_assert(!idptr.data || RNA_struct_is_ID(idptr.type));
+
+  const I

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list