Revision: 28420
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28420
Author:   campbellbarton
Date:     2010-04-26 01:33:09 +0200 (Mon, 26 Apr 2010)

Log Message:
-----------
rna/python mathutils module
- return euler rotation values from rna now have correct rotation order.
- mathutils.Euler stored rotation order off by 1. (didnt work at all)
- Euler/Quat/Color sliceing working again.

Modified Paths:
--------------
    trunk/blender/source/blender/python/generic/mathutils_color.c
    trunk/blender/source/blender/python/generic/mathutils_euler.c
    trunk/blender/source/blender/python/generic/mathutils_matrix.c
    trunk/blender/source/blender/python/generic/mathutils_quat.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/python/generic/mathutils_color.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_color.c       
2010-04-25 21:13:42 UTC (rev 28419)
+++ trunk/blender/source/blender/python/generic/mathutils_color.c       
2010-04-25 23:33:09 UTC (rev 28420)
@@ -27,6 +27,8 @@
 #include "BLI_math.h"
 #include "BKE_utildefines.h"
 
+#define COLOR_SIZE 3
+
 //----------------------------------mathutils.Color() -------------------
 //makes a new color for you to play with
 static PyObject *Color_new(PyTypeObject * type, PyObject * args, PyObject * 
kwargs)
@@ -37,7 +39,7 @@
        case 0:
                break;
        case 1:
-               if((mathutils_array_parse(col, 3, 3, PyTuple_GET_ITEM(args, 0), 
"mathutils.Color()")) == -1)
+               if((mathutils_array_parse(col, COLOR_SIZE, COLOR_SIZE, 
PyTuple_GET_ITEM(args, 0), "mathutils.Color()")) == -1)
                        return NULL;
                break;
        default:
@@ -55,15 +57,15 @@
        PyObject *ret;
        int i;
 
-       ret= PyTuple_New(3);
+       ret= PyTuple_New(COLOR_SIZE);
 
        if(ndigits >= 0) {
-               for(i= 0; i < 3; i++) {
+               for(i= 0; i < COLOR_SIZE; i++) {
                        PyTuple_SET_ITEM(ret, i, 
PyFloat_FromDouble(double_round((double)self->col[i], ndigits)));
                }
        }
        else {
-               for(i= 0; i < 3; i++) {
+               for(i= 0; i < COLOR_SIZE; i++) {
                        PyTuple_SET_ITEM(ret, i, 
PyFloat_FromDouble(self->col[i]));
                }
        }
@@ -137,10 +139,10 @@
 
        switch (comparison_type){
                case Py_EQ:
-                       result = EXPP_VectorsAreEqual(colA->col, colB->col, 3, 
1);
+                       result = EXPP_VectorsAreEqual(colA->col, colB->col, 
COLOR_SIZE, 1);
                        break;
                case Py_NE:
-                       result = !EXPP_VectorsAreEqual(colA->col, colB->col, 3, 
1);
+                       result = !EXPP_VectorsAreEqual(colA->col, colB->col, 
COLOR_SIZE, 1);
                        break;
                default:
                        printf("The result of the comparison could not be 
evaluated");
@@ -158,15 +160,15 @@
 //sequence length
 static int Color_len(ColorObject * self)
 {
-       return 3;
+       return COLOR_SIZE;
 }
 //----------------------------object[]---------------------------
 //sequence accessor (get)
 static PyObject *Color_item(ColorObject * self, int i)
 {
-       if(i<0) i= 3-i;
+       if(i<0) i= COLOR_SIZE-i;
 
-       if(i < 0 || i >= 3) {
+       if(i < 0 || i >= COLOR_SIZE) {
                PyErr_SetString(PyExc_IndexError, "color[attribute]: array 
index out of range");
                return NULL;
        }
@@ -188,9 +190,9 @@
                return -1;
        }
 
-       if(i<0) i= 3-i;
+       if(i<0) i= COLOR_SIZE-i;
 
-       if(i < 0 || i >= 3){
+       if(i < 0 || i >= COLOR_SIZE){
                PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array 
assignment index out of range\n");
                return -1;
        }
@@ -212,9 +214,9 @@
        if(!BaseMath_ReadCallback(self))
                return NULL;
 
-       CLAMP(begin, 0, 3);
-       if (end<0) end= 4+end;
-       CLAMP(end, 0, 3);
+       CLAMP(begin, 0, COLOR_SIZE);
+       if (end<0) end= (COLOR_SIZE + 1) + end;
+       CLAMP(end, 0, COLOR_SIZE);
        begin = MIN2(begin,end);
 
        list = PyList_New(end - begin);
@@ -227,61 +229,116 @@
 }
 //----------------------------object[z:y]------------------------
 //sequence slice (set)
-static int Color_ass_slice(ColorObject * self, int begin, int end,
-                                PyObject * seq)
+static int Color_ass_slice(ColorObject * self, int begin, int end, PyObject * 
seq)
 {
-       int i, y, size = 0;
-       float col[3];
-       PyObject *e;
+       int i, size;
+       float col[COLOR_SIZE];
 
        if(!BaseMath_ReadCallback(self))
                return -1;
 
-       CLAMP(begin, 0, 3);
-       if (end<0) end= 4+end;
-       CLAMP(end, 0, 3);
+       CLAMP(begin, 0, COLOR_SIZE);
+       if (end<0) end= (COLOR_SIZE + 1) + end;
+       CLAMP(end, 0, COLOR_SIZE);
        begin = MIN2(begin,end);
 
-       size = PySequence_Length(seq);
+       if((size=mathutils_array_parse(col, 0, COLOR_SIZE, seq, 
"mathutils.Color[begin:end] = []")) == -1)
+               return -1;
+
        if(size != (end - begin)){
                PyErr_SetString(PyExc_TypeError, "color[begin:end] = []: size 
mismatch in slice assignment");
                return -1;
        }
 
-       for (i = 0; i < size; i++) {
-               e = PySequence_GetItem(seq, i);
-               if (e == NULL) { // Failed to read sequence
-                       PyErr_SetString(PyExc_RuntimeError, "color[begin:end] = 
[]: unable to read sequence");
-                       return -1;
+       for(i= 0; i < COLOR_SIZE; i++)
+               self->col[begin + i] = col[i];
+
+       BaseMath_WriteCallback(self);
+       return 0;
+}
+
+static PyObject *Color_subscript(ColorObject *self, PyObject *item)
+{
+       if (PyIndex_Check(item)) {
+               Py_ssize_t i;
+               i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+               if (i == -1 && PyErr_Occurred())
+                       return NULL;
+               if (i < 0)
+                       i += COLOR_SIZE;
+               return Color_item(self, i);
+       } else if (PySlice_Check(item)) {
+               Py_ssize_t start, stop, step, slicelength;
+
+               if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, 
&start, &stop, &step, &slicelength) < 0)
+                       return NULL;
+
+               if (slicelength <= 0) {
+                       return PyList_New(0);
                }
+               else if (step == 1) {
+                       return Color_slice(self, start, stop);
+               }
+               else {
+                       PyErr_SetString(PyExc_TypeError, "slice steps not 
supported with eulers");
+                       return NULL;
+               }
+       }
+       else {
+               PyErr_Format(PyExc_TypeError,
+                                "euler indices must be integers, not %.200s",
+                                item->ob_type->tp_name);
+               return NULL;
+       }
+}
 
-               col[i] = (float)PyFloat_AsDouble(e);
-               Py_DECREF(e);
+static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject 
*value)
+{
+       if (PyIndex_Check(item)) {
+               Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+               if (i == -1 && PyErr_Occurred())
+                       return -1;
+               if (i < 0)
+                       i += COLOR_SIZE;
+               return Color_ass_item(self, i, value);
+       }
+       else if (PySlice_Check(item)) {
+               Py_ssize_t start, stop, step, slicelength;
 
-               if(col[i]==-1 && PyErr_Occurred()) { // parsed item not a number
-                       PyErr_SetString(PyExc_TypeError, "color[begin:end] = 
[]: sequence argument not a number");
+               if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, 
&start, &stop, &step, &slicelength) < 0)
                        return -1;
+
+               if (step == 1)
+                       return Color_ass_slice(self, start, stop, value);
+               else {
+                       PyErr_SetString(PyExc_TypeError, "slice steps not 
supported with euler");
+                       return -1;
                }
        }
-       //parsed well - now set in vector
-       for(y = 0; y < 3; y++){
-               self->col[begin + y] = col[y];
+       else {
+               PyErr_Format(PyExc_TypeError,
+                                "euler indices must be integers, not %.200s",
+                                item->ob_type->tp_name);
+               return -1;
        }
+}
 
-       BaseMath_WriteCallback(self);
-       return 0;
-}
 //-----------------PROTCOL DECLARATIONS--------------------------
 static PySequenceMethods Color_SeqMethods = {
-       (lenfunc) Color_len,                                            /* 
sq_length */
-       (binaryfunc) 0,                                                         
/* sq_concat */
-       (ssizeargfunc) 0,                                                       
        /* sq_repeat */
-       (ssizeargfunc) Color_item,                                      /* 
sq_item */
-       (ssizessizeargfunc) Color_slice,                                /* 
sq_slice */
-       (ssizeobjargproc) Color_ass_item,                               /* 
sq_ass_item */
-       (ssizessizeobjargproc) Color_ass_slice,                 /* sq_ass_slice 
*/
+       (lenfunc) Color_len,                                    /* sq_length */
+       (binaryfunc) 0,                                                 /* 
sq_concat */
+       (ssizeargfunc) 0,                                               /* 
sq_repeat */
+       (ssizeargfunc) Color_item,                              /* sq_item */
+       (ssizessizeargfunc) NULL,                               /* sq_slice, 
deprecated */
+       (ssizeobjargproc) Color_ass_item,               /* sq_ass_item */
+       (ssizessizeobjargproc) NULL,                    /* sq_ass_slice, 
deprecated */
 };
 
+static PyMappingMethods Color_AsMapping = {
+       (lenfunc)Color_len,
+       (binaryfunc)Color_subscript,
+       (objobjargproc)Color_ass_subscript
+};
 
 /* color channel, vector.r/g/b */
 static PyObject *Color_getChannel( ColorObject * self, void *type )
@@ -414,7 +471,7 @@
        (reprfunc) Color_repr,                  //tp_repr
        0,                              //tp_as_number
        &Color_SeqMethods,                              //tp_as_sequence
-       0,                                                              
//tp_as_mapping
+       &Color_AsMapping,                               //tp_as_mapping
        0,                                                              
//tp_hash
        0,                                                              
//tp_call
        0,                                                              //tp_str
@@ -458,7 +515,6 @@
 PyObject *newColorObject(float *col, int type, PyTypeObject *base_type)
 {
        ColorObject *self;
-       int x;
 
        if(base_type)   self = (ColorObject *)base_type->tp_alloc(base_type, 0);
        else                    self = PyObject_NEW(ColorObject, &color_Type);
@@ -470,17 +526,17 @@
        if(type == Py_WRAP){
                self->col = col;
                self->wrapped = Py_WRAP;
-       }else if (type == Py_NEW){
-               self->col = PyMem_Malloc(3 * sizeof(float));
-               if(!col) { //new empty
-                       for(x = 0; x < 3; x++) {
-                               self->col[x] = 0.0f;
-                       }
-               }else{
-                       VECCOPY(self->col, col);
-               }
+       }
+       else if (type == Py_NEW){
+               self->col = PyMem_Malloc(COLOR_SIZE * sizeof(float));
+               if(col)
+                       copy_v3_v3(self->col, col);
+               else
+                       zero_v3(self->col);
+
                self->wrapped = Py_NEW;
-       }else{ //bad type
+       }
+       else {
                return NULL;
        }
 

Modified: trunk/blender/source/blender/python/generic/mathutils_euler.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_euler.c       
2010-04-25 21:13:42 UTC (rev 28419)
+++ trunk/blender/source/blender/python/generic/mathutils_euler.c       
2010-04-25 23:33:09 UTC (rev 28420)
@@ -35,6 +35,8 @@
 #include "BLO_sys_types.h"
 #endif
 
+#define EULER_SIZE 3
+
 //----------------------------------mathutils.Euler() -------------------
 //makes a new euler for you to play with
 static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * 
kwargs)
@@ -42,8 +44,8 @@
        PyObject *seq= NULL;
        char *order_str= NULL;
 
-       float eul[3]= {0.0f, 0.0f, 0.0f};
-       short order= 0;
+       float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f};
+       short order= EULER_ORDER_XYZ;
 
        if(!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str))
                return NULL;
@@ -56,7 +58,7 @@
                        return NULL;
                /* intentionally pass through */
        case 1:
-               if (mathutils_array_parse(eul, 3, 3, seq, "mathutils.Euler()") 
== -1)
+               if (mathutils_array_parse(eul, EULER_SIZE, EULER_SIZE, seq, 
"mathutils.Euler()") == -1)
                        return NULL;
                break;
        }
@@ -67,12 +69,12 @@
 {
        if((str[0] && str[1] && str[2] && str[3]=='\0')) {
                switch(*((int32_t *)str)) {
-                       case 'X'|'Y'<<8|'Z'<<16:        return 0;
-                       case 'X'|'Z'<<8|'Y'<<16:        return 1;
-                       case 'Y'|'X'<<8|'Z'<<16:        return 2;
-                       case 'Y'|'Z'<<8|'X'<<16:        return 3;
-                       case 'Z'|'X'<<8|'Y'<<16:        return 4;
-                       case 'Z'|'Y'<<8|'X'<<16:        return 5;
+                       case 'X'|'Y'<<8|'Z'<<16:        return EULER_ORDER_XYZ;
+                       case 'X'|'Z'<<8|'Y'<<16:        return EULER_ORDER_XZY;
+                       case 'Y'|'X'<<8|'Z'<<16:        return EULER_ORDER_YXZ;
+                       case 'Y'|'Z'<<8|'X'<<16:        return EULER_ORDER_YZX;
+                       case 'Z'|'X'<<8|'Y'<<16:        return EULER_ORDER_ZXY;
+                       case 'Z'|'Y'<<8|'X'<<16:        return EULER_ORDER_ZYX;
                }
        }
 
@@ -86,15 +88,15 @@
        PyObject *ret;
        int i;
 
-       ret= PyTuple_New(3);
+       ret= PyTuple_New(EULER_SIZE);
 
        if(ndigits >= 0) {
-               for(i= 0; i < 3; i++) {
+               for(i= 0; i < EULER_SIZE; i++) {
                        PyTuple_SET_ITEM(ret, i, 
PyFloat_FromDouble(double_round((double)self->eul[i], ndigits)));
                }
        }
        else {
-               for(i= 0; i < 3; i++) {
+               for(i= 0; i < EULER_SIZE; i++) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to