diff options
-rw-r--r-- | source/blender/blenkernel/BKE_library.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mask.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 3 |
4 files changed, 29 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 5c92cc7b34b..44a9885cd87 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -49,6 +49,7 @@ struct PropertyRNA; void *BKE_libblock_alloc(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void *BKE_libblock_copy_ex(struct Main *bmain, struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); +void *BKE_libblock_copy_nolib(struct ID *id) ATTR_NONNULL(); void *BKE_libblock_copy(struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const bool do_action); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index 0bd1f97a279..f831378ca5a 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -808,6 +808,32 @@ void *BKE_libblock_copy_ex(Main *bmain, ID *id) return idn; } +void *BKE_libblock_copy_nolib(ID *id) +{ + ID *idn; + size_t idn_len; + + idn = alloc_libblock_notest(GS(id->name)); + assert(idn != NULL); + + BLI_strncpy(idn->name, id->name, sizeof(idn->name)); + + idn_len = MEM_allocN_len(idn); + if ((int)idn_len - (int)sizeof(ID) > 0) { /* signed to allow neg result */ + const char *cp = (const char *)id; + char *cpn = (char *)idn; + + memcpy(cpn + sizeof(ID), cp + sizeof(ID), idn_len - sizeof(ID)); + } + + id->newid = idn; + idn->flag |= LIB_NEW; + + BKE_libblock_copy_data(idn, id, false); + + return idn; +} + void *BKE_libblock_copy(ID *id) { return BKE_libblock_copy_ex(G.main, id); diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index 9b7886ece97..d08b7316e61 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -734,6 +734,7 @@ Mask *BKE_mask_new(Main *bmain, const char *name) return mask; } +/* TODO(sergey): Use generic BKE_libblock_copy_nolib() instead. */ Mask *BKE_mask_copy_nolib(Mask *mask) { Mask *mask_new; diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 0dd62ae730d..eb8b385bbc7 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -256,8 +256,7 @@ Material *localize_material(Material *ma) Material *man; int a; - man = BKE_libblock_copy(&ma->id); - BLI_remlink(&G.main->mat, man); + man = BKE_libblock_copy_nolib(&ma->id); /* no increment for texture ID users, in previewrender.c it prevents decrement */ for (a = 0; a < MAX_MTEX; a++) { |