[Bf-blender-cvs] [aec80da] asset-engine: More or less finished shell of 'update' code.

Bastien Montagne noreply at git.blender.org
Wed Apr 6 18:05:26 CEST 2016


Commit: aec80da8f86ecd1b2c9e8463d891df6fcbecb61a
Author: Bastien Montagne
Date:   Wed Apr 6 17:38:12 2016 +0200
Branches: asset-engine
https://developer.blender.org/rBaec80da8f86ecd1b2c9e8463d891df6fcbecb61a

More or less finished shell of 'update' code.

Code only reports which datablocks/assets shall be reloaded etc. so far, actual
reloading needs id-remap code (and hence will be implemented in asset-experiment
branch later).

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

M	release/scripts/startup/bl_operators/amber.py
M	source/blender/blenkernel/BKE_asset.h
M	source/blender/blenkernel/intern/blender.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/makesrna/intern/rna_asset.c

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

diff --git a/release/scripts/startup/bl_operators/amber.py b/release/scripts/startup/bl_operators/amber.py
index b661f62..4e6e2d5 100644
--- a/release/scripts/startup/bl_operators/amber.py
+++ b/release/scripts/startup/bl_operators/amber.py
@@ -476,6 +476,12 @@ class AssetEngineAmber(AssetEngine):
         #~ print(entries.root_path)
         pass
 
+    def update_check(self, uuids):
+        # do nothing for now...
+        for uuid in uuids.uuids:
+            uuid.use_asset_reload = True
+        return True
+
     def sort_filter(self, use_sort, use_filter, params, entries):
 #        print(use_sort, use_filter)
         if use_filter:
diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h
index f0f530b..1f99812 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -68,6 +68,7 @@ typedef float (*ae_progress)(struct AssetEngine *engine, const int job_id);
 typedef void (*ae_kill)(struct AssetEngine *engine, const int job_id);
 
 /* ***** All callbacks below shall be non-blocking (i.e. return immediately). ***** */
+
 /* Those callbacks will be called from a 'fake-job' start *and* update functions (i.e. main thread, working one will
  * just sleep).
  * If given id is not null, engine should update from a running job if available, otherwise it should start a new one.
@@ -112,16 +113,18 @@ typedef bool (*ae_load_pre)(struct AssetEngine *engine, struct AssetUUIDList *uu
  * E.g. allows an advanced engine to make fancy scripted operations over loaded items. */
 typedef bool (*ae_load_post)(struct AssetEngine *engine, struct ID *items, const int *num_items);
 
+/* Check if given dirpath is valid for current asset engine, it can also modify it.
+ * r_dir is assumed to be least FILE_MAX. */
+typedef void (*ae_check_dir)(struct AssetEngine *engine, char *r_dir);
+
 /* 'update' hook, called to prepare updating of given entries (typically after a file (re)load).
  * Engine should check whether given assets are still valid, if they should be updated, etc.
  * uuids tagged as needing reload will then be reloaded as new ones
- * (ae_load_pre, then actual lib loading, then ae_load_post). */
+ * (ae_load_pre, then actual lib loading, then ae_load_post).
+ * \warning DO NOT add or remove (or alter order of) uuids from the list in this callback! */
+/* XXX Should we make this non-blocking too? */
 typedef bool (*ae_update_check)(struct AssetEngine *engine, struct AssetUUIDList *uuids);
 
-/* Check if given dirpath is valid for current asset engine, it can also modify it.
- * r_dir is assumed to be least FILE_MAX. */
-typedef void (*ae_check_dir)(struct AssetEngine *engine, char *r_dir);
-
 typedef struct AssetEngineType {
 	struct AssetEngineType *next, *prev;
 
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index ed1947e..36f6f63 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -59,10 +59,13 @@
 #include "BLI_utildefines.h"
 #include "BLI_callbacks.h"
 
+#include "RNA_access.h"
+
 #include "IMB_imbuf.h"
 #include "IMB_moviecache.h"
 
 #include "BKE_appdir.h"
+#include "BKE_asset.h"
 #include "BKE_blender.h"
 #include "BKE_bpath.h"
 #include "BKE_brush.h"
@@ -90,8 +93,6 @@
 #include "BLO_readfile.h" 
 #include "BLO_writefile.h" 
 
-#include "RNA_access.h"
-
 #include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie
 
 #include "IMB_colormanagement.h"
@@ -523,24 +524,95 @@ void BKE_userdef_state(void)
 static void read_file_update_assets(bContext *C)
 {
 	Main *bmain = CTX_data_main(C);
-	ListBase *lb_array[MAX_LIBARRAY];
-	int i = set_listbasepointers(bmain, lb_array);
+
+	BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
 
 	for (Library *lib = bmain->library.first; lib; lib = lib->id.next) {
 		if (lib->asset_repository) {
 			printf("Handling lib file %s (engine %s, ver. %d)\n", lib->filepath, lib->asset_repository->asset_engine, lib->asset_repository->asset_engine_version);
+
+			AssetUUIDList uuids = {0};
+			AssetUUID *uuid;
+			AssetEngineType *ae_type = BKE_asset_engines_find(lib->asset_repository->asset_engine);
+			AssetEngine *ae = NULL;
+
+			uuids.asset_engine_version = lib->asset_repository->asset_engine_version;
+
+			printf("Handling lib file %s (engine %s, ver. %d)\n", lib->filepath, lib->asset_repository->asset_engine, lib->asset_repository->asset_engine_version);
+
+			if (ae_type == NULL) {
+				printf("ERROR! Unknown asset engine!\n");
+			}
+			else {
+				ae = BKE_asset_engine_create(ae_type);
+			}
+
+			/* Note: we assume update check callback does not add, remove or alter order of uuids in that list! */
+
 			for (AssetRef *aref = lib->asset_repository->assets.first; aref; aref = aref->next) {
 				for (LinkData *ld = aref->id_list.first; ld; ld = ld->next) {
 					ID *id = ld->data;
 
+					if (ae_type == NULL) {
+						if (id->uuid) {
+							id->uuid->tag = UUID_TAG_ENGINE_MISSING;
+						}
+						continue;
+					}
+
 					if (id->uuid) {
 						printf("\tWe need to check for updated asset %s...\n", id->name);
+						id->uuid->tag = 0;
+
+						/* XXX horrible, need to use some mempool, stack or something :) */
+						uuids.nbr_uuids++;
+						if (uuids.uuids) {
+							uuids.uuids = MEM_reallocN_id(uuids.uuids, sizeof(*uuids.uuids) * (size_t)uuids.nbr_uuids, __func__);
+						}
+						else {
+							uuids.uuids = MEM_mallocN(sizeof(*uuids.uuids) * (size_t)uuids.nbr_uuids, __func__);
+						}
+						uuids.uuids[uuids.nbr_uuids - 1] = *id->uuid;
 					}
 					else {
 						printf("\t\tWe need to check for updated asset sub-data %s...\n", id->name);
 					}
+					id->tag |= LIB_TAG_DOIT;
+				}
+			}
+
+			if (ae == NULL) {
+				continue;  /* uuids.uuids has not been allocated either, we can skip to next lib safely. */
+			}
+
+			const int nbr_uuids = uuids.nbr_uuids;
+			ae_type->update_check(ae, &uuids);
+
+			BLI_assert(nbr_uuids == uuids.nbr_uuids);
+
+			uuid = uuids.uuids;
+			for (AssetRef *aref = lib->asset_repository->assets.first; aref; aref = aref->next) {
+				for (LinkData *ld = aref->id_list.first; ld; ld = ld->next) {
+					ID *id = ld->data;
+					if (id->uuid) {
+						*id->uuid = *uuid;
+						uuid++;
+
+						if (id->uuid->tag & UUID_TAG_ENGINE_MISSING) {
+							printf("\t%s uses a currently unknown asset engine!\n", id->name);
+						}
+						else if (id->uuid->tag & UUID_TAG_ASSET_MISSING) {
+							printf("\t%s is currently unknown by asset engine!\n", id->name);
+						}
+						else if (id->uuid->tag & UUID_TAG_ASSET_RELOAD) {
+							printf("\t%s needs to be reloaded/updated!\n", id->name);
+						}
+					}
 				}
 			}
+
+			MEM_freeN(uuids.uuids);
+			BKE_asset_engine_free(ae);
 		}
 	}
 }
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 335c71d..fa69dee 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1715,25 +1715,21 @@ FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const int uuid
 
 		if (engine->type->entries_uuid_get) {
 			FileDirEntryArr r_entries;
-			AssetUUIDList *uuids = MEM_mallocN(sizeof(*uuids), __func__);
-			AssetUUID *asset_uuid;
+			AssetUUIDList uuids = {0};
+			AssetUUID asset_uuid = {0};
 			FileDirEntry *en = NULL;
 
-			uuids->uuids = MEM_callocN(sizeof(*uuids->uuids), __func__);
-			uuids->nbr_uuids = 1;
-			uuids->asset_engine_version = engine->type->version;
-			asset_uuid = &uuids->uuids[0];
+			uuids.uuids = &asset_uuid;
+			uuids.nbr_uuids = 1;
+			uuids.asset_engine_version = engine->type->version;
 
-			memcpy(asset_uuid->uuid_asset, uuid, sizeof(asset_uuid->uuid_asset));
+			memcpy(asset_uuid.uuid_asset, uuid, sizeof(asset_uuid.uuid_asset));
 			/* Variants and revision uuids remain NULL here. */
 
-			if (engine->type->entries_uuid_get(engine, uuids, &r_entries)) {
+			if (engine->type->entries_uuid_get(engine, &uuids, &r_entries)) {
 				en = r_entries.entries.first;
 			}
 
-			MEM_freeN(uuids->uuids);
-			MEM_freeN(uuids);
-
 			return en;
 		}
 	}
diff --git a/source/blender/makesrna/intern/rna_asset.c b/source/blender/makesrna/intern/rna_asset.c
index db4d8d3..7dd44f1 100644
--- a/source/blender/makesrna/intern/rna_asset.c
+++ b/source/blender/makesrna/intern/rna_asset.c
@@ -459,6 +459,33 @@ static void rna_ae_check_dir(AssetEngine *engine, char *r_dir)
 	RNA_parameter_list_free(&list);
 }
 
+static bool rna_ae_update_check(AssetEngine *engine, AssetUUIDList *uuids)
+{
+	extern FunctionRNA rna_AssetEngine_update_check_func;
+	PointerRNA ptr;
+	PropertyRNA *parm;
+	ParameterList list;
+	FunctionRNA *func;
+
+	void *ret;
+	bool ret_success;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_AssetEngine_update_check_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "uuids", &uuids);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+
+	parm = RNA_function_find_parameter(NULL, func, "success_return");
+	RNA_parameter_get(&list, parm, &ret);
+	ret_success = ((*(int *)ret) != 0);
+
+	RNA_parameter_list_free(&list);
+
+	return ret_success;
+}
+
 static bool rna_ae_sort_filter(
         AssetEngine *engine, const bool use_sort, const bool use_filter,
         FileSelectParams *params, FileDirEntryArr *entries_r)
@@ -575,7 +602,7 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, ReportList *reports, voi
 	AssetEngineType *aet, dummyaet = {NULL};
 	AssetEngine dummyengine = {NULL};
 	PointerRNA dummyptr;
-	int have_function[9];
+	int have_function[10];
 
 	/* setup dummy engine & engine type to store static properties in */
 	dummyengine.type = &dummyaet;
@@ -618,9 +645,11 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, ReportList *reports, voi
 
 	aet->check_dir = (have_function[5]) ? rna_ae_check_dir : NULL;
 
-	aet->sort_filter = (have_function[6]) ? rna_ae_sort_filter : NULL;
-	aet->entries_block_get = (have_function[7]) ? rna_ae_entries_block_get : NULL;
-	aet->entries_uuid_get = (have_function[8]) ? rna_ae_entries_uuid_get : NULL;
+	aet->update_check = (have_function[6]) ? rna_ae_update_check : NULL;
+
+	aet->sort_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list