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!
This commit is contained in:
Sergey Sharybin 2017-12-06 12:59:00 +01:00
parent 3ae6a8512d
commit 13e9291650
2 changed files with 5 additions and 0 deletions

View 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);

View 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;
}