[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30957] trunk/blender/source/blender: python mathutils change

Campbell Barton ideasman42 at gmail.com
Mon Aug 2 02:08:01 CEST 2010


Revision: 30957
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30957
Author:   campbellbarton
Date:     2010-08-02 02:08:01 +0200 (Mon, 02 Aug 2010)

Log Message:
-----------
python mathutils change
 quat * quat was returning the dot product (a float), rather then the cross product.
 Use BLI_math's mul_qt_qtqt() function.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_math_rotation.h
    trunk/blender/source/blender/blenlib/intern/math_rotation.c
    trunk/blender/source/blender/python/generic/mathutils.c
    trunk/blender/source/blender/python/generic/mathutils.h
    trunk/blender/source/blender/python/generic/mathutils_quat.c
    trunk/blender/source/blender/python/generic/mathutils_vector.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_rotation.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_rotation.h	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/blenlib/BLI_math_rotation.h	2010-08-02 00:08:01 UTC (rev 30957)
@@ -44,9 +44,9 @@
 
 /* arithmetic */
 void mul_qt_qtqt(float q[4], const float a[4], const float b[4]);
-void mul_qt_v3(float q[4], float r[3]);
-void mul_qt_fl(float q[4], float f);
-void mul_fac_qt_fl(float q[4], float f);
+void mul_qt_v3(const float q[4], float r[3]);
+void mul_qt_fl(float q[4], const float f);
+void mul_fac_qt_fl(float q[4], const float f);
 
 void sub_qt_qtqt(float q[4], float a[4], float b[4]);
 

Modified: trunk/blender/source/blender/blenlib/intern/math_rotation.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_rotation.c	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/blenlib/intern/math_rotation.c	2010-08-02 00:08:01 UTC (rev 30957)
@@ -63,7 +63,7 @@
 }
 
 /* Assumes a unit quaternion */
-void mul_qt_v3(float *q, float *v)
+void mul_qt_v3(const float *q, float *v)
 {
 	float t0, t1, t2;
 
@@ -111,7 +111,7 @@
 }
 
 /* simple mult */
-void mul_qt_fl(float *q, float f)
+void mul_qt_fl(float *q, const float f)
 {
 	q[0] *= f;
 	q[1] *= f;
@@ -127,7 +127,7 @@
 }
 
 /* angular mult factor */
-void mul_fac_qt_fl(float *q, float fac)
+void mul_fac_qt_fl(float *q, const float fac)
 {
 	float angle= fac*saacos(q[0]);	/* quat[0]= cos(0.5*angle), but now the 0.5 and 2.0 rule out */
 	

Modified: trunk/blender/source/blender/python/generic/mathutils.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils.c	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/python/generic/mathutils.c	2010-08-02 00:08:01 UTC (rev 30957)
@@ -44,6 +44,7 @@
  * - toEuler --> to_euler
  * - toQuat --> to_quat
  * - Vector.toTrackQuat --> Vector.to_track_quat
+ * - Quaternion * Quaternion --> cross product (not dot product)
  *
  * Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
  */
@@ -92,74 +93,6 @@
 	return size;
 }
 
-//-----------------------------METHODS----------------------------
-//-----------------quat_rotation (internal)-----------
-//This function multiplies a vector/point * quat or vice versa
-//to rotate the point/vector by the quaternion
-//arguments should all be 3D
-PyObject *quat_rotation(PyObject *arg1, PyObject *arg2)
-{
-	float rot[3];
-	QuaternionObject *quat = NULL;
-	VectorObject *vec = NULL;
-
-	if(QuaternionObject_Check(arg1)){
-		quat = (QuaternionObject*)arg1;
-		if(!BaseMath_ReadCallback(quat))
-			return NULL;
-
-		if(VectorObject_Check(arg2)){
-			vec = (VectorObject*)arg2;
-			
-			if(!BaseMath_ReadCallback(vec))
-				return NULL;
-			
-			rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - 
-				2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] + 
-				2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] - 
-				quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0];
-			rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] + 
-				2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] - 
-				quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] - 
-				2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1];
-			rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] + 
-				quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] - 
-				quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] - 
-				quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
-			return newVectorObject(rot, 3, Py_NEW, NULL);
-		}
-	}else if(VectorObject_Check(arg1)){
-		vec = (VectorObject*)arg1;
-		
-		if(!BaseMath_ReadCallback(vec))
-			return NULL;
-		
-		if(QuaternionObject_Check(arg2)){
-			quat = (QuaternionObject*)arg2;
-			if(!BaseMath_ReadCallback(quat))
-				return NULL;
-
-			rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - 
-				2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] + 
-				2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] - 
-				quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0];
-			rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] + 
-				2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] - 
-				quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] - 
-				2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1];
-			rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] + 
-				quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] - 
-				quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] - 
-				quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
-			return newVectorObject(rot, 3, Py_NEW, NULL);
-		}
-	}
-
-	PyErr_SetString(PyExc_RuntimeError, "quat_rotation(internal): internal problem rotating vector/point\n");
-	return NULL;
-	
-}
-
 //----------------------------------MATRIX FUNCTIONS--------------------
 //----------------------------------mathutils.RotationMatrix() ----------
 //mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.

Modified: trunk/blender/source/blender/python/generic/mathutils.h
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils.h	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/python/generic/mathutils.h	2010-08-02 00:08:01 UTC (rev 30957)
@@ -63,8 +63,6 @@
 PyObject *Mathutils_Init(void);
 PyObject *Noise_Init(void); /* lazy, saves having own header */
 
-PyObject *quat_rotation(PyObject *arg1, PyObject *arg2);
-
 int EXPP_FloatsAreEqual(float A, float B, int floatSteps);
 int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
 

Modified: trunk/blender/source/blender/python/generic/mathutils_quat.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_quat.c	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/python/generic/mathutils_quat.c	2010-08-02 00:08:01 UTC (rev 30957)
@@ -660,8 +660,9 @@
 			return NULL;
 	}
 
-	if(quat1 && quat2) { /* QUAT*QUAT (dot product) */
-		return PyFloat_FromDouble(dot_qtqt(quat1->quat, quat2->quat));
+	if(quat1 && quat2) { /* QUAT*QUAT (cross product) */
+		mul_qt_qtqt(quat, quat1->quat, quat2->quat);
+		return newQuaternionObject(quat, Py_NEW, NULL);
 	}
 	
 	/* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
@@ -677,12 +678,19 @@
 	}
 	else { /* QUAT*SOMETHING */
 		if(VectorObject_Check(q2)){  /* QUAT*VEC */
+			float tvec[3];
 			vec = (VectorObject*)q2;
 			if(vec->size != 3){
 				PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: only 3D vector rotations currently supported\n");
 				return NULL;
 			}
-			return quat_rotation((PyObject*)quat1, (PyObject*)vec); /* vector updating done inside the func */
+			if(!BaseMath_ReadCallback(vec)) {
+				return NULL;
+			}
+
+			copy_v3_v3(tvec, vec->vec);
+			mul_qt_v3(quat1->quat, tvec);
+			return newVectorObject(tvec, 3, Py_NEW, NULL);
 		}
 		
 		scalar= PyFloat_AsDouble(q2);

Modified: trunk/blender/source/blender/python/generic/mathutils_vector.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_vector.c	2010-08-01 23:37:52 UTC (rev 30956)
+++ trunk/blender/source/blender/python/generic/mathutils_vector.c	2010-08-02 00:08:01 UTC (rev 30957)
@@ -1010,13 +1010,20 @@
 		/* VEC * MATRIX */
 		return row_vector_multiplication(vec1, (MatrixObject*)v2);
 	} else if (QuaternionObject_Check(v2)) {
-		QuaternionObject *quat = (QuaternionObject*)v2; /* quat_rotation validates */
+		/* VEC * QUAT */
+		QuaternionObject *quat2 = (QuaternionObject*)v2;
+		float tvec[4];
 
 		if(vec1->size != 3) {
 			PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported\n");
 			return NULL;
 		}
-		return quat_rotation((PyObject*)vec1, (PyObject*)quat);
+		if(!BaseMath_ReadCallback(quat2)) {
+			return NULL;
+		}
+		copy_v3_v3(tvec, vec1->vec);
+		mul_qt_v3(quat2->quat, tvec);
+		return newVectorObject(tvec, 3, Py_NEW, NULL);
 	}
 	else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
 		int i;





More information about the Bf-blender-cvs mailing list