Library: Add flag top keep ID library pointer around
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 6 Dec 2017 11:59:00 +0000 (12:59 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 6 Dec 2017 12:00:08 +0000 (13:00 +0100)
This only applies to ID being copied outside of bmain. Handy for cases when it
is important to check if the copy corresponds to a data block coming from
library.

Example of that is proxy evaluation with copy on write.

Thanks Bastien for review!

source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/intern/library.c

index cd449b4d8407ea57120f67815196822a4292575a..eb66d4edf0f37e029aa61793f7dee3178b068fd3 100644 (file)
@@ -77,6 +77,7 @@ enum {
        LIB_ID_COPY_CACHES             = 1 << 18,  /* Copy runtime data caches. */
        /* XXX TODO Do we want to keep that? would rather try to get rid of it... */
        LIB_ID_COPY_ACTIONS            = 1 << 19,  /* EXCEPTION! Deep-copy actions used by animdata of copied ID. */
+       LIB_ID_COPY_KEEP_LIB           = 1 << 20,  /* Keep the library pointer when copying datablock outside of bmain. */
 };
 
 void BKE_libblock_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag);
index b84a494c70ed6d75bdd91ac639e012c799d355ca..9d05f13d7df6a885ed7ba9c02a973b932128b5b2 100644 (file)
@@ -661,8 +661,12 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
        /* Do not make new copy local in case we are copying outside of main...
         * XXX TODO: is this behavior OK, or should we need own flag to control that? */
        if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) {
+               BLI_assert((flag & LIB_ID_COPY_KEEP_LIB) == 0);
                BKE_id_copy_ensure_local(bmain, id, *r_newid);
        }
+       else {
+               (*r_newid)->lib = id->lib;
+       }
 
        return true;
 }