[Bf-blender-cvs] [fa7ace22158] master: PyAPI: support element multiplication for vector, matrix, quaternions

Campbell Barton noreply at git.blender.org
Tue Jul 14 14:54:38 CEST 2020


Commit: fa7ace221584be4dfd8c897a1c6b74209fed4415
Author: Campbell Barton
Date:   Tue Jul 14 22:45:33 2020 +1000
Branches: master
https://developer.blender.org/rBfa7ace221584be4dfd8c897a1c6b74209fed4415

PyAPI: support element multiplication for vector, matrix, quaternions

This was disabled during 2.8x for smooth porting of 2.7x scripts,

Now '@' is used for matrix multiplication,
support '*' to multiple vector elements.

See T56276.

===================================================================

M	source/blender/python/mathutils/mathutils_Matrix.c
M	source/blender/python/mathutils/mathutils_Quaternion.c
M	source/blender/python/mathutils/mathutils_Vector.c

===================================================================

diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 63137e094b7..3e30c81c8c6 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -2526,7 +2526,6 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
   }
 
   if (mat1 && mat2) {
-#ifdef USE_MATHUTILS_ELEM_MUL
     /* MATRIX * MATRIX */
     float mat[MATRIX_MAX_DIM * MATRIX_MAX_DIM];
 
@@ -2540,7 +2539,6 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
     mul_vn_vnvn(mat, mat1->matrix, mat2->matrix, mat1->num_col * mat1->num_row);
 
     return Matrix_CreatePyObject(mat, mat2->num_col, mat1->num_row, Py_TYPE(mat1));
-#endif
   }
   else if (mat2) {
     /*FLOAT/INT * MATRIX */
@@ -2584,7 +2582,6 @@ static PyObject *Matrix_imul(PyObject *m1, PyObject *m2)
   }
 
   if (mat1 && mat2) {
-#ifdef USE_MATHUTILS_ELEM_MUL
     /* MATRIX *= MATRIX */
     if ((mat1->num_row != mat2->num_row) || (mat1->num_col != mat2->num_col)) {
       PyErr_SetString(PyExc_ValueError,
@@ -2594,14 +2591,6 @@ static PyObject *Matrix_imul(PyObject *m1, PyObject *m2)
     }
 
     mul_vn_vn(mat1->matrix, mat2->matrix, mat1->num_col * mat1->num_row);
-#else
-    PyErr_Format(PyExc_TypeError,
-                 "In place element-wise multiplication: "
-                 "not supported between '%.200s' and '%.200s' types",
-                 Py_TYPE(m1)->tp_name,
-                 Py_TYPE(m2)->tp_name);
-    return NULL;
-#endif
   }
   else if (mat1 && (((scalar = PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred()) == 0)) {
     /* MATRIX *= FLOAT/INT */
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 7ce0ea5f249..2b7761b7678 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -962,11 +962,9 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
   }
 
   if (quat1 && quat2) { /* QUAT * QUAT (element-wise product) */
-#ifdef USE_MATHUTILS_ELEM_MUL
     float quat[QUAT_SIZE];
     mul_vn_vnvn(quat, quat1->quat, quat2->quat, QUAT_SIZE);
     return Quaternion_CreatePyObject(quat, Py_TYPE(q1));
-#endif
   }
   /* the only case this can happen (for a supported type is "FLOAT * QUAT") */
   else if (quat2) { /* FLOAT * QUAT */
@@ -1007,17 +1005,8 @@ static PyObject *Quaternion_imul(PyObject *q1, PyObject *q2)
     }
   }
 
-  if (quat1 && quat2) { /* QUAT *= QUAT (inplace element-wise product) */
-#ifdef USE_MATHUTILS_ELEM_MUL
+  if (quat1 && quat2) { /* QUAT *= QUAT (in-place element-wise product). */
     mul_vn_vn(quat1->quat, quat2->quat, QUAT_SIZE);
-#else
-    PyErr_Format(PyExc_TypeError,
-                 "In place element-wise multiplication: "
-                 "not supported between '%.200s' and '%.200s' types",
-                 Py_TYPE(q1)->tp_name,
-                 Py_TYPE(q2)->tp_name);
-    return NULL;
-#endif
   }
   else if (quat1 && (((scalar = PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred()) == 0)) {
     /* QUAT *= FLOAT */
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index 15ae811fd91..4b47440a530 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -1738,7 +1738,7 @@ static PyObject *vector_mul_float(VectorObject *vec, const float scalar)
   mul_vn_vn_fl(tvec, vec->vec, vec->size, scalar);
   return Vector_CreatePyObject_alloc(tvec, vec->size, Py_TYPE(vec));
 }
-#ifdef USE_MATHUTILS_ELEM_MUL
+
 static PyObject *vector_mul_vec(VectorObject *vec1, VectorObject *vec2)
 {
   float *tvec = PyMem_Malloc(vec1->size * sizeof(float));
@@ -1752,7 +1752,7 @@ static PyObject *vector_mul_vec(VectorObject *vec1, VectorObject *vec2)
   mul_vn_vnvn(tvec, vec1->vec, vec2->vec, vec1->size);
   return Vector_CreatePyObject_alloc(tvec, vec1->size, Py_TYPE(vec1));
 }
-#endif
+
 static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
 {
   VectorObject *vec1 = NULL, *vec2 = NULL;
@@ -1775,7 +1775,6 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
 
   /* make sure v1 is always the vector */
   if (vec1 && vec2) {
-#ifdef USE_MATHUTILS_ELEM_MUL
     if (vec1->size != vec2->size) {
       PyErr_SetString(PyExc_ValueError,
                       "Vector multiplication: "
@@ -1785,7 +1784,6 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
 
     /* element-wise product */
     return vector_mul_vec(vec1, vec2);
-#endif
   }
   else if (vec1) {
     if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* VEC * FLOAT */
@@ -1832,7 +1830,6 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
   /* Intentionally don't support (Quaternion, Matrix) here, uses reverse order instead. */
 
   if (vec1 && vec2) {
-#ifdef USE_MATHUTILS_ELEM_MUL
     if (vec1->size != vec2->size) {
       PyErr_SetString(PyExc_ValueError,
                       "Vector multiplication: "
@@ -1840,16 +1837,8 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
       return NULL;
     }
 
-    /* element-wise product inplace */
+    /* Element-wise product in-place. */
     mul_vn_vn(vec1->vec, vec2->vec, vec1->size);
-#else
-    PyErr_Format(PyExc_TypeError,
-                 "In place element-wise multiplication: "
-                 "not supported between '%.200s' and '%.200s' types",
-                 Py_TYPE(v1)->tp_name,
-                 Py_TYPE(v2)->tp_name);
-    return NULL;
-#endif
   }
   else if (vec1 && (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) ==
                     0)) { /* VEC *= FLOAT */



More information about the Bf-blender-cvs mailing list