[Bf-blender-cvs] [9e3246ce6e9] master: Fix T63794: duplicating an armature clears B-Bones' custom handle references.
Tomoaki Kawada
noreply at git.blender.org
Sun Apr 28 16:08:34 CEST 2019
Commit: 9e3246ce6e9767148e4394dc7acbec04a7d69163
Author: Tomoaki Kawada
Date: Sun Apr 28 16:19:45 2019 +0300
Branches: master
https://developer.blender.org/rB9e3246ce6e9767148e4394dc7acbec04a7d69163
Fix T63794: duplicating an armature clears B-Bones' custom handle references.
This patch fixes T63794 by updating duplicated bones' custom handle references
to point to the new armature's bones.
The problem occurs because B-Bones of a duplicated armature keep pointing to
the old armature's bones. The references are cleared upon entering Edit Mode
because there are no matching `EditBone` for such bones, and `find_ebone_link`
just returns `NULL` in such cases.
Reviewers: mont29, angavrilov
Maniphest Tasks: T63794
Differential Revision: https://developer.blender.org/D4726
===================================================================
M source/blender/blenkernel/intern/armature.c
===================================================================
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 97238020f29..7f374c1d66e 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -169,6 +169,28 @@ static void copy_bonechildren(Bone *bone_dst,
}
}
+static void copy_bonechildren_custom_handles(Bone *bone_dst, bArmature *arm_dst, GHash **bone_hash)
+{
+ Bone *bone_dst_child;
+
+ /* Lazily create the name -> bone hashtable. */
+ if ((bone_dst->bbone_prev || bone_dst->bbone_next) && *bone_hash == NULL) {
+ *bone_hash = BKE_armature_bone_from_name_map(arm_dst);
+ }
+
+ if (bone_dst->bbone_prev) {
+ bone_dst->bbone_prev = BLI_ghash_lookup(*bone_hash, bone_dst->bbone_prev->name);
+ }
+ if (bone_dst->bbone_next) {
+ bone_dst->bbone_next = BLI_ghash_lookup(*bone_hash, bone_dst->bbone_next->name);
+ }
+
+ for (bone_dst_child = bone_dst->childbase.first; bone_dst_child;
+ bone_dst_child = bone_dst_child->next) {
+ copy_bonechildren_custom_handles(bone_dst_child, arm_dst, bone_hash);
+ }
+}
+
/**
* Only copy internal data of Armature ID from source
* to already allocated/initialized destination.
@@ -202,6 +224,17 @@ void BKE_armature_copy_data(Main *UNUSED(bmain),
arm_dst->act_bone = bone_dst_act;
+ /* Fix custom handle references. */
+ GHash *bone_hash = NULL; /* lazily created */
+
+ for (bone_dst = arm_dst->bonebase.first; bone_dst; bone_dst = bone_dst->next) {
+ copy_bonechildren_custom_handles(bone_dst, arm_dst, &bone_hash);
+ }
+
+ if (bone_hash) {
+ BLI_ghash_free(bone_hash, NULL, NULL);
+ }
+
arm_dst->edbo = NULL;
arm_dst->act_edbone = NULL;
}
More information about the Bf-blender-cvs
mailing list