Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2020-12-12 01:49:13 +0300
committerJulian Eisel <julian@blender.org>2020-12-14 14:16:59 +0300
commit812ea9184221a8ca5785528bebc3ef342a8ecfb4 (patch)
tree9ff927244bbb1fae38bfe6edce77895795fe4f6e /source/blender/blenkernel
parent6f7ced77e3e8ecdf32d3345fcde7021e8a3dd56c (diff)
UI/Assets: Operator to load custom preview images for data-blocks
No automatic preview generation will ever be good enough to cover all cases well. So custom preview images are a must for a preview driven data-block selection - like for asset browsing. The operator simply allows selecting an image file, which will then be read and copied into the data-blocks preview (resized if necessary). There's no UI for this currently and the operator won't be available in the search menu yet. It will later once the Asset Browser UI is merged. Reviewed as part of https://developer.blender.org/D9719. Reviewed by: Bastien Montagne, Brecht Van Lommel
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_icons.h6
-rw-r--r--source/blender/blenkernel/intern/icons.c77
2 files changed, 57 insertions, 26 deletions
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index d6cf5eae323..534b24236e8 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -130,6 +130,9 @@ void BKE_previewimg_clear_single(struct PreviewImage *prv, enum eIconSizes size)
/* get the preview from any pointer */
struct PreviewImage **BKE_previewimg_id_get_p(const struct ID *id);
+/* Trigger deferred loading of a custom image file into the preview buffer. */
+void BKE_previewimg_id_custom_set(struct ID *id, const char *path);
+
/* free the preview image belonging to the id */
void BKE_previewimg_id_free(struct ID *id);
@@ -156,7 +159,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 eec9013d067..58b4a8ce315 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -230,6 +230,20 @@ static PreviewImage *previewimg_create_ex(size_t deferred_data_size)
return prv_img;
}
+static PreviewImage *previewimg_deferred_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 = (char *)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);
@@ -364,6 +378,42 @@ PreviewImage *BKE_previewimg_id_ensure(ID *id)
return NULL;
}
+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);
+ }
+}
+
+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_deferred_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;
+ }
+}
+
PreviewImage *BKE_previewimg_cached_get(const char *name)
{
return BLI_ghash_lookup(gCachedPreviews, name);
@@ -417,15 +467,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_deferred_create(path, source);
force_update = true;
}
@@ -441,26 +483,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);
}
/**