[Bf-blender-cvs] [6c47849] asset-engine: Refactor load_pre helper to work from both DirEntries and uuids...

Bastien Montagne noreply at git.blender.org
Thu Apr 28 22:39:48 CEST 2016


Commit: 6c478490eaa71d0e641e6f319ee41b846dcf1f0c
Author: Bastien Montagne
Date:   Thu Apr 28 22:39:12 2016 +0200
Branches: asset-engine
https://developer.blender.org/rB6c478490eaa71d0e641e6f319ee41b846dcf1f0c

Refactor load_pre helper to work from both DirEntries and uuids...

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

M	source/blender/blenkernel/BKE_asset.h
M	source/blender/blenkernel/intern/asset.c
M	source/blender/editors/space_file/filelist.c

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

diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h
index bc07eb7..4a5ed58 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -204,7 +204,8 @@ AssetEngine *BKE_asset_engine_create(AssetEngineType *type, struct ReportList *r
 AssetEngine *BKE_asset_engine_copy(AssetEngine *engine);
 void BKE_asset_engine_free(AssetEngine *engine);
 
-AssetUUIDList *BKE_asset_engine_load_pre(AssetEngine *engine, struct FileDirEntryArr *r_entries);
+struct AssetUUIDList *BKE_asset_engine_entries_load_pre(AssetEngine *engine, struct FileDirEntryArr *r_entries);
+struct FileDirEntryArr *BKE_asset_engine_uuids_load_pre(AssetEngine *engine, struct AssetUUIDList *r_uuids);
 
 /* File listing utils... */
 
diff --git a/source/blender/blenkernel/intern/asset.c b/source/blender/blenkernel/intern/asset.c
index 8a345d3..71f457b 100644
--- a/source/blender/blenkernel/intern/asset.c
+++ b/source/blender/blenkernel/intern/asset.c
@@ -176,65 +176,81 @@ void BKE_asset_engine_free(AssetEngine *engine)
 
 /* API helpers. */
 
-AssetUUIDList *BKE_asset_engine_load_pre(AssetEngine *engine, FileDirEntryArr *r_entries)
+static void asset_engine_load_pre(AssetEngine *engine, AssetUUIDList *r_uuids, FileDirEntryArr *r_entries)
 {
-	AssetUUIDList *uuids = MEM_mallocN(sizeof(*uuids), __func__);
 	FileDirEntry *en;
-	const int nbr_entries = r_entries->nbr_entries;
-	int i;
+	AssetUUID *uuid;
+	const int nbr_entries = r_entries->nbr_entries ? r_entries->nbr_entries : r_uuids->nbr_uuids;
 
-	uuids->uuids = MEM_mallocN(sizeof(*uuids->uuids) * nbr_entries, __func__);
-	uuids->nbr_uuids = nbr_entries;
-	uuids->asset_engine_version = engine->type->version;
+	if (r_entries->nbr_entries) {
+		BLI_assert(r_uuids->uuids == NULL);
+		r_uuids->uuids = MEM_mallocN(sizeof(*r_uuids->uuids) * nbr_entries, __func__);
+		r_uuids->nbr_uuids = nbr_entries;
+		r_uuids->asset_engine_version = engine->type->version;
 
-	for (i = 0, en = r_entries->entries.first; en; i++, en = en->next) {
-		FileDirEntryVariant *var = BLI_findlink(&en->variants, en->act_variant);
-		AssetUUID *uuid = &uuids->uuids[i];
+		for (en = r_entries->entries.first, uuid = r_uuids->uuids; en; en = en->next, uuid++) {
+			FileDirEntryVariant *var = BLI_findlink(&en->variants, en->act_variant);
 
-		memcpy(uuid->uuid_asset, en->uuid, sizeof(uuid->uuid_asset));
+			memcpy(uuid->uuid_asset, en->uuid, sizeof(uuid->uuid_asset));
 
-		BLI_assert(var);
-		memcpy(uuid->uuid_variant, var->uuid, sizeof(uuid->uuid_variant));
+			BLI_assert(var);
+			memcpy(uuid->uuid_variant, var->uuid, sizeof(uuid->uuid_variant));
 
-		memcpy(uuid->uuid_revision, en->entry->uuid, sizeof(uuid->uuid_revision));
+			memcpy(uuid->uuid_revision, en->entry->uuid, sizeof(uuid->uuid_revision));
+		}
 	}
 
-	if (engine->type->load_pre) {
-		BKE_filedir_entryarr_clear(r_entries);
+	BKE_filedir_entryarr_clear(r_entries);
 
-		if (!engine->type->load_pre(engine, uuids, r_entries)) {
-			/* If load_pre returns false (i.e. fails), clear all paths! */
-			/* TODO: report!!! */
-			BKE_filedir_entryarr_clear(r_entries);
+	if (!engine->type->load_pre(engine, r_uuids, r_entries)) {
+		/* If load_pre returns false (i.e. fails), clear all paths! */
+		/* TODO: report!!! */
+		BKE_filedir_entryarr_clear(r_entries);
 
-			MEM_freeN(uuids->uuids);
-			MEM_freeN(uuids);
-			return NULL;
-		}
+		MEM_freeN(r_uuids->uuids);
+		r_uuids->nbr_uuids = 0;
+		return;
+	}
 
-		/* load_pre may change things, we have to rebuild our uuids list from returned entries. */
-		r_entries->nbr_entries = uuids->nbr_uuids = BLI_listbase_count(&r_entries->entries);
-		uuids->uuids = MEM_reallocN(uuids->uuids, sizeof(*uuids->uuids) * uuids->nbr_uuids);
-		for (i = 0, en = r_entries->entries.first; en; i++, en = en->next) {
-			FileDirEntryVariant *var;
-			FileDirEntryRevision *rev;
-			AssetUUID *uuid = &uuids->uuids[i];
+	/* load_pre may change things, we have to rebuild our uuids list from returned entries. */
+	r_entries->nbr_entries = r_uuids->nbr_uuids = BLI_listbase_count(&r_entries->entries);
+	r_uuids->uuids = MEM_reallocN(r_uuids->uuids, sizeof(*r_uuids->uuids) * r_uuids->nbr_uuids);
+	for (en = r_entries->entries.first, uuid = r_uuids->uuids; en; en = en->next, uuid++) {
+		FileDirEntryVariant *var;
+		FileDirEntryRevision *rev;
 
-			memcpy(uuid->uuid_asset, en->uuid, sizeof(uuid->uuid_asset));
+		memcpy(uuid->uuid_asset, en->uuid, sizeof(uuid->uuid_asset));
 
-			var = BLI_findlink(&en->variants, en->act_variant);
-			BLI_assert(var);
-			memcpy(uuid->uuid_variant, var->uuid, sizeof(uuid->uuid_variant));
+		var = BLI_findlink(&en->variants, en->act_variant);
+		BLI_assert(var);
+		memcpy(uuid->uuid_variant, var->uuid, sizeof(uuid->uuid_variant));
 
-			rev = BLI_findlink(&var->revisions, var->act_revision);
-			BLI_assert(rev);
-			memcpy(uuid->uuid_revision, rev->uuid, sizeof(uuid->uuid_revision));
-		}
+		rev = BLI_findlink(&var->revisions, var->act_revision);
+		BLI_assert(rev);
+		memcpy(uuid->uuid_revision, rev->uuid, sizeof(uuid->uuid_revision));
 	}
+}
+
+/** Call load_pre for given entries, and return new uuids/entries. */
+AssetUUIDList *BKE_asset_engine_entries_load_pre(AssetEngine *engine, FileDirEntryArr *r_entries)
+{
+	AssetUUIDList *uuids = MEM_callocN(sizeof(*uuids), __func__);
+
+	asset_engine_load_pre(engine, uuids, r_entries);
 
 	return uuids;
 }
 
+/** Call load_pre for given uuids, and return new uuids/entries. */
+FileDirEntryArr *BKE_asset_engine_uuids_load_pre(AssetEngine *engine, AssetUUIDList *r_uuids)
+{
+	FileDirEntryArr *entries = MEM_callocN(sizeof(*entries), __func__);
+
+	asset_engine_load_pre(engine, r_uuids, entries);
+
+	return entries;
+}
+
 /* FileDirxxx handling. */
 
 void BKE_filedir_revision_free(FileDirEntryRevision *rev)
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 98fc516..b065ed2 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -2353,7 +2353,7 @@ FileDirEntryArr *filelist_selection_get(
 
 	if (use_ae && filelist->ae) {
 		/* This will 'rewrite' selection list, returned paths are expected to be valid! */
-		*r_uuids = BKE_asset_engine_load_pre(filelist->ae, selection);
+		*r_uuids = BKE_asset_engine_entries_load_pre(filelist->ae, selection);
 	}
 	else {
 		*r_uuids = NULL;




More information about the Bf-blender-cvs mailing list