Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-12-23 04:51:54 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-12-23 04:51:54 +0400
commit3cce96320e9e7dcacfde7b92c110482500661f14 (patch)
treec90a106e9b640fe8fb09adc68c95d87eab3b6495 /source/gameengine/Ketsji/KX_PyMath.h
parentcb61a71ff66d2f29a60ac0407d9936c8c99c6a33 (diff)
recent matrix row/col swap broke matrix assignment in the BGE, fix provided by Andrew Hale
Diffstat (limited to 'source/gameengine/Ketsji/KX_PyMath.h')
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h49
1 files changed, 38 insertions, 11 deletions
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index b9ff3759452..392a6633067 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -65,32 +65,59 @@ bool PyMatTo(PyObject* pymat, T& mat)
{
bool noerror = true;
mat.setIdentity();
+
+
+#ifdef USE_MATHUTILS
+
+ if (MatrixObject_Check(pymat))
+ {
+ MatrixObject *pymatrix = (MatrixObject *)pymat;
+
+ if (BaseMath_ReadCallback(pymatrix) == -1)
+ return false;
+
+ if (pymatrix->num_col != Size(mat) || pymatrix->num_row != Size(mat))
+ return false;
+
+ for (unsigned int row = 0; row < Size(mat); row++)
+ {
+ for (unsigned int col = 0; col < Size(mat); col++)
+ {
+ mat[row][col] = *(pymatrix->matrix + col * pymatrix->num_row + row);
+ }
+ }
+ }
+ else
+
+#endif /* USE_MATHUTILS */
+
+
if (PySequence_Check(pymat))
{
- unsigned int cols = PySequence_Size(pymat);
- if (cols != Size(mat))
+ unsigned int rows = PySequence_Size(pymat);
+ if (rows != Size(mat))
return false;
- for (unsigned int x = 0; noerror && x < cols; x++)
+ for (unsigned int row = 0; noerror && row < rows; row++)
{
- PyObject *pycol = PySequence_GetItem(pymat, x); /* new ref */
- if (!PyErr_Occurred() && PySequence_Check(pycol))
+ PyObject *pyrow = PySequence_GetItem(pymat, row); /* new ref */
+ if (!PyErr_Occurred() && PySequence_Check(pyrow))
{
- unsigned int rows = PySequence_Size(pycol);
- if (rows != Size(mat))
+ unsigned int cols = PySequence_Size(pyrow);
+ if (cols != Size(mat))
noerror = false;
else
{
- for( unsigned int y = 0; y < rows; y++)
+ for( unsigned int col = 0; col < cols; col++)
{
- PyObject *item = PySequence_GetItem(pycol, y); /* new ref */
- mat[y][x] = PyFloat_AsDouble(item);
+ PyObject *item = PySequence_GetItem(pyrow, col); /* new ref */
+ mat[row][col] = PyFloat_AsDouble(item);
Py_DECREF(item);
}
}
} else
noerror = false;
- Py_DECREF(pycol);
+ Py_DECREF(pyrow);
}
} else
noerror = false;