[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19832] trunk/blender/source/blender/ python/api2_2x: Blender Python API
Campbell Barton
ideasman42 at gmail.com
Tue Apr 21 09:16:30 CEST 2009
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. @@
More information about the Bf-blender-cvs
mailing list