[Bf-blender-cvs] [90a463dcfc6] id_copy_refactor: Add new Curve copying code.
Bastien Montagne
noreply at git.blender.org
Tue Jun 20 21:34:37 CEST 2017
Commit: 90a463dcfc65a2e21134423d75101e32eba7b791
Author: Bastien Montagne
Date: Tue Jun 20 21:34:18 2017 +0200
Branches: id_copy_refactor
https://developer.blender.org/rB90a463dcfc65a2e21134423d75101e32eba7b791
Add new Curve copying code.
===================================================================
M source/blender/blenkernel/BKE_curve.h
M source/blender/blenkernel/intern/curve.c
M source/blender/blenkernel/intern/library.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 0d382c8a49c..340a3e842e6 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -78,6 +78,7 @@ void BKE_curve_free(struct Curve *cu);
void BKE_curve_editfont_free(struct Curve *cu);
void BKE_curve_init(struct Curve *cu);
struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type);
+void BKE_curve_copy_ex(struct Main *bmain, struct Curve *cu_dst, const struct Curve *cu_src, const int flag);
struct Curve *BKE_curve_copy(struct Main *bmain, const struct Curve *cu);
void BKE_curve_make_local(struct Main *bmain, struct Curve *cu, const bool lib_local);
short BKE_curve_type_get(struct Curve *cu);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 8b32109cf2b..9e3d8dccd3a 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -187,42 +187,46 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type)
return cu;
}
-Curve *BKE_curve_copy(Main *bmain, const Curve *cu)
+void BKE_curve_copy_ex(Main *bmain, Curve *cu_dst, const Curve *cu_src, const int flag)
{
- Curve *cun;
int a;
- cun = BKE_libblock_copy(bmain, &cu->id);
-
- BLI_listbase_clear(&cun->nurb);
- BKE_nurbList_duplicate(&(cun->nurb), &(cu->nurb));
+ BLI_listbase_clear(&cu_dst->nurb);
+ BKE_nurbList_duplicate(&(cu_dst->nurb), &(cu_src->nurb));
- cun->mat = MEM_dupallocN(cu->mat);
- for (a = 0; a < cun->totcol; a++) {
- id_us_plus((ID *)cun->mat[a]);
+ cu_dst->mat = MEM_dupallocN(cu_src->mat);
+ if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) {
+ for (a = 0; a < cu_dst->totcol; a++) {
+ id_us_plus((ID *)cu_dst->mat[a]);
+ }
}
- cun->str = MEM_dupallocN(cu->str);
- cun->strinfo = MEM_dupallocN(cu->strinfo);
- cun->tb = MEM_dupallocN(cu->tb);
- cun->bb = MEM_dupallocN(cu->bb);
+ cu_dst->str = MEM_dupallocN(cu_src->str);
+ cu_dst->strinfo = MEM_dupallocN(cu_src->strinfo);
+ cu_dst->tb = MEM_dupallocN(cu_src->tb);
+ cu_dst->bb = MEM_dupallocN(cu_src->bb);
- if (cu->key) {
- cun->key = BKE_key_copy(bmain, cu->key);
- cun->key->from = (ID *)cun;
+ if (cu_src->key) {
+ BKE_id_copy_ex(bmain, &cu_src->key->id, (ID **)&cu_dst->key, flag, false);
+ cu_dst->key->id.tag &= ~LIB_TAG_FREE_NO_USER_REFCOUNT; /* XXX Bad hack, to be solved better hopefully :( */
}
- cun->editnurb = NULL;
- cun->editfont = NULL;
-
- id_us_plus((ID *)cun->vfont);
- id_us_plus((ID *)cun->vfontb);
- id_us_plus((ID *)cun->vfonti);
- id_us_plus((ID *)cun->vfontbi);
+ cu_dst->editnurb = NULL;
+ cu_dst->editfont = NULL;
- BKE_id_copy_ensure_local(bmain, &cu->id, &cun->id);
+ if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) {
+ id_us_plus((ID *)cu_dst->vfont);
+ id_us_plus((ID *)cu_dst->vfontb);
+ id_us_plus((ID *)cu_dst->vfonti);
+ id_us_plus((ID *)cu_dst->vfontbi);
+ }
+}
- return cun;
+Curve *BKE_curve_copy(Main *bmain, const Curve *cu)
+{
+ Curve *cu_copy;
+ BKE_id_copy_ex(bmain, &cu->id, (ID **)&cu_copy, 0, false);
+ return cu_copy;
}
void BKE_curve_make_local(Main *bmain, Curve *cu, const bool lib_local)
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 4f2adfef5e3..b765eafa141 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -532,7 +532,7 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
if (!test) {
/* Check to be removed of course, just here until all BKE_xxx_copy_ex functions are done. */
- if (ELEM(GS(id->name), ID_OB, ID_ME, ID_KE)) {
+ if (ELEM(GS(id->name), ID_OB, ID_ME, ID_CU, ID_KE)) {
BKE_libblock_copy_ex(bmain, id, r_newid, flag);
}
}
@@ -545,7 +545,7 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
if (!test) BKE_mesh_copy_ex(bmain, (Mesh *)*r_newid, (Mesh *)id, flag_idtype_copy);
break;
case ID_CU:
- if (!test) *r_newid = (ID *)BKE_curve_copy(bmain, (Curve *)id);
+ if (!test) BKE_curve_copy_ex(bmain, (Curve *)*r_newid, (Curve *)id, flag_idtype_copy);
break;
case ID_MB:
if (!test) *r_newid = (ID *)BKE_mball_copy(bmain, (MetaBall *)id);
@@ -633,7 +633,7 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
if (!test) {
/* Check to be removed of course, just here until all BKE_xxx_copy_ex functions are done. */
- if (ELEM(GS(id->name), ID_OB, ID_ME, ID_KE)) {
+ if (ELEM(GS(id->name), ID_OB, ID_ME, ID_CU, ID_KE)) {
/* Update ID refcount, remap pointers to self in new ID. */
struct IDCopyLibManagementData data = {.id_src=id, .flag=flag};
BKE_library_foreach_ID_link(bmain, *r_newid, id_copy_libmanagement_cb, &data, IDWALK_NOP);
@@ -642,10 +642,10 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
* Since we call IDType-spefici copying logic without 'userrefcount' flag, we need to redo this here.
* Note/TODO: maybe we'll make IDType copying functions 'private' to be only used by this one,
* in which case we could solve this issue in a better and nicer way. */
- Key *key = BKE_key_from_id(*r_newid);
+ ID *key = (ID *)BKE_key_from_id(*r_newid);
if (key) {
- data.id_src = BKE_key_from_id((ID *)id);
- BKE_library_foreach_ID_link(bmain, &key->id, id_copy_libmanagement_cb, &data, IDWALK_NOP);
+ data.id_src = (ID *)BKE_key_from_id((ID *)id);
+ BKE_library_foreach_ID_link(bmain, key, id_copy_libmanagement_cb, &data, IDWALK_NOP);
}
/* TODO: most likely same for nodes too? */
More information about the Bf-blender-cvs
mailing list