Revision: 19832
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19832
Author:   campbellbarton
Date:     2009-04-21 09:16:29 +0200 (Tue, 21 Apr 2009)

Log Message:
-----------
Blender Python API

use getseter's for quat and euler types attributes, python3 compatible module 
initialization for Mathutils and BGL.

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/BGL.c
    trunk/blender/source/blender/python/api2_2x/Mathutils.c
    trunk/blender/source/blender/python/api2_2x/euler.c
    trunk/blender/source/blender/python/api2_2x/quat.c
    trunk/blender/source/blender/python/api2_2x/vector.c
    trunk/blender/source/blender/python/api2_2x/vector.h

Modified: trunk/blender/source/blender/python/api2_2x/BGL.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/BGL.c   2009-04-21 05:20:30 UTC 
(rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/BGL.c   2009-04-21 07:16:29 UTC 
(rev 19832)
@@ -1085,9 +1085,29 @@
        {NULL, NULL, 0, NULL}
 };
 
+#if (PY_VERSION_HEX >= 0x03000000)
+static struct PyModuleDef BGL_module_def = {
+       {}, /* m_base */
+       "BGL",  /* m_name */
+       0,  /* m_doc */
+       0,  /* m_size */
+       BGL_methods,  /* m_methods */
+       0,  /* m_reload */
+       0,  /* m_traverse */
+       0,  /* m_clear */
+       0,  /* m_free */
+};
+#endif
+
 PyObject *BGL_Init(const char *from) 
 {
-       PyObject *mod= Py_InitModule(from, BGL_methods);
+       PyObject *mod;
+#if (PY_VERSION_HEX >= 0x03000000)
+       mod = PyModule_Create(&BGL_module_def);
+#else
+       mod= Py_InitModule(from, BGL_methods);
+#endif
+       
        PyObject *dict= PyModule_GetDict(mod);
        PyObject *item;
        if( PyType_Ready( &buffer_Type) < 0)

Modified: trunk/blender/source/blender/python/api2_2x/Mathutils.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mathutils.c     2009-04-21 
05:20:30 UTC (rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/Mathutils.c     2009-04-21 
07:16:29 UTC (rev 19832)
@@ -108,6 +108,21 @@
 };
 /*----------------------------MODULE INIT-------------------------*/
 /* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */
+
+#if (PY_VERSION_HEX >= 0x03000000)
+static struct PyModuleDef M_Mathutils_module_def = {
+       {}, /* m_base */
+       "Mathutils",  /* m_name */
+       M_Mathutils_doc,  /* m_doc */
+       0,  /* m_size */
+       M_Mathutils_methods,  /* m_methods */
+       0,  /* m_reload */
+       0,  /* m_traverse */
+       0,  /* m_clear */
+       0,  /* m_free */
+};
+#endif
+
 PyObject *Mathutils_Init(const char *from)
 {
        PyObject *submodule;
@@ -126,7 +141,12 @@
        if( PyType_Ready( &quaternion_Type ) < 0 )
                return NULL;
        
+#if (PY_VERSION_HEX >= 0x03000000)
+       submodule = PyModule_Create(&M_Mathutils_module_def);
+#else
        submodule = Py_InitModule3(from, M_Mathutils_methods, M_Mathutils_doc);
+#endif
+       
        return (submodule);
 }
 //-----------------------------METHODS----------------------------

Modified: trunk/blender/source/blender/python/api2_2x/euler.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/euler.c 2009-04-21 05:20:30 UTC 
(rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/euler.c 2009-04-21 07:16:29 UTC 
(rev 19832)
@@ -189,71 +189,13 @@
        }
        PyObject_DEL(self);
 }
-//----------------------------getattr()(internal) ------------------
-//object.attribute access (get)
-static PyObject *Euler_getattr(EulerObject * self, char *name)
-{
-       if(STREQ(name,"x")){
-               return PyFloat_FromDouble(self->eul[0]);
-       }else if(STREQ(name, "y")){
-               return PyFloat_FromDouble(self->eul[1]);
-       }else if(STREQ(name, "z")){
-               return PyFloat_FromDouble(self->eul[2]);
-       }
-       if(STREQ(name, "wrapped")){
-               if(self->wrapped == Py_WRAP)
-                       return EXPP_incr_ret((PyObject *)Py_True);
-               else 
-                       return EXPP_incr_ret((PyObject *)Py_False);
-       }
-       return Py_FindMethod(Euler_methods, (PyObject *) self, name);
-}
-//----------------------------setattr()(internal) ------------------
-//object.attribute access (set)
-static int Euler_setattr(EulerObject * self, char *name, PyObject * e)
-{
-       PyObject *f = NULL;
 
-       f = PyNumber_Float(e);
-       if(f == NULL) { // parsed item not a number
-               return EXPP_ReturnIntError(PyExc_TypeError, 
-                       "euler.attribute = x: argument not a number\n");
-       }
-
-       if(STREQ(name,"x")){
-               self->eul[0] = (float)PyFloat_AS_DOUBLE(f);
-       }else if(STREQ(name, "y")){
-               self->eul[1] = (float)PyFloat_AS_DOUBLE(f);
-       }else if(STREQ(name, "z")){
-               self->eul[2] = (float)PyFloat_AS_DOUBLE(f);
-       }else{
-               Py_DECREF(f);
-               return EXPP_ReturnIntError(PyExc_AttributeError,
-                               "euler.attribute = x: unknown attribute\n");
-       }
-
-       Py_DECREF(f);
-       return 0;
-}
 //----------------------------print object (internal)--------------
 //print the object to screen
 static PyObject *Euler_repr(EulerObject * self)
 {
-       int i;
-       char buffer[48], str[1024];
-
-       BLI_strncpy(str,"[",1024);
-       for(i = 0; i < 3; i++){
-               if(i < (2)){
-                       sprintf(buffer, "%.6f, ", self->eul[i]);
-                       strcat(str,buffer);
-               }else{
-                       sprintf(buffer, "%.6f", self->eul[i]);
-                       strcat(str,buffer);
-               }
-       }
-       strcat(str, "](euler)");
-
+       char str[64];
+       sprintf(str, "[%.6f, %.6f, %.6f](euler)", self->eul[0], self->eul[1], 
self->eul[2]);
        return PyString_FromString(str);
 }
 //------------------------tp_richcmpr
@@ -409,6 +351,83 @@
        (intobjargproc) Euler_ass_item,                         /* sq_ass_item 
*/
        (intintobjargproc) Euler_ass_slice,                     /* sq_ass_slice 
*/
 };
+
+
+
+/*
+ * vector axis, vector.x/y/z/w
+ */
+       
+static PyObject *Euler_getAxis( EulerObject * self, void *type )
+{
+       switch( (long)type ) {
+    case 'X':  /* these are backwards, but that how it works */
+               return PyFloat_FromDouble(self->eul[0]);
+    case 'Y':
+               return PyFloat_FromDouble(self->eul[1]);
+    case 'Z':
+               return PyFloat_FromDouble(self->eul[2]);
+       }
+       
+       PyErr_SetString(PyExc_SystemError, "corrupt euler, cannot get axis");
+       return NULL;
+}
+
+static int Euler_setAxis( EulerObject * self, PyObject * value, void * type )
+{
+       float param= (float)PyFloat_AsDouble( value );
+       
+       if (param==-1 && PyErr_Occurred())
+               return EXPP_ReturnIntError( PyExc_TypeError,
+                       "expected a number for the vector axis" );
+       
+       switch( (long)type ) {
+    case 'X':  /* these are backwards, but that how it works */
+               self->eul[0]= param;
+               break;
+    case 'Y':
+               self->eul[1]= param;
+               break;
+    case 'Z':
+               self->eul[2]= param;
+               break;
+       }
+
+       return 0;
+}
+
+static PyObject *Euler_getWrapped( VectorObject * self, void *type )
+{
+       if (self->wrapped == Py_WRAP)
+               Py_RETURN_TRUE;
+       else
+               Py_RETURN_FALSE;
+}
+
+
+/*****************************************************************************/
+/* Python attributes get/set structure:                                      */
+/*****************************************************************************/
+static PyGetSetDef Euler_getseters[] = {
+       {"x",
+        (getter)Euler_getAxis, (setter)Euler_setAxis,
+        "Euler X axis",
+        (void *)'X'},
+       {"y",
+        (getter)Euler_getAxis, (setter)Euler_setAxis,
+        "Euler Y axis",
+        (void *)'Y'},
+       {"z",
+        (getter)Euler_getAxis, (setter)Euler_setAxis,
+        "Euler Z axis",
+        (void *)'Z'},
+       {"wrapped",
+        (getter)Euler_getWrapped, (setter)NULL,
+        "True when this wraps blenders internal data",
+        NULL},
+       {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
+};
+
 //------------------PY_OBECT DEFINITION--------------------------
 PyTypeObject euler_Type = {
        PyObject_HEAD_INIT(NULL)                //tp_head
@@ -418,8 +437,8 @@
        0,                                                              
//tp_itemsize
        (destructor)Euler_dealloc,              //tp_dealloc
        0,                                                              
//tp_print
-       (getattrfunc)Euler_getattr,     //tp_getattr
-       (setattrfunc) Euler_setattr,    //tp_setattr
+       0,                                                              
//tp_getattr
+       0,                                                              
//tp_setattr
        0,                                                              
//tp_compare
        (reprfunc) Euler_repr,                  //tp_repr
        0,                              //tp_as_number
@@ -439,9 +458,9 @@
        0,                                                              
//tp_weaklistoffset
        0,                                                              
//tp_iter
        0,                                                              
//tp_iternext
-       0,                                                              
//tp_methods
+       Euler_methods,                                  //tp_methods
        0,                                                              
//tp_members
-       0,                                                              
//tp_getset
+       Euler_getseters,                                //tp_getset
        0,                                                              
//tp_base
        0,                                                              
//tp_dict
        0,                                                              
//tp_descr_get

Modified: trunk/blender/source/blender/python/api2_2x/quat.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/quat.c  2009-04-21 05:20:30 UTC 
(rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/quat.c  2009-04-21 07:16:29 UTC 
(rev 19832)
@@ -155,109 +155,13 @@
        }
        PyObject_DEL(self);
 }
-//----------------------------getattr()(internal) ------------------
-//object.attribute access (get)
-static PyObject *Quaternion_getattr(QuaternionObject * self, char *name)
-{
-       int x;
-       double mag = 0.0f;
-       float vec[3];
 
-       if(STREQ(name,"w")){
-               return PyFloat_FromDouble(self->quat[0]);
-       }else if(STREQ(name, "x")){
-               return PyFloat_FromDouble(self->quat[1]);
-       }else if(STREQ(name, "y")){
-               return PyFloat_FromDouble(self->quat[2]);
-       }else if(STREQ(name, "z")){
-               return PyFloat_FromDouble(self->quat[3]);
-       }
-       if(STREQ(name, "magnitude")) {
-               for(x = 0; x < 4; x++) {
-                       mag += self->quat[x] * self->quat[x];
-               }
-               mag = sqrt(mag);
-               return PyFloat_FromDouble(mag);
-       }
-       if(STREQ(name, "angle")) {
-               mag = self->quat[0];
-               mag = 2 * (saacos(mag));
-               mag *= (180 / Py_PI);
-               return PyFloat_FromDouble(mag);
-       }
-       if(STREQ(name, "axis")) {
-               mag = self->quat[0] * (Py_PI / 180);
-               mag = 2 * (saacos(mag));
-               mag = sin(mag / 2);
-               for(x = 0; x < 3; x++) {
-                       vec[x] = (float)(self->quat[x + 1] / mag);
-               }
-               Normalize(vec);
-               //If the axis of rotation is 0,0,0 set it to 1,0,0 - for 
zero-degree rotations
-               if( EXPP_FloatsAreEqual(vec[0], 0.0f, 10) &&
-                       EXPP_FloatsAreEqual(vec[1], 0.0f, 10) &&
-                       EXPP_FloatsAreEqual(vec[2], 0.0f, 10) ){
-                       vec[0] = 1.0f;
-               }
-               return (PyObject *) newVectorObject(vec, 3, Py_NEW);
-       }
-       if(STREQ(name, "wrapped")){
-               if(self->wrapped == Py_WRAP)
-                       return EXPP_incr_ret((PyObject *)Py_True);
-               else 
-                       return EXPP_incr_ret((PyObject *)Py_False);
-       }
-
-       return Py_FindMethod(Quaternion_methods, (PyObject *) self, name);
-}
-//----------------------------setattr()(internal) ------------------
-//object.attribute access (set)
-static int Quaternion_setattr(QuaternionObject * self, char *name, PyObject * 
q)
-{
-       PyObject *f = NULL;
-
-       f = PyNumber_Float(q);
-       if(f == NULL) { // parsed item not a number
-               return EXPP_ReturnIntError(PyExc_TypeError, 
-                       "quaternion.attribute = x: argument not a number\n");
-       }
-
-       if(STREQ(name,"w")){
-               self->quat[0] = (float)PyFloat_AS_DOUBLE(f);
-       }else if(STREQ(name, "x")){
-               self->quat[1] = (float)PyFloat_AS_DOUBLE(f);
-       }else if(STREQ(name, "y")){
-               self->quat[2] = (float)PyFloat_AS_DOUBLE(f);
-       }else if(STREQ(name, "z")){
-               self->quat[3] = (float)PyFloat_AS_DOUBLE(f);
-       }else{
-               Py_DECREF(f);
-               return EXPP_ReturnIntError(PyExc_AttributeError,
-                               "quaternion.attribute = x: unknown 
attribute\n");
-       }
-
-       Py_DECREF(f);
-       return 0;
-}
 //----------------------------print object (internal)--------------
 //print the object to screen
 static PyObject *Quaternion_repr(QuaternionObject * self)
 {
-       int i;
-       char buffer[48], str[1024];
-
-       BLI_strncpy(str,"[",1024);
-       for(i = 0; i < 4; i++){
-               if(i < (3)){
-                       sprintf(buffer, "%.6f, ", self->quat[i]);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to