diff options
author | Joshua Leung <aligorith@gmail.com> | 2013-09-13 07:03:46 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2013-09-13 07:03:46 +0400 |
commit | cca746c8e65503f4a98b1ccaf1110acb793b2b9b (patch) | |
tree | 3f4d8419375463951b902782d64cfc724d58ca9b /source/blender/blenkernel | |
parent | 42524915b5dfee539dea4e7033fb19db883e33c0 (diff) |
Moved and renamed ED_pose_channel_in_IK_chain() ->
BKE_pose_channel_in_IK_chain()
This was needed for depsgraph work, and it's cleaner for RNA to have fewer
dependencies on editors
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_action.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/action.c | 34 |
2 files changed, 36 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 12c9f6b449f..d485632955d 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -203,6 +203,9 @@ void BKE_pose_ikparam_init(struct bPose *pose); /* initialize a bItasc structure with default value */ void BKE_pose_itasc_init(struct bItasc *itasc); +/* Checks if a bone is part of an IK chain or not */ +bool BKE_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan); + /* clears BONE_UNKEYED flags for frame changing */ // XXX to be deprecated for a more general solution in animsys... void framechange_poses_clear_unkeyed(void); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index bfef3542c45..644fefad3b0 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -594,11 +594,43 @@ void BKE_pose_ikparam_init(bPose *pose) } } + +/* only for real IK, not for auto-IK */ +static bool pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan, int level) +{ + bConstraint *con; + Bone *bone; + + /* No need to check if constraint is active (has influence), + * since all constraints with CONSTRAINT_IK_AUTO are active */ + for (con = pchan->constraints.first; con; con = con->next) { + if (con->type == CONSTRAINT_TYPE_KINEMATIC) { + bKinematicConstraint *data = con->data; + if ((data->rootbone == 0) || (data->rootbone > level)) { + if ((data->flag & CONSTRAINT_IK_AUTO) == 0) + return true; + } + } + } + for (bone = pchan->bone->childbase.first; bone; bone = bone->next) { + pchan = BKE_pose_channel_find_name(ob->pose, bone->name); + if (pchan && pose_channel_in_IK_chain(ob, pchan, level + 1)) + return true; + } + return false; +} + +bool BKE_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan) +{ + return pose_channel_in_IK_chain(ob, pchan, 0); +} + + void BKE_pose_channels_hash_make(bPose *pose) { if (!pose->chanhash) { bPoseChannel *pchan; - + pose->chanhash = BLI_ghash_str_new("make_pose_chan gh"); for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) BLI_ghash_insert(pose->chanhash, pchan->name, pchan); |