[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22927] branches/blender2.5/blender/source /blender/blenlib/intern/arithb.c: 2.5 - Code shuffling in arithb.c

Joshua Leung aligorith at gmail.com
Tue Sep 1 08:48:41 CEST 2009


Revision: 22927
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22927
Author:   aligorith
Date:     2009-09-01 08:48:40 +0200 (Tue, 01 Sep 2009)

Log Message:
-----------
2.5 - Code shuffling in arithb.c 

* Moved all the euler-rotation functions so that they were near each other in the file.

* Tagged all functions relevant to axis-angle rotations 

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-01 01:09:05 UTC (rev 22926)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-01 06:48:40 UTC (rev 22927)
@@ -1610,7 +1610,7 @@
 }
 
 /* A & M Watt, Advanced animation and rendering techniques, 1992 ACM press */
-void QuatInterpolW(float *, float *, float *, float );
+void QuatInterpolW(float *, float *, float *, float ); // XXX why this?
 
 void QuatInterpolW(float *result, float *quat1, float *quat2, float t)
 {
@@ -2943,6 +2943,112 @@
 	quat[3] = cj*cs - sj*sc;
 }
 
+void euler_rot(float *beul, float ang, char axis)
+{
+	float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
+	
+	eul[0]= eul[1]= eul[2]= 0.0f;
+	if(axis=='x') eul[0]= ang;
+	else if(axis=='y') eul[1]= ang;
+	else eul[2]= ang;
+	
+	EulToMat3(eul, mat1);
+	EulToMat3(beul, mat2);
+	
+	Mat3MulMat3(totmat, mat2, mat1);
+	
+	Mat3ToEul(totmat, beul);
+	
+}
+
+/* exported to transform.c */
+void compatible_eul(float *eul, float *oldrot)
+{
+	float dx, dy, dz;
+	
+	/* correct differences of about 360 degrees first */
+	dx= eul[0] - oldrot[0];
+	dy= eul[1] - oldrot[1];
+	dz= eul[2] - oldrot[2];
+	
+	while(fabs(dx) > 5.1) {
+		if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
+		dx= eul[0] - oldrot[0];
+	}
+	while(fabs(dy) > 5.1) {
+		if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
+		dy= eul[1] - oldrot[1];
+	}
+	while(fabs(dz) > 5.1) {
+		if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
+		dz= eul[2] - oldrot[2];
+	}
+	
+	/* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */	
+	if( fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6 ) {
+		if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
+	}
+	if( fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6 ) {
+		if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
+	}
+	if( fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6 ) {
+		if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
+	}
+	
+	/* the method below was there from ancient days... but why! probably because the code sucks :)
+		*/
+#if 0	
+	/* calc again */
+	dx= eul[0] - oldrot[0];
+	dy= eul[1] - oldrot[1];
+	dz= eul[2] - oldrot[2];
+	
+	/* special case, tested for x-z  */
+	
+	if( (fabs(dx) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dz) > 3.1 ) ) {
+		if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
+		if(eul[1] > 0.0) eul[1]= M_PI - eul[1]; else eul[1]= -M_PI - eul[1];
+		if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
+		
+	}
+	else if( (fabs(dx) > 3.1 && fabs(dy) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dy) > 3.1 ) ) {
+		if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
+		if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
+		if(eul[2] > 0.0) eul[2]= M_PI - eul[2]; else eul[2]= -M_PI - eul[2];
+	}
+	else if( (fabs(dy) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dy) > 1.5 && fabs(dz) > 3.1 ) ) {
+		if(eul[0] > 0.0) eul[0]= M_PI - eul[0]; else eul[0]= -M_PI - eul[0];
+		if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
+		if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
+	}
+#endif	
+}
+
+/* uses 2 methods to retrieve eulers, and picks the closest */
+void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot)
+{
+	float eul1[3], eul2[3];
+	float d1, d2;
+	
+	mat3_to_eul2(mat, eul1, eul2);
+	
+	compatible_eul(eul1, oldrot);
+	compatible_eul(eul2, oldrot);
+	
+	d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]);
+	d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]);
+	
+	/* return best, which is just the one with lowest difference */
+	if( d1 > d2) {
+		VecCopyf(eul, eul2);
+	}
+	else {
+		VecCopyf(eul, eul1);
+	}
+	
+}
+
+/* axis angle to 3x3 matrix */
 void VecRotToMat3(float *vec, float phi, float mat[][3])
 {
 	/* rotation of phi radials around vec */
@@ -2969,6 +3075,7 @@
 	
 }
 
+/* axis angle to 4x4 matrix */
 void VecRotToMat4(float *vec, float phi, float mat[][4])
 {
 	float tmat[3][3];
@@ -2978,6 +3085,7 @@
 	Mat4CpyMat3(mat, tmat);
 }
 
+/* axis angle to quaternion */
 void VecRotToQuat(float *vec, float phi, float *quat)
 {
 	/* rotation of phi radials around vec */
@@ -3074,111 +3182,6 @@
 		return 2.0f*(float)saasin(Vec2Lenf(v2, v1)/2.0f);
 }
 
-void euler_rot(float *beul, float ang, char axis)
-{
-	float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-	
-	eul[0]= eul[1]= eul[2]= 0.0f;
-	if(axis=='x') eul[0]= ang;
-	else if(axis=='y') eul[1]= ang;
-	else eul[2]= ang;
-	
-	EulToMat3(eul, mat1);
-	EulToMat3(beul, mat2);
-	
-	Mat3MulMat3(totmat, mat2, mat1);
-	
-	Mat3ToEul(totmat, beul);
-	
-}
-
-/* exported to transform.c */
-void compatible_eul(float *eul, float *oldrot)
-{
-	float dx, dy, dz;
-	
-	/* correct differences of about 360 degrees first */
-	dx= eul[0] - oldrot[0];
-	dy= eul[1] - oldrot[1];
-	dz= eul[2] - oldrot[2];
-	
-	while(fabs(dx) > 5.1) {
-		if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
-		dx= eul[0] - oldrot[0];
-	}
-	while(fabs(dy) > 5.1) {
-		if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
-		dy= eul[1] - oldrot[1];
-	}
-	while(fabs(dz) > 5.1) {
-		if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
-		dz= eul[2] - oldrot[2];
-	}
-	
-	/* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */	
-	if( fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6 ) {
-		if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
-	}
-	if( fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6 ) {
-		if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
-	}
-	if( fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6 ) {
-		if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
-	}
-	
-	/* the method below was there from ancient days... but why! probably because the code sucks :)
-		*/
-#if 0	
-	/* calc again */
-	dx= eul[0] - oldrot[0];
-	dy= eul[1] - oldrot[1];
-	dz= eul[2] - oldrot[2];
-	
-	/* special case, tested for x-z  */
-	
-	if( (fabs(dx) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dz) > 3.1 ) ) {
-		if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
-		if(eul[1] > 0.0) eul[1]= M_PI - eul[1]; else eul[1]= -M_PI - eul[1];
-		if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
-		
-	}
-	else if( (fabs(dx) > 3.1 && fabs(dy) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dy) > 3.1 ) ) {
-		if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
-		if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
-		if(eul[2] > 0.0) eul[2]= M_PI - eul[2]; else eul[2]= -M_PI - eul[2];
-	}
-	else if( (fabs(dy) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dy) > 1.5 && fabs(dz) > 3.1 ) ) {
-		if(eul[0] > 0.0) eul[0]= M_PI - eul[0]; else eul[0]= -M_PI - eul[0];
-		if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
-		if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
-	}
-#endif	
-}
-
-/* uses 2 methods to retrieve eulers, and picks the closest */
-void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot)
-{
-	float eul1[3], eul2[3];
-	float d1, d2;
-	
-	mat3_to_eul2(mat, eul1, eul2);
-	
-	compatible_eul(eul1, oldrot);
-	compatible_eul(eul2, oldrot);
-	
-	d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]);
-	d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]);
-	
-	/* return best, which is just the one with lowest difference */
-	if( d1 > d2) {
-		VecCopyf(eul, eul2);
-	}
-	else {
-		VecCopyf(eul, eul1);
-	}
-	
-}
-
 /* ******************************************** */
 
 void SizeToMat3( float *size, float mat[][3])
@@ -4745,6 +4748,8 @@
 	mat[3][2] = loc[2];
 }
 
+/********************************************************/
+
 /* Tangents */
 
 /* For normal map tangents we need to detect uv boundaries, and only average





More information about the Bf-blender-cvs mailing list