[Bf-blender-cvs] [e75db0e61bd] id_copy_refactor: Fix several crashes and other issues in new ID copying code.
Bastien Montagne
noreply at git.blender.org
Tue Jul 11 15:58:03 CEST 2017
Commit: e75db0e61bd057f0aaf36b21a07816ffadb6a239
Author: Bastien Montagne
Date: Tue Jul 11 14:16:04 2017 +0200
Branches: id_copy_refactor
https://developer.blender.org/rBe75db0e61bd057f0aaf36b21a07816ffadb6a239
Fix several crashes and other issues in new ID copying code.
Mostly in core and animdata area. Code should now also be more robust,
and slightly simpler & cleaner.
===================================================================
M source/blender/blenkernel/BKE_animsys.h
M source/blender/blenkernel/BKE_library.h
M source/blender/blenkernel/intern/anim_sys.c
M source/blender/blenkernel/intern/library.c
M source/blender/editors/armature/armature_relations.c
M source/blender/editors/object/object_relations.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index 147bdc84e4a..534a57765f6 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -67,10 +67,10 @@ bool BKE_animdata_set_action(struct ReportList *reports, struct ID *id, struct b
void BKE_animdata_free(struct ID *id, const bool do_id_user);
/* Copy AnimData */
-struct AnimData *BKE_animdata_copy(struct AnimData *adt, const bool do_action);
+struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const bool do_action);
/* Copy AnimData */
-bool BKE_animdata_copy_id(struct ID *id_to, struct ID *id_from, const bool do_action);
+bool BKE_animdata_copy_id(struct Main *bmain, struct ID *id_to, struct ID *id_from, const bool do_action);
/* Copy AnimData Actions */
void BKE_animdata_copy_id_action(struct ID *id, const bool set_newid);
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index b5d92f98bfa..004442fb013 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -84,7 +84,7 @@ void *BKE_libblock_copy(struct Main *bmain, const struct ID *id) ATTR_WARN_UNUSE
/* "Deprecated" old API. */
void *BKE_libblock_copy_nolib(const struct ID *id, const bool do_action) ATTR_NONNULL();
-void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const int flag);
+void BKE_libblock_copy_data(struct Main *bmain, struct ID *id, const struct ID *id_from, const int flag);
void BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) ATTR_NONNULL();
void BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL();
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 23ae5a69843..6afa251bce7 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -259,7 +259,7 @@ void BKE_animdata_free(ID *id, const bool do_id_user)
/* Copying -------------------------------------------- */
/* Make a copy of the given AnimData - to be used when copying datablocks */
-AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
+AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const bool do_action)
{
AnimData *dadt;
@@ -270,8 +270,9 @@ AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
/* make a copy of action - at worst, user has to delete copies... */
if (do_action) {
- dadt->action = BKE_action_copy(G.main, adt->action);
- dadt->tmpact = BKE_action_copy(G.main, adt->tmpact);
+ BLI_assert(bmain != NULL);
+ BKE_id_copy_ex(bmain, (ID *)dadt->action, (ID **)&dadt->action, 0, false);
+ BKE_id_copy_ex(bmain, (ID *)dadt->tmpact, (ID **)&dadt->tmpact, 0, false);
}
else {
id_us_plus((ID *)dadt->action);
@@ -291,7 +292,7 @@ AnimData *BKE_animdata_copy(AnimData *adt, const bool do_action)
return dadt;
}
-bool BKE_animdata_copy_id(ID *id_to, ID *id_from, const bool do_action)
+bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, const bool do_action)
{
AnimData *adt;
@@ -303,7 +304,7 @@ bool BKE_animdata_copy_id(ID *id_to, ID *id_from, const bool do_action)
adt = BKE_animdata_from_id(id_from);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id_to;
- iat->adt = BKE_animdata_copy(adt, do_action);
+ iat->adt = BKE_animdata_copy(bmain, adt, do_action);
}
return true;
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c5d816328a1..f288e963a2a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -526,121 +526,130 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
#define LIB_ID_TYPES_NOCOPY ID_LI, ID_SCR, ID_WM, /* Not supported */ \
ID_IP /* Deprecated */
- if (ELEM(GS(id->name), LIB_ID_TYPES_NOCOPY)) {
+ BLI_assert(test || (r_newid != NULL));
+ if (r_newid != NULL) {
+ *r_newid = NULL;
+ }
+ if (id == NULL) {
return false;
}
- if (!test) {
- BKE_libblock_copy_ex(bmain, id, r_newid, flag);
+ if (ELEM(GS(id->name), LIB_ID_TYPES_NOCOPY)) {
+ return false;
}
+ else if (test) {
+ return true;
+ }
+
+ BKE_libblock_copy_ex(bmain, id, r_newid, flag);
switch ((ID_Type)GS(id->name)) {
case ID_SCE:
- if (!test) BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
+ BKE_scene_copy_data(bmain, (Scene *)*r_newid, (Scene *)id, flag);
break;
case ID_OB:
- if (!test) BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
+ BKE_object_copy_data(bmain, (Object *)*r_newid, (Object *)id, flag);
break;
case ID_ME:
- if (!test) BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
+ BKE_mesh_copy_data(bmain, (Mesh *)*r_newid, (Mesh *)id, flag);
break;
case ID_CU:
- if (!test) BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
+ BKE_curve_copy_data(bmain, (Curve *)*r_newid, (Curve *)id, flag);
break;
case ID_MB:
- if (!test) BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
+ BKE_mball_copy_data(bmain, (MetaBall *)*r_newid, (MetaBall *)id, flag);
break;
case ID_MA:
- if (!test) BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
+ BKE_material_copy_data(bmain, (Material *)*r_newid, (Material *)id, flag);
break;
case ID_TE:
- if (!test) BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
+ BKE_texture_copy_data(bmain, (Tex *)*r_newid, (Tex *)id, flag);
break;
case ID_IM:
- if (!test) BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
+ BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag);
break;
case ID_LT:
- if (!test) BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
+ BKE_lattice_copy_data(bmain, (Lattice *)*r_newid, (Lattice *)id, flag);
break;
case ID_LA:
- if (!test) BKE_lamp_copy_data(bmain, (Lamp *)*r_newid, (Lamp *)id, flag);
+ BKE_lamp_copy_data(bmain, (Lamp *)*r_newid, (Lamp *)id, flag);
break;
case ID_SPK:
- if (!test) BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
+ BKE_speaker_copy_data(bmain, (Speaker *)*r_newid, (Speaker *)id, flag);
break;
case ID_CA:
- if (!test) BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
+ BKE_camera_copy_data(bmain, (Camera *)*r_newid, (Camera *)id, flag);
break;
case ID_KE:
- if (!test) BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
+ BKE_key_copy_data(bmain, (Key *)*r_newid, (Key *)id, flag);
break;
case ID_WO:
- if (!test) BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
+ BKE_world_copy_data(bmain, (World *)*r_newid, (World *)id, flag);
break;
case ID_TXT:
- if (!test) BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
+ BKE_text_copy_data(bmain, (Text *)*r_newid, (Text *)id, flag);
break;
case ID_GR:
- if (!test) BKE_group_copy_data(bmain, (Group *)*r_newid, (Group *)id, flag);
+ BKE_group_copy_data(bmain, (Group *)*r_newid, (Group *)id, flag);
break;
case ID_AR:
- if (!test) BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
+ BKE_armature_copy_data(bmain, (bArmature *)*r_newid, (bArmature *)id, flag);
break;
case ID_AC:
- if (!test) BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
+ BKE_action_copy_data(bmain, (bAction *)*r_newid, (bAction *)id, flag);
break;
case ID_NT:
- if (!test) BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
+ BKE_node_tree_copy_data(bmain, (bNodeTree *)*r_newid, (bNodeTree *)id, flag);
break;
case ID_BR:
- if (!test) BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag);
+ BKE_brush_copy_data(bmain, (Brush *)*r_newid, (Brush *)id, flag);
break;
case ID_PA:
- if (!test) BKE_particlesettings_copy_data(bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag);
+ BKE_particlesettings_copy_data(bmain, (ParticleSettings *)*r_newid, (ParticleSettings *)id, flag);
break;
case ID_GD:
- if (!test) BKE_gpencil_copy_data(bmain, (bGPdata *)*r_newid, (bGPdata *)id, flag);
+ BKE_gpencil_copy_data(bmain, (bGPdata *)*r_newid, (bGPdata *)id, flag);
break;
case ID_MC:
- if (!test) BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag);
+ BKE_movieclip_copy_data(bmain, (MovieClip *)*r_newid, (MovieClip *)id, flag);
break;
case ID_MSK:
- if (!test) BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag);
+ BKE_mask_copy_data(bmain, (Mask *)*r_newid, (Mask *)id, flag);
break;
case ID_LS:
- if (!test) BKE_linestyle_copy_data(bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag);
+ BKE_linestyle_copy_data(bmain, (FreestyleLineStyle *)*r_newid, (FreestyleLineStyle *)id, flag);
break;
case ID_PAL:
- if (!test) BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag);
+ BKE_palette_copy_data(bmain, (Palette *)*r_newid, (Palette *)id, flag);
break;
case ID_PC:
- if (!test) BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag);
+ BKE_paint_curve_copy_data(bmain, (PaintCurve *)*r_newid, (PaintCurve *)id, flag);
break;
case ID_CF:
- if (!test) BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag);
+ BKE_cachefile_copy_data(bmain, (CacheFile *)*r_newid, (CacheFile *)id, flag);
break;
case ID_SO:
- if (!test) BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag);
+ BKE_sound_copy_data(bmain, (bSound *)*r_newid, (bSound *)id, flag);
break;
case ID_VF:
- if (!test) BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag);
+ BKE_vfont_copy_data(bmain, (VFont *)*r_newid, (VFont *)id, flag);
break;
case ID_LI:
case ID_SCR:
case ID_WM:
case ID_IP:
BLI_assert(0); /* Should have been rejected at start of function! */
- return false;
+ break;
}
- if (!test) {
- /* U
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list