[Bf-blender-cvs] [85739da] asset-engine: Add initial support for previews to AssetEngine.

Bastien Montagne noreply at git.blender.org
Sat Aug 13 18:42:33 CEST 2016


Commit: 85739dabefa9a28701e24f1ac33c5c00b1952af1
Author: Bastien Montagne
Date:   Sat Aug 13 18:40:40 2016 +0200
Branches: asset-engine
https://developer.blender.org/rB85739dabefa9a28701e24f1ac33c5c00b1952af1

Add initial support for previews to AssetEngine.

Code not really tested (it just builds and does not crash :P ).

Will also have to rethink a bit API and data structs imho... AssetUUID is starting to become a bit annoying.

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

M	source/blender/blenkernel/BKE_asset_engine.h
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/makesdna/DNA_ID.h
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_asset.c

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

diff --git a/source/blender/blenkernel/BKE_asset_engine.h b/source/blender/blenkernel/BKE_asset_engine.h
index db6769e..3d7c1d8 100644
--- a/source/blender/blenkernel/BKE_asset_engine.h
+++ b/source/blender/blenkernel/BKE_asset_engine.h
@@ -121,6 +121,10 @@ typedef bool (*ae_entries_block_get)(struct AssetEngine *engine, const int start
 typedef bool (*ae_entries_uuid_get)(struct AssetEngine *engine, struct AssetUUIDList *uuids,
                                     struct FileDirEntryArr *entries_r);
 
+/* FILEBROWSER - Get previews of given entries.
+ * XXX WARNING! Currently, only asset part of uuids is valid here (because fileentries only store this one)... */
+typedef int (*ae_previews_get)(struct AssetEngine *engine, const int job_id, struct AssetUUIDList *uuids);
+
 /* 'pre-loading' hook, called before opening/appending/linking/updating given entries.
  * Note first given uuid is the one of 'active' entry, and first entry in returned list will be considered as such too.
  * E.g. allows the engine to ensure entries' paths are actually valid by downloading requested data, etc.
@@ -162,6 +166,8 @@ typedef struct AssetEngineType {
 	ae_entries_block_get entries_block_get;
 	ae_entries_uuid_get entries_uuid_get;
 
+	ae_previews_get previews_get;
+
 	ae_ensure_uuids ensure_uuids;
 
 	ae_load_pre load_pre;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ec5a46d..26c402c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2167,6 +2167,8 @@ static void direct_link_id(FileData *fd, ID *id)
 	}
 	if (id->uuid) {
 		id->uuid = newdataadr(fd, id->uuid);
+		id->uuid->ibuff = NULL;  /* Just in case... */
+		id->uuid->width = id->uuid->height = 0;
 	}
 }
 
@@ -8103,6 +8105,8 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, const short
 			bhead = read_data_into_oldnewmap(fd, bhead, __func__);
 
 			id->uuid = newdataadr(fd, id->uuid);
+			id->uuid->ibuff = NULL;  /* Just in case... */
+			id->uuid->width = id->uuid->height = 0;
 
 			oldnewmap_free_unused(fd->datamap);
 			oldnewmap_clear(fd->datamap);
@@ -9998,6 +10002,8 @@ static ID *link_named_part_ex(
 
 		id->uuid = MEM_mallocN(sizeof(*id->uuid), __func__);
 		*id->uuid = *uuid;
+		id->uuid->ibuff = NULL;
+		id->uuid->width = id->uuid->height = 0;
 		id->flag |= LIB_ASSET;
 
 		if (!mainl->curlib->asset_repository) {
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 1ce7f0b..3718486 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -252,9 +252,12 @@ typedef struct FileListEntryCache {
 	/* Allows to quickly get a cached entry from its UUID. */
 	GHash *uuids;
 
-	/* Previews handling. */
+	/* Previews handling - generic filebrowser. */
 	TaskPool *previews_pool;
 	ThreadQueue *previews_done;
+	/* Previews handling - Asset engines. */
+	int ae_preview_job;
+	AssetUUIDList ae_preview_uuids;
 } FileListEntryCache;
 
 /* FileListCache.flags */
@@ -365,7 +368,7 @@ static int groupname_to_code(const char *group);
 static unsigned int groupname_to_filter_id(const char *group);
 
 static void filelist_filter_clear(FileList *filelist);
-static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size);
+static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size, AssetEngine *ae);
 
 /* ********** Sort helpers ********** */
 
@@ -729,7 +732,7 @@ void filelist_sort_filter(struct FileList *filelist, FileSelectParams *params)
 			                         filelist->ae, need_sorting, need_filtering, params, &filelist->filelist);
 //			printf("%s: changed: %d (%d - %d)\n", __func__, changed, need_sorting, need_filtering);
 			if (changed) {
-				filelist_cache_clear(&filelist->filelist_cache, filelist->filelist_cache.size);
+				filelist_cache_clear(&filelist->filelist_cache, filelist->filelist_cache.size, filelist->ae);
 			}
 		}
 	}
@@ -794,7 +797,7 @@ void filelist_sort_filter(struct FileList *filelist, FileSelectParams *params)
 			filelist->filelist.nbr_entries_filtered = num_filtered;
 		//	printf("Filetered: %d over %d entries\n", num_filtered, filelist->filelist.nbr_entries);
 
-			filelist_cache_clear(&filelist->filelist_cache, filelist->filelist_cache.size);
+			filelist_cache_clear(&filelist->filelist_cache, filelist->filelist_cache.size, filelist->ae);
 
 			MEM_freeN(filtered_tmp);
 		}
@@ -1164,9 +1167,12 @@ static void filelist_cache_preview_freef(TaskPool * __restrict UNUSED(pool), voi
 	}
 }
 
-static void filelist_cache_preview_ensure_running(FileListEntryCache *cache)
+static void filelist_cache_preview_ensure_running(FileListEntryCache *cache, AssetEngine *ae)
 {
-	if (!cache->previews_pool) {
+	if (ae) {
+		/* Nothing to do... */
+	}
+	else if (!cache->previews_pool) {
 		TaskScheduler *scheduler = BLI_task_scheduler_get();
 
 		cache->previews_pool = BLI_task_pool_create_background(scheduler, cache);
@@ -1176,11 +1182,23 @@ static void filelist_cache_preview_ensure_running(FileListEntryCache *cache)
 	}
 }
 
-static void filelist_cache_previews_clear(FileListEntryCache *cache)
+static void filelist_cache_previews_clear(FileListEntryCache *cache, AssetEngine *ae)
 {
-	FileListEntryPreview *preview;
+	if (ae) {
+		if (cache->ae_preview_job != AE_JOB_ID_UNSET) {
+			ae->type->kill(ae, cache->ae_preview_job);
+			cache->ae_preview_job = AE_JOB_ID_UNSET;
+		}
+		for (int i = cache->ae_preview_uuids.nbr_uuids; i--;) {
+			MEM_SAFE_FREE(cache->ae_preview_uuids.uuids[i].ibuff);
+		}
+		MEM_SAFE_FREE(cache->ae_preview_uuids.uuids);
+		cache->ae_preview_uuids.nbr_uuids = 0;
+	}
 
 	if (cache->previews_pool) {
+		FileListEntryPreview *preview;
+
 		BLI_task_pool_cancel(cache->previews_pool);
 
 		while ((preview = BLI_thread_queue_pop_timeout(cache->previews_done, 0))) {
@@ -1193,12 +1211,16 @@ static void filelist_cache_previews_clear(FileListEntryCache *cache)
 	}
 }
 
-static void filelist_cache_previews_free(FileListEntryCache *cache)
+static void filelist_cache_previews_free(FileListEntryCache *cache, AssetEngine *ae)
 {
+	if (ae) {
+		filelist_cache_previews_clear(cache, ae);
+	}
+
 	if (cache->previews_pool) {
 		BLI_thread_queue_nowait(cache->previews_done);
 
-		filelist_cache_previews_clear(cache);
+		filelist_cache_previews_clear(cache, ae);
 
 		BLI_thread_queue_free(cache->previews_done);
 		BLI_task_pool_free(cache->previews_pool);
@@ -1214,24 +1236,41 @@ static void filelist_cache_previews_free(FileListEntryCache *cache)
 static void filelist_cache_previews_push(FileList *filelist, FileDirEntry *entry, const int index)
 {
 	FileListEntryCache *cache = &filelist->filelist_cache;
+	const bool do_preview = ((filelist->ae && filelist->ae->type->previews_get != NULL) ||
+	                         (entry->typeflag & (FILE_TYPE_IMAGE | FILE_TYPE_MOVIE | FILE_TYPE_FTFONT |
+	                                             FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP | FILE_TYPE_BLENDERLIB)));
 
 	BLI_assert(cache->flags & FLC_PREVIEWS_ACTIVE);
 
-	if (!entry->image &&
-	    !(entry->flags & FILE_ENTRY_INVALID_PREVIEW) &&
-	    (entry->typeflag & (FILE_TYPE_IMAGE | FILE_TYPE_MOVIE | FILE_TYPE_FTFONT |
-	                        FILE_TYPE_BLENDER | FILE_TYPE_BLENDER_BACKUP | FILE_TYPE_BLENDERLIB)))
-	{
-		FileListEntryPreview *preview = MEM_mallocN(sizeof(*preview), __func__);
-		BLI_join_dirfile(preview->path, sizeof(preview->path), filelist->filelist.root, entry->relpath);
-		preview->index = index;
-		preview->flags = entry->typeflag;
-		preview->img = NULL;
-//		printf("%s: %d - %s - %p\n", __func__, preview->index, preview->path, preview->img);
+	if (do_preview && !entry->image && !(entry->flags & FILE_ENTRY_INVALID_PREVIEW)) {
+		if (filelist->ae) {
+			/* TODO Really have to find better way to handle this than realloc... */
+			AssetUUIDList *uuids = &cache->ae_preview_uuids;
 
-		filelist_cache_preview_ensure_running(cache);
-		BLI_task_pool_push_ex(cache->previews_pool, filelist_cache_preview_runf, preview,
-		                      true, filelist_cache_preview_freef, TASK_PRIORITY_LOW);
+			if (uuids->uuids) {
+				BLI_assert(uuids->nbr_uuids != 0);
+				uuids->uuids = MEM_recallocN(uuids->uuids, ++uuids->nbr_uuids * sizeof(*uuids->uuids));
+			}
+			else {
+				BLI_assert(uuids->nbr_uuids == 0);
+				uuids->uuids = MEM_callocN(++uuids->nbr_uuids * sizeof(*uuids->uuids), __func__);
+			}
+			memcpy(uuids->uuids[uuids->nbr_uuids - 1].uuid_asset, entry->uuid,
+			       sizeof(uuids->uuids[uuids->nbr_uuids - 1].uuid_asset));
+			/* No real need to call ae->type->previews_get() here, update callback will do so anyway. */
+		}
+		else {
+			FileListEntryPreview *preview = MEM_mallocN(sizeof(*preview), __func__);
+			BLI_join_dirfile(preview->path, sizeof(preview->path), filelist->filelist.root, entry->relpath);
+			preview->index = index;
+			preview->flags = entry->typeflag;
+			preview->img = NULL;
+//			printf("%s: %d - %s - %p\n", __func__, preview->index, preview->path, preview->img);
+
+			filelist_cache_preview_ensure_running(cache, filelist->ae);
+			BLI_task_pool_push_ex(cache->previews_pool, filelist_cache_preview_runf, preview,
+								  true, filelist_cache_preview_freef, TASK_PRIORITY_LOW);
+		}
 	}
 }
 
@@ -1255,7 +1294,7 @@ static void filelist_cache_init(FileListEntryCache *cache, size_t cache_size)
 	cache->flags = FLC_IS_INIT;
 }
 
-static void filelist_cache_free(FileListEntryCache *cache)
+static void filelist_cache_free(FileListEntryCache *cache, AssetEngine *ae)
 {
 	FileDirEntry *entry, *entry_next;
 
@@ -1263,7 +1302,7 @@ static void filelist_cache_free(FileListEntryCache *cache)
 		return;
 	}
 
-	filelist_cache_previews_free(cache);
+	filelist_cache_previews_free(cache, ae);
 
 	MEM_freeN(cache->block_entries);
 
@@ -1281,7 +1320,7 @@ static void filelist_cache_free(FileListEntryCache *cache)
 	BLI_listbase_clear(&cache->cached_entries);
 }
 
-static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size)
+static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size, AssetEngine *ae)
 {
 	FileDirEntry *entry, *entry_next;
 
@@ -1289,7 +1328,7 @@ static vo

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list