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.
This commit is contained in:
parent
e3fd60b182
commit
fa7ace2215
Notes:
blender-bot
2023-05-22 12:40:41 +02:00
Referenced by issue #85734, Vector Math Bug.
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue