diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-11-24 02:03:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-11-24 02:03:04 +0300 |
commit | b7d717cead9000c4600d71ed15fc10ebc103c591 (patch) | |
tree | f59e5c37b13a57b16b279d1f08786405896f448b | |
parent | 9702ea753773664e4b322b14ae507944734ee31d (diff) |
added a function to duplicate bPoseChannel's internal data - constraints, id-props etc.
duplicate_pose_channel_data(), the code to do this was inline in editarmature.c
duplicating editbones now duplicates posebone id-props
also removed an if test for &channew->constraints since it will always be true.
-rw-r--r-- | source/blender/blenkernel/BKE_action.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/action.c | 42 | ||||
-rw-r--r-- | source/blender/editors/armature/editarmature.c | 78 |
3 files changed, 60 insertions, 66 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index e0b65c1996f..6029ce01794 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -140,7 +140,11 @@ void free_pose(struct bPose *pose); */ void copy_pose(struct bPose **dst, struct bPose *src, int copyconstraints); - +/** + * Copy the internal members of each pose channel including constraints + * and ID-Props, used when duplicating bones in editmode. + */ +void duplicate_pose_channel_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from); /** * Return a pointer to the pose channel of the given name diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index af3c4719e32..8fe80edabb9 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -640,6 +640,48 @@ static void copy_pose_channel_data(bPoseChannel *pchan, const bPoseChannel *chan } } +/* makes copies of internal data, unlike copy_pose_channel_data which only + * copies the pose state. + * hint: use when copying bones in editmode (on returned value from verify_pose_channel) */ +void duplicate_pose_channel_data(bPoseChannel *pchan, const bPoseChannel *pchan_from) +{ + /* copy transform locks */ + pchan->protectflag = pchan_from->protectflag; + + /* copy rotation mode */ + pchan->rotmode = pchan_from->rotmode; + + /* copy bone group */ + pchan->agrp_index= pchan_from->agrp_index; + + /* ik (dof) settings */ + pchan->ikflag = pchan_from->ikflag; + VECCOPY(pchan->limitmin, pchan_from->limitmin); + VECCOPY(pchan->limitmax, pchan_from->limitmax); + VECCOPY(pchan->stiffness, pchan_from->stiffness); + pchan->ikstretch= pchan_from->ikstretch; + pchan->ikrotweight= pchan_from->ikrotweight; + pchan->iklinweight= pchan_from->iklinweight; + + /* constraints */ + copy_constraints(&pchan->constraints, &pchan_from->constraints); + + /* id-properties */ + if(pchan->prop) { + /* unlikely but possible it exists */ + IDP_FreeProperty(pchan->prop); + MEM_freeN(pchan->prop); + pchan->prop= NULL; + } + if(pchan_from->prop) { + pchan->prop= IDP_CopyProperty(pchan_from->prop); + } + + /* custom shape */ + pchan->custom= pchan_from->custom; +} + + /* checks for IK constraint, Spline IK, and also for Follow-Path constraint. * can do more constraints flags later */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 3936bc92bb9..db499c72908 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -2599,40 +2599,16 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, char *name, ListBase *edit */ if (src_ob->pose) { bPoseChannel *chanold, *channew; - ListBase *listold, *listnew; chanold = verify_pose_channel(src_ob->pose, curBone->name); if (chanold) { - listold = &chanold->constraints; - if (listold) { - /* WARNING: this creates a new posechannel, but there will not be an attached bone - * yet as the new bones created here are still 'EditBones' not 'Bones'. - */ - channew = - verify_pose_channel(dst_ob->pose, eBone->name); - if (channew) { - /* copy transform locks */ - channew->protectflag = chanold->protectflag; - - /* copy bone group */ - channew->agrp_index= chanold->agrp_index; - - /* ik (dof) settings */ - channew->ikflag = chanold->ikflag; - VECCOPY(channew->limitmin, chanold->limitmin); - VECCOPY(channew->limitmax, chanold->limitmax); - VECCOPY(channew->stiffness, chanold->stiffness); - channew->ikstretch= chanold->ikstretch; - channew->ikrotweight= chanold->ikrotweight; - channew->iklinweight= chanold->iklinweight; - - /* constraints */ - listnew = &channew->constraints; - copy_constraints(listnew, listold); - - /* custom shape */ - channew->custom= chanold->custom; - } + /* WARNING: this creates a new posechannel, but there will not be an attached bone + * yet as the new bones created here are still 'EditBones' not 'Bones'. + */ + channew= verify_pose_channel(dst_ob->pose, eBone->name); + + if(channew) { + duplicate_pose_channel_data(channew, chanold); } } } @@ -2701,43 +2677,15 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) */ if (obedit->pose) { bPoseChannel *chanold, *channew; - ListBase *listold, *listnew; chanold = verify_pose_channel(obedit->pose, curBone->name); if (chanold) { - listold = &chanold->constraints; - if (listold) { - /* WARNING: this creates a new posechannel, but there will not be an attached bone - * yet as the new bones created here are still 'EditBones' not 'Bones'. - */ - channew = - verify_pose_channel(obedit->pose, eBone->name); - if (channew) { - /* copy transform locks */ - channew->protectflag = chanold->protectflag; - - /* copy rotation mode */ - channew->rotmode = chanold->rotmode; - - /* copy bone group */ - channew->agrp_index= chanold->agrp_index; - - /* ik (dof) settings */ - channew->ikflag = chanold->ikflag; - VECCOPY(channew->limitmin, chanold->limitmin); - VECCOPY(channew->limitmax, chanold->limitmax); - VECCOPY(channew->stiffness, chanold->stiffness); - channew->ikstretch= chanold->ikstretch; - channew->ikrotweight= chanold->ikrotweight; - channew->iklinweight= chanold->iklinweight; - - /* constraints */ - listnew = &channew->constraints; - copy_constraints(listnew, listold); - - /* custom shape */ - channew->custom= chanold->custom; - } + /* WARNING: this creates a new posechannel, but there will not be an attached bone + * yet as the new bones created here are still 'EditBones' not 'Bones'. + */ + channew= verify_pose_channel(obedit->pose, eBone->name); + if(channew) { + duplicate_pose_channel_data(channew, chanold); } } } |