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:
authorBastien Montagne <bastien@blender.org>2020-10-02 18:36:13 +0300
committerBastien Montagne <bastien@blender.org>2020-10-02 18:40:51 +0300
commit4b36552967bf55b1bf707acd3917280b42b12c52 (patch)
tree37230329d155f2e91f6dd6242d2c69dcc1bfe9ba
parentf3934523946962b807b0dd7e0863a437cfc56e27 (diff)
Fix T81345: part three, armature `free_data` was not handling editbones properly.
Armature freeing would not correctly free its editbone IDProperties. Add a utils to free the whole list of edit bones, and properly handle their potential IDProperties.
-rw-r--r--source/blender/blenkernel/BKE_armature.h1
-rw-r--r--source/blender/blenkernel/intern/armature.c14
2 files changed, 13 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 975190f0fb5..092ca85a570 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -142,6 +142,7 @@ struct bArmature *BKE_armature_add(struct Main *bmain, const char *name);
struct bArmature *BKE_armature_from_object(struct Object *ob);
int BKE_armature_bonelist_count(struct ListBase *lb);
void BKE_armature_bonelist_free(struct ListBase *lb, const bool do_id_user);
+void BKE_armature_editbonelist_free(struct ListBase *lb, const bool do_id_user);
struct bArmature *BKE_armature_copy(struct Main *bmain, const struct bArmature *arm);
void BKE_armature_copy_bone_transforms(struct bArmature *armature_dst,
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 3d91d22e139..0a731f0a7f0 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -143,8 +143,7 @@ static void armature_free_data(struct ID *id)
/* free editmode data */
if (armature->edbo) {
- BLI_freelistN(armature->edbo);
-
+ BKE_armature_editbonelist_free(armature->edbo, false);
MEM_freeN(armature->edbo);
armature->edbo = NULL;
}
@@ -371,6 +370,17 @@ void BKE_armature_bonelist_free(ListBase *lb, const bool do_id_user)
BLI_freelistN(lb);
}
+void BKE_armature_editbonelist_free(ListBase *lb, const bool do_id_user)
+{
+ LISTBASE_FOREACH_MUTABLE (EditBone *, edit_bone, lb) {
+ if (edit_bone->prop) {
+ IDP_FreeProperty_ex(edit_bone->prop, do_id_user);
+ }
+ BLI_remlink_safe(lb, edit_bone);
+ MEM_freeN(edit_bone);
+ }
+}
+
static void copy_bonechildren(Bone *bone_dst,
const Bone *bone_src,
const Bone *bone_src_act,