Revision: 37088 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37088 Author: campbellbarton Date: 2011-06-02 08:29:16 +0000 (Thu, 02 Jun 2011) Log Message: ----------- mathutils support for color arithmetic, also some minor whitespace edits.
Modified Paths: -------------- trunk/blender/source/blender/python/BPY_extern.h trunk/blender/source/blender/python/generic/bgl.c trunk/blender/source/blender/python/generic/bgl.h trunk/blender/source/blender/python/generic/bpy_internal_import.c 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_Vector.c trunk/blender/source/blender/python/generic/mathutils_geometry.c trunk/blender/source/blender/python/intern/bpy.c trunk/blender/source/blender/python/intern/bpy.h trunk/blender/source/blender/python/intern/bpy_app.h trunk/blender/source/blender/python/intern/bpy_driver.c trunk/blender/source/blender/python/intern/bpy_interface.c trunk/blender/source/blender/python/intern/bpy_library.c trunk/blender/source/blender/python/intern/bpy_props.c trunk/blender/source/blender/python/intern/bpy_props.h trunk/blender/source/blender/python/intern/bpy_rna.c trunk/blender/source/blender/python/intern/bpy_rna.h Modified: trunk/blender/source/blender/python/BPY_extern.h =================================================================== --- trunk/blender/source/blender/python/BPY_extern.h 2011-06-02 04:58:27 UTC (rev 37087) +++ trunk/blender/source/blender/python/BPY_extern.h 2011-06-02 08:29:16 UTC (rev 37088) @@ -67,14 +67,14 @@ // void BPY_free_pyconstraint_links(struct Text *text); // void BPY_python_start(int argc, const char **argv); -void BPY_python_end( void ); -// void init_syspath( int first_time ); -// void syspath_append( char *dir ); -// void BPY_rebuild_syspath( void ); -// int BPY_path_update( void ); +void BPY_python_end(void); +// void init_syspath(int first_time); +// void syspath_append(char *dir); +// void BPY_rebuild_syspath(void); +// int BPY_path_update(void); // -// int BPY_Err_getLinenumber( void ); -// const char *BPY_Err_getFilename( void ); +// int BPY_Err_getLinenumber(void); +// const char *BPY_Err_getFilename(void); /* 2.5 UI Scripts */ int BPY_filepath_exec(struct bContext *C, const char *filepath, struct ReportList *reports); Modified: trunk/blender/source/blender/python/generic/bgl.c =================================================================== --- trunk/blender/source/blender/python/generic/bgl.c 2011-06-02 04:58:27 UTC (rev 37087) +++ trunk/blender/source/blender/python/generic/bgl.c 2011-06-02 08:29:16 UTC (rev 37088) @@ -62,16 +62,16 @@ buffer which is twice as deep as it is wide or high." ); -static PyObject *Method_Buffer( PyObject * self, PyObject *args ); +static PyObject *Method_Buffer(PyObject *self, PyObject *args); /* Buffer sequence methods */ -static int Buffer_len( PyObject * self ); -static PyObject *Buffer_item( PyObject * self, int i ); -static PyObject *Buffer_slice( PyObject * self, int begin, int end ); -static int Buffer_ass_item( PyObject * self, int i, PyObject * v ); -static int Buffer_ass_slice( PyObject * self, int begin, int end, - PyObject * seq ); +static int Buffer_len(PyObject *self); +static PyObject *Buffer_item(PyObject *self, int i); +static PyObject *Buffer_slice(PyObject *self, int begin, int end); +static int Buffer_ass_item(PyObject *self, int i, PyObject *v); +static int Buffer_ass_slice(PyObject *self, int begin, int end, + PyObject *seq); static PySequenceMethods Buffer_SeqMethods = { ( lenfunc ) Buffer_len, /*sq_length */ @@ -86,11 +86,11 @@ (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; -static void Buffer_dealloc( PyObject * self ); -static PyObject *Buffer_tolist( PyObject * self ); -static PyObject *Buffer_dimensions( PyObject * self ); -static PyObject *Buffer_getattr( PyObject * self, char *name ); -static PyObject *Buffer_repr( PyObject * self ); +static void Buffer_dealloc(PyObject *self); +static PyObject *Buffer_tolist(PyObject *self); +static PyObject *Buffer_dimensions(PyObject *self); +static PyObject *Buffer_getattr(PyObject *self, char *name); +static PyObject *Buffer_repr(PyObject *self); PyTypeObject BGL_bufferType = { PyVarObject_HEAD_INIT(NULL, 0) Modified: trunk/blender/source/blender/python/generic/bgl.h =================================================================== --- trunk/blender/source/blender/python/generic/bgl.h 2011-06-02 04:58:27 UTC (rev 37087) +++ trunk/blender/source/blender/python/generic/bgl.h 2011-06-02 08:29:16 UTC (rev 37088) @@ -55,7 +55,7 @@ /*@ For Python access to OpenGL functions requiring a pointer. */ typedef struct _Buffer { PyObject_VAR_HEAD - PyObject * parent; + PyObject *parent; int type; /* GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT */ int ndimensions; Modified: trunk/blender/source/blender/python/generic/bpy_internal_import.c =================================================================== --- trunk/blender/source/blender/python/generic/bpy_internal_import.c 2011-06-02 04:58:27 UTC (rev 37087) +++ trunk/blender/source/blender/python/generic/bpy_internal_import.c 2011-06-02 08:29:16 UTC (rev 37088) @@ -217,7 +217,7 @@ } -static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject * kw) +static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject *kw) { PyObject *exception, *err, *tb; char *name; @@ -270,7 +270,7 @@ * our reload() module, to handle reloading in-memory scripts */ -static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module) +static PyObject *blender_reload(PyObject *UNUSED(self), PyObject *module) { PyObject *exception, *err, *tb; PyObject *newmodule= NULL; Modified: trunk/blender/source/blender/python/generic/mathutils_Color.c =================================================================== --- trunk/blender/source/blender/python/generic/mathutils_Color.c 2011-06-02 04:58:27 UTC (rev 37087) +++ trunk/blender/source/blender/python/generic/mathutils_Color.c 2011-06-02 08:29:16 UTC (rev 37088) @@ -186,7 +186,7 @@ } //----------------------------object[]------------------------- //sequence accessor (set) -static int Color_ass_item(ColorObject * self, int i, PyObject * value) +static int Color_ass_item(ColorObject * self, int i, PyObject *value) { float f = PyFloat_AsDouble(value); @@ -233,7 +233,7 @@ } //----------------------------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, size; float col[COLOR_SIZE]; @@ -344,13 +344,279 @@ (objobjargproc)Color_ass_subscript }; +/* numeric */ + + +/* addition: obj + obj */ +static PyObject *Color_add(PyObject *v1, PyObject *v2) +{ + ColorObject *color1 = NULL, *color2 = NULL; + float col[COLOR_SIZE]; + + if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { + PyErr_SetString(PyExc_AttributeError, "Color addition: arguments not valid for this operation"); + return NULL; + } + color1 = (ColorObject*)v1; + color2 = (ColorObject*)v2; + + if(BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) + return NULL; + + add_vn_vnvn(col, color1->col, color2->col, COLOR_SIZE); + + return newColorObject(col, Py_NEW, Py_TYPE(v1)); +} + +/* addition in-place: obj += obj */ +static PyObject *Color_iadd(PyObject *v1, PyObject *v2) +{ + ColorObject *color1 = NULL, *color2 = NULL; + + if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { + PyErr_SetString(PyExc_AttributeError, "Color addition: arguments not valid for this operation"); + return NULL; + } + color1 = (ColorObject*)v1; + color2 = (ColorObject*)v2; + + if(BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) + return NULL; + + add_vn_vn(color1->col, color2->col, COLOR_SIZE); + + (void)BaseMath_WriteCallback(color1); + Py_INCREF(v1); + return v1; +} + +/* subtraction: obj - obj */ +static PyObject *Color_sub(PyObject *v1, PyObject *v2) +{ + ColorObject *color1 = NULL, *color2 = NULL; + float col[COLOR_SIZE]; + + if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { + PyErr_SetString(PyExc_AttributeError, "Color subtraction: arguments not valid for this operation"); + return NULL; + } + color1 = (ColorObject*)v1; + color2 = (ColorObject*)v2; + + if(BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) + return NULL; + + sub_vn_vnvn(col, color1->col, color2->col, COLOR_SIZE); + + return newColorObject(col, Py_NEW, Py_TYPE(v1)); +} + +/* subtraction in-place: obj -= obj */ +static PyObject *Color_isub(PyObject *v1, PyObject *v2) +{ + ColorObject *color1= NULL, *color2= NULL; + + if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { + PyErr_SetString(PyExc_AttributeError, "Color subtraction: arguments not valid for this operation"); + return NULL; + } + color1 = (ColorObject*)v1; + color2 = (ColorObject*)v2; + + if(BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) + return NULL; + + sub_vn_vn(color1->col, color2->col, COLOR_SIZE); + + (void)BaseMath_WriteCallback(color1); + Py_INCREF(v1); + return v1; +} + +static PyObject *color_mul_float(ColorObject *color, const float scalar) +{ + float tcol[COLOR_SIZE]; + mul_vn_vn_fl(tcol, color->col, COLOR_SIZE, scalar); + return newColorObject(tcol, Py_NEW, Py_TYPE(color)); +} + + +static PyObject *Color_mul(PyObject *v1, PyObject *v2) +{ + ColorObject *color1 = NULL, *color2 = NULL; + float scalar; + + if ColorObject_Check(v1) { + color1= (ColorObject *)v1; + if(BaseMath_ReadCallback(color1) == -1) + return NULL; + } + if ColorObject_Check(v2) { + color2= (ColorObject *)v2; + if(BaseMath_ReadCallback(color2) == -1) + return NULL; + } + + + /* make sure v1 is always the vector */ + if (color1 && color2) { + /* col * col, dont support yet! */ + } + else if (color1) { + if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR * FLOAT */ + return color_mul_float(color1, scalar); + } + } + else if (color2) { + if (((scalar= PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred())==0) { /* FLOAT * COLOR */ + return color_mul_float(color2, scalar); + } + } + else { + BLI_assert(!"internal error"); + } + + PyErr_Format(PyExc_TypeError, "Color multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); + return NULL; +} + +static PyObject *Color_div(PyObject *v1, PyObject *v2) +{ + ColorObject *color1 = NULL; + float scalar; + + if ColorObject_Check(v1) { + color1= (ColorObject *)v1; + if(BaseMath_ReadCallback(color1) == -1) + return NULL; + } + else { + PyErr_SetString(PyExc_TypeError, "Color division not supported in this order"); + return NULL; + } + + /* make sure v1 is always the vector */ + if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR * FLOAT */ + if(scalar==0.0f) { + PyErr_SetString(PyExc_ZeroDivisionError, "Color division: divide by zero error"); + return NULL; + } + return color_mul_float(color1, 1.0f / scalar); + } + + PyErr_Format(PyExc_TypeError, "Color multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); + return NULL; +} + +/* mulplication in-place: obj *= obj */ +static PyObject *Color_imul(PyObject *v1, PyObject *v2) +{ + ColorObject *color = (ColorObject *)v1; + float scalar; + + if(BaseMath_ReadCallback(color) == -1) + return NULL; + + /* only support color *= float */ + if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR *= FLOAT */ + mul_vn_fl(color->col, COLOR_SIZE, scalar); + } + else { @@ 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