[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21977] branches/itasc/source/blender/ ikplugin/intern/itasc_plugin.cpp: iTaSC: support multiple IK constraint on same bone + Wahonney namespace patch.
Benoit Bolsee
benoit.bolsee at online.be
Tue Jul 28 19:12:20 CEST 2009
Revision: 21977
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21977
Author: ben2610
Date: 2009-07-28 19:12:20 +0200 (Tue, 28 Jul 2009)
Log Message:
-----------
iTaSC: support multiple IK constraint on same bone + Wahonney namespace patch.
Modified Paths:
--------------
branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp
Modified: branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp
===================================================================
--- branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp 2009-07-28 16:56:22 UTC (rev 21976)
+++ branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp 2009-07-28 17:12:20 UTC (rev 21977)
@@ -182,26 +182,15 @@
IK_TRANS_Z = 5
};
-int initialize_scene(Object *ob, bPoseChannel *pchan_tip)
+static int initialize_chain(Object *ob, bPoseChannel *pchan_tip, bConstraint *con)
{
bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
PoseTree *tree;
PoseTarget *target;
- bConstraint *con;
bKinematicConstraint *data;
int a, segcount= 0, size, newsize, *oldparent, parent, rootbone, treecount;
- /* find IK constraint, and validate it */
- for(con= (bConstraint *)pchan_tip->constraints.first; con; con= (bConstraint *)con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
- data=(bKinematicConstraint*)con->data;
- if (data->flag & CONSTRAINT_IK_AUTO) break;
- if (data->tar==NULL) continue;
- if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
- if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) break;
- }
- }
- if(con==NULL) return 0;
+ data=(bKinematicConstraint*)con->data;
/* exclude tip from chain? */
if(!(data->flag & CONSTRAINT_IK_TIP))
@@ -314,6 +303,35 @@
return treecount;
}
+int initialize_scene(Object *ob, bPoseChannel *pchan_tip)
+{
+ bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
+ PoseTree *tree;
+ PoseTarget *target;
+ bConstraint *con;
+ bKinematicConstraint *data;
+ int a, segcount= 0, size, newsize, *oldparent, parent, rootbone, treecount;
+
+ /* find all IK constraints and validate them */
+ treecount = 0;
+ for(con= (bConstraint *)pchan_tip->constraints.first; con; con= (bConstraint *)con->next) {
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ data=(bKinematicConstraint*)con->data;
+ if (data->flag & CONSTRAINT_IK_AUTO) {
+ treecount += initialize_chain(ob, pchan_tip, con);
+ continue;
+ }
+ if (data->tar==NULL) continue;
+ if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
+ treecount += initialize_chain(ob, pchan_tip, con);
+ continue;
+ }
+ }
+ }
+ return treecount;
+}
+
static IK_Data* get_ikdata(bPose *pose)
{
if (pose->ikdata)
@@ -328,15 +346,15 @@
}
static double EulerAngleFromMatrix(const KDL::Rotation& R, int axis)
{
- double t = sqrt(R(0,0)*R(0,0) + R(0,1)*R(0,1));
+ double t = KDL::sqrt(R(0,0)*R(0,0) + R(0,1)*R(0,1));
if (t > 16.0*KDL::epsilon) {
- if (axis == 0) return -atan2(R(1,2), R(2,2));
- else if(axis == 1) return atan2(-R(0,2), t);
- else return -atan2(R(0,1), R(0,0));
+ if (axis == 0) return -KDL::atan2(R(1,2), R(2,2));
+ else if(axis == 1) return KDL::atan2(-R(0,2), t);
+ else return -KDL::atan2(R(0,1), R(0,0));
} else {
- if (axis == 0) return -atan2(-R(2,1), R(1,1));
- else if(axis == 1) return atan2(-R(0,2), t);
+ if (axis == 0) return -KDL::atan2(-R(2,1), R(1,1));
+ else if(axis == 1) return KDL::atan2(-R(0,2), t);
else return 0.0f;
}
}
@@ -347,7 +365,7 @@
double qy = R(0,2) - R(2,0);
double qw = R(0,0) + R(1,1) + R(2,2) + 1;
- double tau = 2*atan2(qy, qw);
+ double tau = 2*KDL::atan2(qy, qw);
return tau;
}
@@ -381,7 +399,7 @@
Y = 0.0 ;
} else {
X = KDL::atan2(R(2,1), R(1,1));
- Z = KDL::atan2(-R(0,1), sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,2))));
+ Z = KDL::atan2(-R(0,1), KDL::sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,2))));
Y = KDL::atan2(R(0,2), R(0,0));
}
}
@@ -394,7 +412,7 @@
Z = 0.0 ;
} else {
X = KDL::atan2(-R(1,2), R(2,2));
- Y = KDL::atan2(R(0,2), sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,1))));
+ Y = KDL::atan2(R(0,2), KDL::sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,1))));
Z = KDL::atan2(-R(0,1), R(0,0));
}
}
More information about the Bf-blender-cvs
mailing list