[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34194] trunk/blender/source/blender/ python/generic: mathutils matrix initialization now matches other mathutils types.
Campbell Barton
ideasman42 at gmail.com
Sun Jan 9 15:30:17 CET 2011
Revision: 34194
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34194
Author: campbellbarton
Date: 2011-01-09 14:30:16 +0000 (Sun, 09 Jan 2011)
Log Message:
-----------
mathutils matrix initialization now matches other mathutils types.
(should have made this change along with the others).
Matrix([1, 2], [3, 4]) --> Matrix(([1, 2], [3, 4]))
This is so adding initialization args works right.
Also simplify initialization code (re-use slice assignment).
Modified Paths:
--------------
trunk/blender/source/blender/python/generic/mathutils_matrix.c
trunk/blender/source/blender/python/generic/mathutils_matrix.h
Modified: trunk/blender/source/blender/python/generic/mathutils_matrix.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_matrix.c 2011-01-09 12:38:54 UTC (rev 34193)
+++ trunk/blender/source/blender/python/generic/mathutils_matrix.c 2011-01-09 14:30:16 UTC (rev 34194)
@@ -31,8 +31,8 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
+static int Matrix_ass_slice(MatrixObject * self, int begin, int end, PyObject *value);
-
/* matrix vector callbacks */
int mathutils_matrix_vector_cb_index= -1;
@@ -109,80 +109,42 @@
//create a new matrix type
static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyObject *argObject, *m, *s;
- MatrixObject *mat;
- int argSize, seqSize = 0, i, j;
- float matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- float scalar;
-
if(kwds && PyDict_Size(kwds)) {
PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): takes no keyword args");
return NULL;
}
- argSize = PyTuple_GET_SIZE(args);
- if(argSize > MATRIX_MAX_DIM) { //bad arg nums
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size");
- return NULL;
- } else if (argSize == 0) { //return empty 4D matrix
- return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, type);
- }else if (argSize == 1){
- //copy constructor for matrix objects
- argObject = PyTuple_GET_ITEM(args, 0);
- if(MatrixObject_Check(argObject)){
- mat = (MatrixObject*)argObject;
- if(!BaseMath_ReadCallback(mat))
- return NULL;
+ switch(PyTuple_GET_SIZE(args)) {
+ case 0:
+ return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, type);
+ case 1:
+ {
+ PyObject *arg= PyTuple_GET_ITEM(args, 0);
- memcpy(matrix, mat->contigPtr, sizeof(float) * mat->rowSize * mat->colSize);
- argSize = mat->rowSize;
- seqSize = mat->colSize;
- }
- }else{ //2-4 arguments (all seqs? all same size?)
- for(i =0; i < argSize; i++){
- argObject = PyTuple_GET_ITEM(args, i);
- if (PySequence_Check(argObject)) { //seq?
- if(seqSize){ //0 at first
- if(PySequence_Length(argObject) != seqSize){ //seq size not same
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size");
- return NULL;
+ const unsigned short row_size= PySequence_Size(arg); /* -1 is an error, size checks will accunt for this */
+
+ if(IN_RANGE_INCL(row_size, 2, 4)) {
+ PyObject *item= PySequence_GetItem(arg, 0);
+ const unsigned short col_size= PySequence_Size(item);
+ Py_XDECREF(item);
+
+ if(IN_RANGE_INCL(col_size, 2, 4)) {
+ /* sane row & col size, new matrix and assign as slice */
+ PyObject *matrix= newMatrixObject(NULL, row_size, col_size, Py_NEW, type);
+ if(Matrix_ass_slice((MatrixObject *)matrix, 0, INT_MAX, arg) == 0) {
+ return matrix;
}
+ else { /* matrix ok, slice assignment not */
+ Py_DECREF(matrix);
+ }
}
- seqSize = PySequence_Length(argObject);
- }else{ //arg not a sequence
- PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size");
- return NULL;
}
}
- //all is well... let's continue parsing
- for (i = 0; i < argSize; i++){
- m = PyTuple_GET_ITEM(args, i);
- if (m == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments");
- return NULL;
- }
-
- for (j = 0; j < seqSize; j++) {
- s = PySequence_GetItem(m, j);
- if (s == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments");
- return NULL;
- }
-
- scalar= (float)PyFloat_AsDouble(s);
- Py_DECREF(s);
-
- if(scalar==-1 && PyErr_Occurred()) { // parsed item is not a number
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size");
- return NULL;
- }
-
- matrix[(seqSize*i)+j]= scalar;
- }
- }
}
- return newMatrixObject(matrix, argSize, seqSize, Py_NEW, type);
+
+ /* will overwrite error */
+ PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects no args or 2-4 numeric sequences");
+ return NULL;
}
/*-----------------------CLASS-METHODS----------------------------*/
@@ -1847,7 +1809,7 @@
(i.e. it was allocated elsewhere by MEM_mallocN())
pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
(i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type)
+PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsigned short colSize, int type, PyTypeObject *base_type)
{
MatrixObject *self;
int x, row, col;
Modified: trunk/blender/source/blender/python/generic/mathutils_matrix.h
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_matrix.h 2011-01-09 12:38:54 UTC (rev 34193)
+++ trunk/blender/source/blender/python/generic/mathutils_matrix.h 2011-01-09 14:30:16 UTC (rev 34194)
@@ -49,7 +49,7 @@
blender (stored in blend_data). This is an either/or struct not both*/
/*prototypes*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type);
+PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsigned short colSize, int type, PyTypeObject *base_type);
PyObject *newMatrixObject_cb(PyObject *user, int rowSize, int colSize, int cb_type, int cb_subtype);
extern int mathutils_matrix_vector_cb_index;
More information about the Bf-blender-cvs
mailing list