diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-12-06 14:59:00 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-12-06 15:00:08 +0300 |
commit | 13e9291650f2f8c8c71fa13d5cc2c4fb7938cd05 (patch) | |
tree | c18c2ea0ba49449a05775b066b490cb1fe6d96b1 /source/blender | |
parent | 3ae6a8512daf5007c255949b2221732e40e7ddf8 (diff) |
Library: Add flag top keep ID library pointer around
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!
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_library.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 4 |
2 files changed, 5 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index cd449b4d840..eb66d4edf0f 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -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); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index b84a494c70e..9d05f13d7df 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -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; } |