[Bf-blender-cvs] [784f7f3] asset-engine: Merge branch 'master' into asset-engine
Bastien Montagne
noreply at git.blender.org
Sun Jul 24 18:13:49 CEST 2016
Commit: 784f7f3264143ec6c8011173610870eefd73fc4b
Author: Bastien Montagne
Date: Sun Jul 24 17:55:43 2016 +0200
Branches: asset-engine
https://developer.blender.org/rB784f7f3264143ec6c8011173610870eefd73fc4b
Merge branch 'master' into asset-engine
Conflicts:
source/blender/windowmanager/intern/wm_files_link.c
===================================================================
===================================================================
diff --cc source/blender/windowmanager/intern/wm_files_link.c
index 7b50975,e2ccb6f..8195212
--- a/source/blender/windowmanager/intern/wm_files_link.c
+++ b/source/blender/windowmanager/intern/wm_files_link.c
@@@ -691,9 -551,9 +691,13 @@@ static int wm_lib_relocate_invoke(bCont
return OPERATOR_CANCELLED;
}
- /* Note that IDs listed in lapp_data items *must* have been removed from bmain by caller. */
++/**
++ * \param library if given, all IDs from that library will be removed and reloaded. Otherwise, IDs must have already
++ * been removed from \a bmain, and added to \a lapp_data.
++ */
static void lib_relocate_do(
- Main *bmain, WMLinkAppendData *lapp_data, ReportList *reports, AssetEngineType *aet, const bool do_reload)
+ Main *bmain, Scene *scene,
- Library *library, WMLinkAppendData *lapp_data, ReportList *reports, const bool do_reload)
++ Library *library, WMLinkAppendData *lapp_data, ReportList *reports, AssetEngineType *aet, const bool do_reload)
{
ListBase *lbarray[MAX_LIBARRAY];
int lba_idx;
@@@ -701,6 -561,34 +705,36 @@@
LinkNode *itemlink;
int item_idx;
+ /* Remove all IDs to be reloaded from Main. */
- lba_idx = set_listbasepointers(bmain, lbarray);
- while (lba_idx--) {
- ID *id = lbarray[lba_idx]->first;
- const short idcode = id ? GS(id->name) : 0;
-
- if (!id || !BKE_idcode_is_linkable(idcode)) {
- /* No need to reload non-linkable datatypes, those will get relinked with their 'users ID'. */
- continue;
- }
++ if (library) {
++ lba_idx = set_listbasepointers(bmain, lbarray);
++ while (lba_idx--) {
++ ID *id = lbarray[lba_idx]->first;
++ const short idcode = id ? GS(id->name) : 0;
++
++ if (!id || !BKE_idcode_is_linkable(idcode)) {
++ /* No need to reload non-linkable datatypes, those will get relinked with their 'users ID'. */
++ continue;
++ }
+
- for (; id; id = id->next) {
- if (id->lib == library) {
- WMLinkAppendDataItem *item;
++ for (; id; id = id->next) {
++ if (id->lib == library) {
++ WMLinkAppendDataItem *item;
+
- /* We remove it from current Main, and add it to items to link... */
- /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitely linked here... */
- BLI_remlink(lbarray[lba_idx], id);
- item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, id);
- BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries);
++ /* We remove it from current Main, and add it to items to link... */
++ /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitely linked here... */
++ BLI_remlink(lbarray[lba_idx], id);
++ item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, NULL, id);
++ BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries);
+
+ #ifdef PRINT_DEBUG
- printf("\tdatablock to seek for: %s\n", id->name);
++ printf("\tdatablock to seek for: %s\n", id->name);
+ #endif
++ }
+ }
+ }
+ }
+
BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
/* We do not want any instanciation here! */
@@@ -839,6 -727,43 +873,43 @@@
}
}
}
+
+ BKE_main_lib_objects_recalc_all(bmain);
+ IMB_colormanagement_check_file_config(bmain);
+
+ /* important we unset, otherwise these object wont
+ * link into other scenes from this blend file */
+ BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false);
+
+ /* recreate dependency graph to include new objects */
+ DAG_scene_relations_rebuild(bmain, scene);
+
+ /* free gpu materials, some materials depend on existing objects, such as lamps so freeing correctly refreshes */
+ GPU_materials_free();
+ }
+
+ void WM_lib_reload(Library *lib, bContext *C, ReportList *reports)
+ {
+ if (!BLO_has_bfile_extension(lib->filepath)) {
+ BKE_reportf(reports, RPT_ERROR, "'%s' is not a valid library filepath", lib->filepath);
+ return;
+ }
+
+ if (!BLI_exists(lib->filepath)) {
+ BKE_reportf(reports, RPT_ERROR,
+ "Trying to reload library '%s' from invalid path '%s'", lib->id.name, lib->filepath);
+ return;
+ }
+
+ WMLinkAppendData *lapp_data = wm_link_append_data_new(0);
+
+ wm_link_append_data_library_add(lapp_data, lib->filepath);
+
- lib_relocate_do(CTX_data_main(C), CTX_data_scene(C), lib, lapp_data, reports, true);
++ lib_relocate_do(CTX_data_main(C), CTX_data_scene(C), lib, lapp_data, reports, NULL, true);
+
+ wm_link_append_data_free(lapp_data);
+
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
}
static int wm_lib_relocate_exec_do(bContext *C, wmOperator *op, bool do_reload)
@@@ -949,34 -866,7 +1017,7 @@@
}
}
- lba_idx = set_listbasepointers(bmain, lbarray);
- while (lba_idx--) {
- ID *id = lbarray[lba_idx]->first;
- const short idcode = id ? GS(id->name) : 0;
-
- if (!id || !BKE_idcode_is_linkable(idcode)) {
- /* No need to reload non-linkable datatypes, those will get relinked with their 'users ID'. */
- continue;
- }
-
- for (; id; id = id->next) {
- if (id->lib == lib) {
- WMLinkAppendDataItem *item;
-
- /* We remove it from current Main, and add it to items to link... */
- /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitely linked here... */
- BLI_remlink(lbarray[lba_idx], id);
- item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, NULL, id);
- BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries);
-
- #ifdef PRINT_DEBUG
- printf("\tdatablock to seek for: %s\n", id->name);
- #endif
- }
- }
- }
-
- lib_relocate_do(bmain, lapp_data, op->reports, NULL, do_reload);
- lib_relocate_do(bmain, scene, lib, lapp_data, op->reports, do_reload);
++ lib_relocate_do(bmain, scene, lib, lapp_data, op->reports, NULL, do_reload);
wm_link_append_data_free(lapp_data);
@@@ -1057,463 -934,4 +1085,451 @@@ void WM_OT_lib_reload(wmOperatorType *o
FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA);
}
+/** \name Asset-related operators.
+ *
+ * \{ */
+
+typedef struct AssetUpdateCheckEngine {
+ struct AssetUpdateCheckEngine *next, *prev;
+ AssetEngine *ae;
+
+ /* Note: We cannot store IDs themselves in non-locking async task... so we'll have to check again for
+ * UUID/IDs mapping on each update call... Not ideal, but don't think it will be that big of a bottleneck
+ * in practice. */
+ AssetUUIDList uuids;
+ int allocated_uuids;
+ int ae_job_id;
+ short status;
+} AssetUpdateCheckEngine;
+
+typedef struct AssetUpdateCheckJob {
+ ListBase engines;
+ short flag;
+
+ float *progress;
+ short *stop;
+} AssetUpdateCheckJob;
+
+/* AssetUpdateCheckEngine.status */
+enum {
+ AUCE_UPDATE_CHECK_DONE = 1 << 0, /* Update check is finished for this engine. */
+ AUCE_ENSURE_ASSETS_DONE = 1 << 1, /* Asset ensure is finished for this engine (if applicable). */
+};
+
+/* AssetUpdateCheckJob.flag */
+enum {
+ AUCJ_ENSURE_ASSETS = 1 << 0, /* Try to perform the 'ensure' task too. */
+};
+
+/* Helper to fetch a set of assets to handle, regrouped by asset engine. */
+static void asset_update_engines_uuids_fetch(
+ ListBase *engines,
+ Main *bmain, AssetUUIDList *uuids, const short uuid_tags,
+ const bool do_reset_tags)
+{
+ for (Library *lib = bmain->library.first; lib; lib = lib->id.next) {
+ if (lib->asset_repository) {
+ printf("Checking lib file '%s' (engine %s, ver. %d)\n", lib->filepath,
+ lib->asset_repository->asset_engine, lib->asset_repository->asset_engine_version);
+
+ AssetUpdateCheckEngine *auce = NULL;
+ AssetEngineType *ae_type = BKE_asset_engines_find(lib->asset_repository->asset_engine);
+ bool copy_engine = false;
+
+ if (ae_type == NULL) {
+ printf("ERROR! Unknown asset engine!\n");
+ }
+
+ for (AssetRef *aref = lib->asset_repository->assets.first; aref; aref = aref->next) {
+ ID *id = ((LinkData *)aref->id_list.first)->data;
+ BLI_assert(id->uuid);
+
+ if (uuid_tags && !(id->uuid->tag & uuid_tags)) {
+ continue;
+ }
+
+ if (uuids) {
+ int i = uuids->nbr_uuids;
+ bool skip = true;
+ for (AssetUUID *uuid = uuids->uuids; i--; uuid++) {
+ if (ASSETUUID_COMPARE(id->uuid, uuid)) {
+ skip = false;
+ break;
+ }
+ }
+ if (skip) {
+ continue;
+ }
+ }
+
+ if (ae_type == NULL) {
+ if (do_reset_tags) {
+ id->uuid->tag = UUID_TAG_ENGINE_MISSING;
+ }
+ else {
+ id->uuid->tag |= UUID_TAG_ENGINE_MISSING;
+ }
+ G.f |= G_ASSETS_FAIL;
+ continue;
+ }
+
+ if (auce == NULL) {
+ for (auce = engines->first; auce; auce = auce->next) {
+ if (auce->ae->type == ae_type) {
+ /* In case we have several engine versions for the same engine, we create several
+ * AssetUpdateCheckEngine structs (since an uuid list can only handle one ae version), using
+ * the same (shallow) copy of the actual asset engine. */
+ copy_engine = (auce->uuids.asset_engine_version != lib->asset_repository->asset_engine_version);
+ break;
+ }
+ }
+ if (copy_engine || auce == NULL) {
+ AssetUpdateCheckEngine *auce_prev = auce;
+ auce = MEM_callocN(sizeof(*auce), __func__);
+ auce->ae = copy_engine ? BKE_asset_engine_copy(auce_prev->ae) :
+ BKE_asset_engine_create(ae_type, NULL);
+ auce->ae_job_id = AE_JOB_ID_UNSET;
+ auce->uuids.asset_engine_version = lib->asset_repository->asset_engine_version;
+ BLI_addtail(engines, auce);
+ }
+ }
+
+ printf("\tWe need to check for updated asset %s...\n", id->name);
+ if (do_reset_tags) {
+ id->uuid->tag = (id->tag & LIB_TAG_MISSING) ? UUID_TAG_ASSET_MISSING : 0;
+ }
+
+ auce->uuids.nbr_uuids++;
+ BKE_asset_uuid_print(id->uuid);
+ if (auce->uuids.nbr_uuids > auce->allocated_uuids) {
+ auce->allocated_uuids += 16;
+ BLI_assert(auce->uuids.nbr_uuids < auce->allocated_uuids);
+
+ const size_t allocsize = sizeof(*auce->uuids.uuids) * (size_t)auce->allocated_uuids;
+ auce->uuids.uuids = auce->uuids.uuids ?
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list