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:
authorTon Roosendaal <ton@blender.org>2005-07-24 15:36:05 +0400
committerTon Roosendaal <ton@blender.org>2005-07-24 15:36:05 +0400
commit4d273d8d5b9eb471f82ee49819905eedb68d6a4f (patch)
treec27fb4ba1f2dff92f75e998d8c03dd9ad627053a /source/blender/blenkernel
parent1d27a7676b261cd5eecde5828a396398376f6af1 (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.h2
-rw-r--r--source/blender/blenkernel/intern/armature.c12
-rw-r--r--source/blender/blenkernel/intern/constraint.c17
-rw-r--r--source/blender/blenkernel/intern/object.c4
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;
}
}