diff options
author | Ton Roosendaal <ton@blender.org> | 2005-07-24 15:36:05 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-07-24 15:36:05 +0400 |
commit | 4d273d8d5b9eb471f82ee49819905eedb68d6a4f (patch) | |
tree | c27fb4ba1f2dff92f75e998d8c03dd9ad627053a /source/blender/blenkernel | |
parent | 1d27a7676b261cd5eecde5828a396398376f6af1 (diff) |
Armature-Pose IK goodies!
- Added option to the IK buttons, to have it use the 'tip' as end of the
IK chain. I never really understood this old convention (IK didn't work
on the Bone itself).
Old files still will read OK though. But I made the "To Tip" a default
when adding new IK constraints.
- Hotkey CTRL+I: add IK, with option to have it adding an Empty target,
or use a selected Bone as target. With the new non-modal PoseMode, it
gives instant access to playing with the IK chain.
- Hotkey ALT+I: clears IK, on all selected Bones
- Hotkey ALT+C: clears Constraints on all selected Bones (incl IK)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_constraint.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 4 |
4 files changed, 23 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index 8fdc63bef60..1dd5beed9fa 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -60,7 +60,7 @@ void free_constraint_channels (ListBase *chanbase); char constraint_has_target (struct bConstraint *con); struct Object *get_constraint_target(struct bConstraint *con, char **subtarget); -void set_constraint_target(struct bConstraint *con, struct Object *ob); +void set_constraint_target(struct bConstraint *con, struct Object *ob, char *subtarget); /* Constraint target/owner types */ diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 845cb618638..64b3c9f7ca6 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -791,11 +791,15 @@ static void initialize_posechain(struct Object *ob, bPoseChannel *pchan_tip) /* Find the chain's root & count the segments needed */ for (curchan = pchan_tip; curchan; curchan=curchan->parent){ pchan_root = curchan; - /* tip is not in the chain */ - if (curchan!=pchan_tip){ - chanlist[segcount]=curchan; - segcount++; + + chanlist[segcount]=curchan; + segcount++; + + /* exclude tip from chain? */ + if(curchan==pchan_tip) { + if(!(data->flag & CONSTRAINT_IK_TIP)) segcount--; } + if(segcount>255) break; // also weak if (!(curchan->bone->flag & BONE_IK_TOPARENT)) diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index 13e1114078c..e3b0263de51 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -92,10 +92,9 @@ void free_constraints (ListBase *conlist) bConstraint *con; /* Do any specific freeing */ - for (con=conlist->first; con; con=con->next) - { + for (con=conlist->first; con; con=con->next) { free_constraint_data (con); - }; + } /* Free the whole list */ BLI_freelistN(conlist); @@ -374,7 +373,7 @@ Object *get_constraint_target(bConstraint *con, char **subtarget) return NULL; } -void set_constraint_target(bConstraint *con, Object *ob) +void set_constraint_target(bConstraint *con, Object *ob, char *subtarget) { /* * Set the target for this constraint @@ -384,36 +383,42 @@ void set_constraint_target(bConstraint *con, Object *ob) { bActionConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_LOCLIKE: { bLocateLikeConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_ROTLIKE: { bRotateLikeConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_KINEMATIC: { bKinematicConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_TRACKTO: { bTrackToConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_LOCKTRACK: { bLockTrackConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; case CONSTRAINT_TYPE_FOLLOWPATH: @@ -426,6 +431,7 @@ void set_constraint_target(bConstraint *con, Object *ob) { bStretchToConstraint *data = con->data; data->tar= ob; + if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32); } break; } @@ -488,7 +494,8 @@ void *new_constraint_data (short type) data->tolerance = (float)0.001; data->iterations = 500; - + data->flag= CONSTRAINT_IK_TIP; + result = data; } break; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 87e0a0c95c4..c2a3ab49c32 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -322,7 +322,7 @@ void unlink_object(Object *ob) for(pchan= obt->pose->chanbase.first; pchan; pchan= pchan->next) { for (con = pchan->constraints.first; con; con=con->next) { if(ob==get_constraint_target(con, &str)) { - set_constraint_target(con, NULL); + set_constraint_target(con, NULL, NULL); obt->recalc |= OB_RECALC_DATA; } } @@ -333,7 +333,7 @@ void unlink_object(Object *ob) for (con = obt->constraints.first; con; con=con->next) { if(ob==get_constraint_target(con, &str)) { - set_constraint_target(con, NULL); + set_constraint_target(con, NULL, NULL); obt->recalc |= OB_RECALC_OB; } } |