Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_library.h1
-rw-r--r--source/blender/blenkernel/intern/library.c26
-rw-r--r--source/blender/blenkernel/intern/mask.c1
-rw-r--r--source/blender/blenkernel/intern/material.c3
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++) {