[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12737] trunk/blender/source/blender: Two fixes:
Ton Roosendaal
ton at blender.org
Sat Dec 1 11:48:34 CET 2007
Revision: 12737
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12737
Author: ton
Date: 2007-12-01 11:48:33 +0100 (Sat, 01 Dec 2007)
Log Message:
-----------
Two fixes:
- new option for Local Constraint Ipos did not set user counter in
Ipo at file reading, causing data to get lost (not saved).
- Driver feature: the channels "Loc X Y Z" now also use the result
of constraints, but transformed back into local space, as if it
was action X Y Z. Nice stuff for those who understand this...
it means you can drive something with a bone that has constraints.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/ipo.c
trunk/blender/source/blender/blenloader/intern/readfile.c
Modified: trunk/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/ipo.c 2007-11-30 20:54:34 UTC (rev 12736)
+++ trunk/blender/source/blender/blenkernel/intern/ipo.c 2007-12-01 10:48:33 UTC (rev 12737)
@@ -758,44 +758,46 @@
}
}
-#define TFM_WITHOUT_BONE 1
-
-static void posechannel_get_local_transform(bPoseChannel *pchan, float *quat, float *eul, float *size, int flag)
+/* we need the local transform = current transform - (parent transform + bone transform) */
+/* (local transform is on action channel level) */
+static void posechannel_get_local_transform(bPoseChannel *pchan, float *loc, float *eul, float *size)
{
- float pose_mat[3][3];
- float diff_mat[3][3], ipar_mat[3][3];
+ float diff_mat[4][4];
+ float parmat[4][4], offs_bone[4][4], imat[4][4];
- /* we need the local transform = current transform - (parent transform + bone transform) */
-
- Mat3CpyMat4(pose_mat, pchan->pose_mat);
-
if (pchan->parent) {
+ /* get first the parent + bone transform in parmat */
- if(flag & TFM_WITHOUT_BONE) {
- float par_mat[3][3];
- Mat3CpyMat4(par_mat, pchan->parent->pose_mat);
- Mat3MulMat3(diff_mat, par_mat, pchan->bone->bone_mat);
- }
- else
- Mat3CpyMat4(diff_mat, pchan->parent->pose_mat);
-
- Mat3Inv(ipar_mat, diff_mat);
+ /* bone transform itself */
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+ /* The bone's root offset (is in the parent's coordinate system) */
+ VECCOPY(offs_bone[3], pchan->bone->head);
+ /* Get the length translation of parent (length along y axis) */
+ offs_bone[3][1]+= pchan->parent->bone->length;
+
+ Mat4MulSerie(parmat, pchan->parent->pose_mat, offs_bone, NULL, NULL, NULL, NULL, NULL, NULL);
+
+ /* invert it */
+ Mat4Invert(imat, parmat);
}
else {
- if(flag & TFM_WITHOUT_BONE)
- Mat3Inv(ipar_mat, pchan->bone->bone_mat);
- else
- Mat3One(ipar_mat);
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+
+ /* invert it */
+ Mat4Invert(imat, offs_bone);
+
}
- Mat3MulMat3(diff_mat, ipar_mat, pose_mat);
+ /* difference: current transform - (parent transform + bone transform) */
+ Mat4MulMat4(diff_mat, pchan->pose_mat, imat);
- if(quat)
- Mat3ToQuat(diff_mat, quat);
+ if(loc)
+ VECCOPY(loc, diff_mat[3]);
if(eul)
- Mat3ToEul(diff_mat, eul);
+ Mat4ToEul(diff_mat, eul);
if(size)
- Mat3ToSize(diff_mat, size);
+ Mat4ToSize(diff_mat, size);
+
}
/* has to return a float value */
@@ -858,8 +860,6 @@
Mat4ToQuat(pchan->pose_mat, q1);
Mat4ToQuat(pchan2->pose_mat, q2);
- // posechannel_get_local_transform(pchan , q1, NULL, NULL, 0);
- // posechannel_get_local_transform(pchan2, q2, NULL, NULL, 0);
QuatInv(q1);
QuatMul(quat, q1, q2);
@@ -870,17 +870,17 @@
}
}
else {
- float eul[3], size[3];
+ float loc[3], eul[3], size[3];
- posechannel_get_local_transform(pchan, NULL, eul, size, TFM_WITHOUT_BONE);
+ posechannel_get_local_transform(pchan, loc, eul, size);
switch(driver->adrcode) {
case OB_LOC_X:
- return pchan->loc[0];
+ return loc[0];
case OB_LOC_Y:
- return pchan->loc[1];
+ return loc[1];
case OB_LOC_Z:
- return pchan->loc[2];
+ return loc[2];
case OB_ROT_X:
return eul[0]/(M_PI_2/9.0);
case OB_ROT_Y:
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2007-11-30 20:54:34 UTC (rev 12736)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2007-12-01 10:48:33 UTC (rev 12737)
@@ -1622,7 +1622,7 @@
con->type= CONSTRAINT_TYPE_NULL;
}
/* own ipo, all constraints have it */
- con->ipo= newlibadr(fd, id->lib, con->ipo);
+ con->ipo= newlibadr_us(fd, id->lib, con->ipo);
switch (con->type) {
case CONSTRAINT_TYPE_PYTHON:
More information about the Bf-blender-cvs
mailing list