[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23029] branches/blender2.5/blender/source /blender: 2.5 Anim Bugfixes:

Joshua Leung aligorith at gmail.com
Sun Sep 6 09:22:32 CEST 2009


Revision: 23029
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23029
Author:   aligorith
Date:     2009-09-06 09:22:32 +0200 (Sun, 06 Sep 2009)

Log Message:
-----------
2.5 Anim Bugfixes:

* Rotation order code should be more correct now. Previously was only shuffling axes, and was also doing some evil things to provided that that it shouldn't have been doing, which was causing some flipping issues.

* Built-in keyingsets for 'visual' options should now be more correct. The old code had typos, giving wrong array indices to start from.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
    branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c
    branches/blender2.5/blender/source/blender/editors/transform/transform.c

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-06 06:47:59 UTC (rev 23028)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-06 07:22:32 UTC (rev 23029)
@@ -2835,9 +2835,9 @@
 	double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
 	double a[3];
 	
-	if (R->parity) e[1] = -e[1];
+	if (R->parity) e[1] = -e[1]; // xxx watch it!
 	
-	ti = e[0]/2; tj = e[1]/2; th = e[2]/2;
+	ti = e[i]/2; tj = e[j]/2; th = e[k]/2;
 	
 	ci = cos(ti);  cj = cos(tj);  ch = cos(th);
 	si = sin(ti);  sj = sin(tj);  sh = sin(th);
@@ -2874,13 +2874,12 @@
 	double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
 	
 	if (R->parity) {
-		e[0] = -e[0]; 
-		e[1] = -e[1]; 
-		e[2] = -e[2];
+		ti = -e[i];	  tj = -e[j];	th = -e[k];
 	}
+	else {
+		ti = e[i];	  tj = e[j];	th = e[k];
+	}
 	
-	ti = e[0];	  tj = e[1];	th = e[2];
-	
 	ci = cos(ti); cj = cos(tj); ch = cos(th);
 	si = sin(ti); sj = sin(tj); sh = sin(th);
 	
@@ -2908,17 +2907,17 @@
 {
 	RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
 	short i=R->i,  j=R->j, 	k=R->k;
-	double cy = sqrt(M[i][i]*M[i][i] + M[j][i]*M[j][i]);
+	double cy = sqrt(M[i][i]*M[i][i] + M[i][j]*M[i][j]);
 	
 	if (cy > 16*FLT_EPSILON) {
-		e[0] = atan2(M[j][k], M[k][k]);
-		e[1] = atan2(-M[i][k], cy);
-		e[2] = atan2(M[i][j], M[i][i]);
+		e[i] = atan2(M[j][k], M[k][k]);
+		e[j] = atan2(-M[i][k], cy);
+		e[k] = atan2(M[i][j], M[i][i]);
 	} 
 	else {
-		e[0] = atan2(-M[k][j], M[j][j]);
-		e[1] = atan2(-M[i][k], cy);
-		e[2] = 0;
+		e[i] = atan2(-M[k][j], M[j][j]);
+		e[j] = atan2(-M[i][k], cy);
+		e[k] = 0;
 	}
 	
 	if (R->parity) {
@@ -2944,21 +2943,28 @@
 {
 	RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
 	short i=R->i,  j=R->j, 	k=R->k;
-	double cy = sqrt(M[i][i]*M[i][i] + M[j][i]*M[j][i]);
+	float m[3][3];
+	double cy;
 	
+	/* process the matrix first */
+	Mat3CpyMat3(m, M);
+	Mat3Ortho(m);
+	
+	cy= sqrt(m[i][i]*m[i][i] + m[i][j]*m[i][j]);
+	
 	if (cy > 16*FLT_EPSILON) {
-		e1[0] = atan2(M[j][k], M[k][k]);
-		e1[1] = atan2(-M[i][k], cy);
-		e1[2] = atan2(M[i][j], M[i][i]);
+		e1[i] = atan2(m[j][k], m[k][k]);
+		e1[j] = atan2(-m[i][k], cy);
+		e1[k] = atan2(m[i][j], m[i][i]);
 		
-		e2[0] = atan2(-M[j][k], -M[k][k]);
-		e2[1] = atan2(-M[i][k], -cy);
-		e2[2] = atan2(-M[i][j], -M[i][i]);
+		e2[i] = atan2(-m[j][k], -m[k][k]);
+		e2[j] = atan2(-m[i][k], -cy);
+		e2[k] = atan2(-m[i][j], -m[i][i]);
 	} 
 	else {
-		e1[0] = atan2(-M[k][j], M[j][j]);
-		e1[1] = atan2(-M[i][k], cy);
-		e1[2] = 0;
+		e1[i] = atan2(-m[k][j], m[j][j]);
+		e1[j] = atan2(-m[i][k], cy);
+		e1[k] = 0;
 		
 		VecCopyf(e2, e1);
 	}
@@ -2975,7 +2981,6 @@
 }
 
 /* uses 2 methods to retrieve eulers, and picks the closest */
-// FIXME: this does not work well with the other rotation modes...
 void Mat3ToCompatibleEulO(float mat[3][3], float eul[3], float oldrot[3], short order)
 {
 	float eul1[3], eul2[3];

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c	2009-09-06 06:47:59 UTC (rev 23028)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyingsets.c	2009-09-06 07:22:32 UTC (rev 23029)
@@ -801,24 +801,24 @@
 	
 	/* Keying Sets with Keying Flags ************************* */
 	/* Keying Set - "VisualLoc" ---------- */
-	BI_KS_DEFINE_BEGIN("VisualLoc", 0)
+	BI_KS_DEFINE_BEGIN("VisualLoc", INSERTKEY_MATRIX)
 		BI_KS_PATHS_BEGIN(1)
-			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
+			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
 		BI_KS_PATHS_END
 	BI_KS_DEFINE_END,
 
 	/* Keying Set - "Rotation" ---------- */
-	BI_KS_DEFINE_BEGIN("VisualRot", 0)
+	BI_KS_DEFINE_BEGIN("VisualRot", INSERTKEY_MATRIX)
 		BI_KS_PATHS_BEGIN(1)
-			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
+			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
 		BI_KS_PATHS_END
 	BI_KS_DEFINE_END,
 	
 	/* Keying Set - "VisualLocRot" ---------- */
-	BI_KS_DEFINE_BEGIN("VisualLocRot", 0)
+	BI_KS_DEFINE_BEGIN("VisualLocRot", INSERTKEY_MATRIX)
 		BI_KS_PATHS_BEGIN(2)
-			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), 
-			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
+			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), 
+			BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) 
 		BI_KS_PATHS_END
 	BI_KS_DEFINE_END
 };

Modified: branches/blender2.5/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform.c	2009-09-06 06:47:59 UTC (rev 23028)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform.c	2009-09-06 07:22:32 UTC (rev 23029)
@@ -1738,12 +1738,12 @@
 			eul[1]= tdi->roty[0];
 			eul[2]= tdi->rotz[0];
 
-			EulToMat4(eul, cob.matrix);
+			EulOToMat4(eul, td->rotOrder, cob.matrix);
 		}
 		else {
 			/* eulers */
 			if (td->ext)
-				EulToMat4(td->ext->rot, cob.matrix);
+				EulOToMat4(td->ext->rot, td->rotOrder, cob.matrix);
 			else
 				return;
 		}
@@ -1796,7 +1796,7 @@
 			TransDataIpokey *tdi= td->tdi;
 			float eul[3];
 
-			Mat4ToEul(cob.matrix, eul);
+			Mat4ToEulO(cob.matrix, eul, td->rotOrder);
 
 			tdi->rotx[0]= eul[0];
 			tdi->roty[0]= eul[1];
@@ -1804,7 +1804,7 @@
 		}
 		else {
 			/* eulers */
-			Mat4ToEul(cob.matrix, td->ext->rot);
+			Mat4ToEulO(cob.matrix, td->ext->rot, td->rotOrder);
 		}
 	}
 }





More information about the Bf-blender-cvs mailing list