Commit: 613bf6755ea41ddcb58e3f7497064c141cf70946
Author: Bastien Montagne
Date:   Wed Dec 16 22:28:31 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rB613bf6755ea41ddcb58e3f7497064c141cf70946

Merge branch 'id-remap' into asset-experiments

Conflicts:
        source/blender/blenloader/BLO_readfile.h
        source/blender/blenloader/intern/readfile.c
        source/blender/windowmanager/intern/wm_operators.c

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



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

diff --cc source/blender/blenloader/BLO_readfile.h
index dcf4b09,0d13302..3df6183
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@@ -101,12 -99,9 +101,14 @@@ struct Main *BLO_library_link_begin(str
  struct ID *BLO_library_link_named_part(struct Main *mainl, BlendHandle **bh, 
const short idcode, const char *name);
  struct ID *BLO_library_link_named_part_ex(
          struct Main *mainl, BlendHandle **bh,
 -        const int idcode, const char *name, const short flag,
 +        const short idcode, const char *name, const short flag,
-         struct Scene *scene, struct View3D *v3d);
++        struct Scene *scene, struct View3D *v3d,
++        const bool use_placeholders, const bool force_indirect);
 +struct ID *BLO_library_link_named_part_asset(
 +        struct Main *mainl, BlendHandle **bh, const struct AssetEngineType 
*aet,
 +        const short idcode, const char *name, const struct AssetUUID *uuid, 
const short flag,
-         struct Scene *scene, struct View3D *v3d);
+         struct Scene *scene, struct View3D *v3d,
+         const bool use_placeholders, const bool force_indirect);
  void BLO_library_link_end(struct Main *mainl, BlendHandle **bh, short flag, 
struct Scene *scene, struct View3D *v3d);
  
  void BLO_library_link_all(struct Main *mainl, BlendHandle *bh);
diff --cc source/blender/blenloader/intern/readfile.c
index c204362,dd6a350..07d2611
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@@ -9689,11 -9694,10 +9697,12 @@@ void BLO_library_link_all(Main *mainl, 
  }
  
  static ID *link_named_part_ex(
 -        Main *mainl, FileData *fd, const int idcode, const char *name, const 
short flag,
 -              Scene *scene, View3D *v3d, const bool use_placeholders, const 
bool force_indirect)
 +        Main *mainl, FileData *fd, const AssetEngineType *aet,
 +        const short idcode, const char *name, const AssetUUID *uuid, const 
int flag,
-               Scene *scene, View3D *v3d)
++              Scene *scene, View3D *v3d,
++        const bool use_placeholders, const bool force_indirect)
  {
-       ID *id = link_named_part(mainl, fd, idcode, name);
+       ID *id = link_named_part(mainl, fd, idcode, name, use_placeholders, 
force_indirect);
  
        if (id && (GS(id->name) == ID_OB)) {    /* loose object: give a base */
                if (scene) {
@@@ -9761,36 -9767,11 +9772,35 @@@ ID *BLO_library_link_named_part(Main *m
   * \return the linked ID when found.
   */
  ID *BLO_library_link_named_part_ex(
-         Main *mainl, BlendHandle **bh,
-         const short idcode, const char *name, const short flag,
-         Scene *scene, View3D *v3d)
 -        Main *mainl, BlendHandle **bh, const int idcode, const char *name, 
const short flag,
++        Main *mainl, BlendHandle **bh, const short idcode, const char *name, 
const short flag,
++        Scene *scene, View3D *v3d, const bool use_placeholders, const bool 
force_indirect)
 +{
 +      FileData *fd = (FileData*)(*bh);
-       return link_named_part_ex(mainl, fd, NULL, idcode, name, NULL, flag, 
scene, v3d);
++      return link_named_part_ex(mainl, fd, NULL, idcode, name, NULL, flag, 
scene, v3d, use_placeholders, force_indirect);
 +}
 +
 +/**
 + * Link a named datablock from an external blend file, using given asset 
engine & asset UUID.
 + * Optionally instantiate the object/group in the scene when the flags are 
set.
 + *
 + * \param mainl The main database to link from (not the active one).
 + * \param bh The blender file handle.
 + * \param aet The asset engine type (NULL when no asset engine is used).
 + * \param idcode The kind of datablock to link.
 + * \param name The name of the datablock (without the 2 char ID prefix).
 + * \param uuid The asset engine's UUID of this datablock (NULL when no asset 
engine is used).
 + * \param flag Options for linking, used for instantiating.
 + * \param scene The scene in which to instantiate objects/groups (if NULL, no 
instantiation is done).
 + * \param v3d The active View3D (only to define active layers for 
instantiated objects & groups, can be NULL).
 + * \return the linked ID when found.
 + */
 +struct ID *BLO_library_link_named_part_asset(
 +        Main *mainl, BlendHandle **bh, const AssetEngineType *aet,
 +        const short idcode, const char *name, const AssetUUID *uuid, const 
short flag,
-         Scene *scene, View3D *v3d)
+         Scene *scene, View3D *v3d, const bool use_placeholders, const bool 
force_indirect)
  {
        FileData *fd = (FileData*)(*bh);
-       return link_named_part_ex(mainl, fd, aet, idcode, name, uuid, flag, 
scene, v3d);
 -      return link_named_part_ex(mainl, fd, idcode, name, flag, scene, v3d, 
use_placeholders, force_indirect);
++      return link_named_part_ex(mainl, fd, aet, idcode, name, uuid, flag, 
scene, v3d, use_placeholders, force_indirect);
  }
  
  static void link_id_part(ReportList *reports, FileData *fd, Main *mainvar, ID 
*id, ID **r_id)
diff --cc source/blender/makesdna/DNA_ID.h
index ed38b0a,de15219..4b6edc0
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@@ -147,11 -127,10 +147,12 @@@ typedef struct ID 
         * to.
         */
        short flag;
+       int flag2;
        int us;
-       int icon_id, pad2;
+       int icon_id;
        IDProperty *properties;
 +
 +      AssetUUID *uuid;
  } ID;
  
  /**
diff --cc source/blender/windowmanager/intern/wm_operators.c
index bbb0468,89fe923..188410c
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@@ -2730,7 -2707,8 +2730,8 @@@ static WMLinkAppendDataItem *wm_link_ap
  }
  
  static void wm_link_do(
-         WMLinkAppendData *lapp_data, ReportList *reports, Main *bmain, 
AssetEngineType *aet, Scene *scene, View3D *v3d)
 -        WMLinkAppendData *lapp_data, ReportList *reports, Main *bmain, Scene 
*scene, View3D *v3d,
++        WMLinkAppendData *lapp_data, ReportList *reports, Main *bmain, 
AssetEngineType *aet, Scene *scene, View3D *v3d,
+         const bool use_placeholders, const bool force_indirect)
  {
        Main *mainl;
        BlendHandle *bh;
@@@ -2777,8 -2755,8 +2778,9 @@@
                                continue;
                        }
  
 -                      new_id = BLO_library_link_named_part_ex(
 -                                   mainl, &bh, item->idcode, item->name, 
flag, scene, v3d, use_placeholders, force_indirect);
 +                      new_id = BLO_library_link_named_part_asset(
-                                    mainl, &bh, aet, item->idcode, item->name, 
&item->uuid, flag, scene, v3d);
++                                   mainl, &bh, aet, item->idcode, item->name, 
&item->uuid, flag, scene, v3d,
++                                   use_placeholders, force_indirect);
  
                        if (new_id) {
                                /* If the link is sucessful, clear item's libs 
'todo' flags.
@@@ -2937,7 -2900,7 +2939,7 @@@ static int wm_link_append_exec(bContex
        /* 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));
 -      wm_link_do(lapp_data, op->reports, bmain, scene, CTX_wm_view3d(C), 
false, false);
++      wm_link_do(lapp_data, op->reports, bmain, aet, scene, CTX_wm_view3d(C), 
false, false);
  
        /* BKE_main_unlock(bmain); */
  
@@@ -3034,6 -2993,398 +3036,399 @@@ static void WM_OT_append(wmOperatorTyp
        wm_link_append_properties_common(ot, false);
  }
  
+ 
+ static int wm_lib_relocate_invoke(bContext *C, wmOperator *op, const wmEvent 
*UNUSED(event))
+ {
+       Library *lib;
+       char lib_name[MAX_NAME];
+ 
+       RNA_string_get(op->ptr, "library", lib_name);
+       lib = (Library *)BKE_libblock_find_name_ex(CTX_data_main(C), ID_LI, 
lib_name);
+ 
+       if (lib) {
+               if (lib->parent) {
+                       BKE_reportf(op->reports, RPT_ERROR_INVALID_INPUT,
+                                   "Cannot relocate indirectly linked library 
'%s'", lib->filepath);
+                       return OPERATOR_CANCELLED;
+               }
+               RNA_string_set(op->ptr, "filepath", lib->filepath);
+ 
+               WM_event_add_fileselect(C, op);
+ 
+               return OPERATOR_RUNNING_MODAL;
+       }
+ 
+       return OPERATOR_CANCELLED;
+ }
+ 
+ static int wm_lib_relocate_exec_do(bContext *C, wmOperator *op, const bool 
reload)
+ {
+       Library *lib;
+       char lib_name[MAX_NAME];
+ 
+       RNA_string_get(op->ptr, "library", lib_name);
+       lib = (Library *)BKE_libblock_find_name_ex(CTX_data_main(C), ID_LI, 
lib_name);
+ 
+       if (lib) {
+               Main *bmain = CTX_data_main(C);
+               Scene *scene = CTX_data_scene(C);
+               PropertyRNA *prop;
+               WMLinkAppendData *lapp_data;
+ 
+               ListBase *lbarray[MAX_LIBARRAY];
+               int lba_idx;
+ 
+               LinkNode *itemlink;
+               int item_idx;
+ 
+               int num_ids;
+               char path[FILE_MAX], root[FILE_MAXDIR], libname[FILE_MAX], 
relname[FILE_MAX];
+               short flag = 0;
+ 
+               if (RNA_boolean_get(op->ptr, "relative_path")) {
+                       flag |= FILE_RELPATH;
+               }
+ 
+               if (lib->parent && !reload) {
+                       BKE_reportf(op->reports, RPT_ERROR_INVALID_INPUT,
+                                   "Cannot relocate indirectly linked library 
'%s'", lib->filepath);
+                       return OPERATOR_CANCELLED;
+               }
+ 
+               RNA_string_get(op->ptr, "directory", root);
+               RNA_string_get(op->ptr, "filename", libname);
+ 
+               if (!BLO_has_bfile_extension(libname)) {
+                       BKE_report(op->reports, RPT_ERROR, "Not a library");
+                       return OPERATOR_CANCELLED;
+               }
+ 
+               BLI_join_dirfile(path, sizeof(path), root, libname);
+ 
+               if (BLI_path_cmp(lib->filepath, path) == 0) {
+                       printf("We are supposed to reload '%s' lib (%d)...\n", 
lib->filepath, lib->id.us);
+ 
+                       lapp_data = wm_link_append_data_new(flag);
+                       wm_link_append_data_library_add(lapp_data, path);
+ 
+                       BKE_main_lock(bmain);
+ 
+                       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, id);
++                                              item = 
wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, NULL, id);


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to