[Bf-blender-cvs] [7e38180fbe1] asset-engine: Add basic override generation for virtually linked assets.

Bastien Montagne noreply at git.blender.org
Thu Sep 28 19:52:41 CEST 2017


Commit: 7e38180fbe1646a63c80e8cc0fda4c1180c942ba
Author: Bastien Montagne
Date:   Thu Sep 28 19:50:24 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB7e38180fbe1646a63c80e8cc0fda4c1180c942ba

Add basic override generation for virtually linked assets.

Roughly working, most certainly oceans of worms are squirming
under the surface though...

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

M	source/blender/windowmanager/intern/wm_files_link.c

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

diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c
index 081a2cce92c..11fbe3e3245 100644
--- a/source/blender/windowmanager/intern/wm_files_link.c
+++ b/source/blender/windowmanager/intern/wm_files_link.c
@@ -66,6 +66,7 @@
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
 #include "BKE_library.h"
+#include "BKE_library_override.h"
 #include "BKE_library_remap.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
@@ -243,7 +244,8 @@ static int path_to_idcode(const char *path)
 	}
 }
 
-static void wm_link_virtual_lib(WMLinkAppendData *lapp_data, Main *bmain, AssetEngineType *aet, const int lib_idx)
+static void wm_link_virtual_lib(
+        WMLinkAppendData *lapp_data, Main *bmain, AssetEngineType *aet, const int lib_idx, const bool generate_overrides)
 {
 	LinkNode *itemlink;
 	int item_idx;
@@ -287,6 +289,13 @@ static void wm_link_virtual_lib(WMLinkAppendData *lapp_data, Main *bmain, AssetE
 				*new_id->uuid = *item->uuid;
 			}
 
+			if (generate_overrides) {
+				/* Create local override of virtually linked datablock, since we nearly always want to be able
+				 * to edit pretty much everything about it. */
+				new_id = BKE_override_create_from(bmain, new_id);
+				/* TODO: will need to protect some fields on type-by-type case (path field). */
+			}
+
 			/* If the link is sucessful, clear item's libs 'todo' flags.
 			 * This avoids trying to link same item with other libraries to come. */
 			BLI_BITMAP_SET_ALL(item->libraries, false, lapp_data->num_libraries);
@@ -298,7 +307,7 @@ static void wm_link_virtual_lib(WMLinkAppendData *lapp_data, Main *bmain, AssetE
 
 static void wm_link_do(
         WMLinkAppendData *lapp_data, ReportList *reports, Main *bmain, AssetEngineType *aet, Scene *scene, View3D *v3d,
-        const bool use_placeholders, const bool force_indirect)
+        const bool use_placeholders, const bool force_indirect, const bool generate_overrides)
 {
 	Main *mainl;
 	BlendHandle *bh;
@@ -316,7 +325,7 @@ static void wm_link_do(
 
 		if (libname[0] == '\0') {
 			/* Special 'virtual lib' cases. */
-			wm_link_virtual_lib(lapp_data, bmain, aet, lib_idx);
+			wm_link_virtual_lib(lapp_data, bmain, aet, lib_idx, generate_overrides);
 			continue;
 		}
 
@@ -540,7 +549,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
 	/* XXX We'd need re-entrant locking on Main for this to work... */
 	/* BKE_main_lock(bmain); */
 
-	wm_link_do(lapp_data, op->reports, bmain, aet, scene, CTX_wm_view3d(C), false, false);
+	wm_link_do(lapp_data, op->reports, bmain, aet, scene, CTX_wm_view3d(C), false, false, (flag & FILE_LINK) != 0);
 
 	/* BKE_main_unlock(bmain); */
 
@@ -741,8 +750,8 @@ static void lib_relocate_do(
 
 	BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
 
-	/* We do not want any instanciation here! */
-	wm_link_do(lapp_data, reports, bmain, aet, NULL, NULL, do_reload, do_reload);
+	/* We do not want any instanciation here, nor do we want re-generating overrides. */
+	wm_link_do(lapp_data, reports, bmain, aet, NULL, NULL, do_reload, do_reload, false);
 
 	BKE_main_lock(bmain);
 
@@ -786,7 +795,7 @@ static void lib_relocate_do(
 #endif
 
 			/* In some cases, new_id might become direct link, remove parent of library in this case. */
-			if (new_id->lib->parent && (new_id->tag & LIB_TAG_INDIRECT) == 0) {
+			if (new_id->lib && new_id->lib->parent && (new_id->tag & LIB_TAG_INDIRECT) == 0) {
 				if (do_reload) {
 					BLI_assert(0);  /* Should not happen in 'pure' reload case... */
 				}



More information about the Bf-blender-cvs mailing list