diff options
Diffstat (limited to 'intern/python/py_main.c')
-rw-r--r-- | intern/python/py_main.c | 2292 |
1 files changed, 2292 insertions, 0 deletions
diff --git a/intern/python/py_main.c b/intern/python/py_main.c new file mode 100644 index 00000000000..308ab0266ff --- /dev/null +++ b/intern/python/py_main.c @@ -0,0 +1,2292 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/* CVS */ + +/* $Author$ */ +/* $Date$ */ +/* $RCSfile$ */ +/* $Revision$ */ + +/* Jan Walter's stuff */ +#include "Python.h" +#include "blender.h" + +static PyObject* ErrorObject; + +uint* mcol_to_vcol(Mesh *me); +void mcol_to_rgb(uint col, float *r, float *g, float *b); +void initBlender(); +static PyObject* blend_connect(PyObject* self, PyObject* args); +static PyObject* blend_getObject(PyObject* self, PyObject* args); +/* Jan Walter's stuff */ + +/* Daniel Dunbar's stuff */ +void start_python (void); +void end_python(void); +void txt_do_python (Text* text); +void do_all_scripts(short event); +void do_all_scriptlist(ListBase* list, short event); +void do_pyscript(ID *id, short event); +void clear_bad_scriptlink(ID* id, Text* byebye); +void clear_bad_scriptlinks(Text *byebye); +void free_scriptlink(ScriptLink *slink); +void copy_scriptlink(ScriptLink *scriptlink); + +void start_python (void) +{ + Py_SetProgramName("blender"); + Py_Initialize(); + initBlender(); +} + +void end_python(void) +{ + Py_Finalize(); +} + +void txt_do_python (Text* text) +{ + char filename[] = "test.py"; + FILE* fp = NULL; + + if (text->name) + { + fp = fopen(text->name, "r"); + } + else + { + fp = fopen(filename, "r"); + } + if (fp) + { + if (text->name) + { + PyRun_AnyFile(fp, text->name); + } + else + { + PyRun_AnyFile(fp, filename); + } + } + else + { + if (text->name) + { + printf("Couldn't run %s ...\n", text->name); + } + else + { + printf("Couldn't run test.py ...\n"); + } + } +} + +void do_all_scripts(short event) +{ +} + +void do_all_scriptlist(ListBase* list, short event) +{ +} + +void do_pyscript(ID *id, short event) +{ +} + +void clear_bad_scriptlink(ID* id, Text* byebye) +{ +} + +void clear_bad_scriptlinks(Text *byebye) +{ +} + +void free_scriptlink(ScriptLink *slink) +{ +} + +void copy_scriptlink(ScriptLink *scriptlink) +{ +} +/* Daniel Dunbar's stuff */ + +ID* find_name_in_list(ID* list, const char* name) +{ + while (list) + { + if (STREQ(name, list->name+2)) + { + break; + } + else + { + list = list->next; + } + } + + return list; +} + +/* Jan Walter's stuff */ +/**************/ +/* structures */ +/**************/ + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* Lens; + PyObject* ClSta; + PyObject* ClEnd; +} camobject; + +staticforward PyTypeObject Camtype; + +typedef struct { + PyObject_HEAD + PyObject* startFrame; + PyObject* endFrame; + PyObject* currentFrame; + PyObject* xResolution; + PyObject* yResolution; + PyObject* pixelAspectRatio; +} dspobject; + +staticforward PyTypeObject Dsptype; + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* R; + PyObject* G; + PyObject* B; +} lmpobject; + +staticforward PyTypeObject Lmptype; + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* R; + PyObject* G; + PyObject* B; +} matobject; + +staticforward PyTypeObject Mattype; + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* vertices; + PyObject* normals; + PyObject* colors; + PyObject* faces; + PyObject* texture; + PyObject* texcoords; +} mshobject; + +staticforward PyTypeObject Mshtype; + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* matrix; + PyObject* inverseMatrix; + PyObject* materials; + PyObject* data; + PyObject* type; +} objobject; + +staticforward PyTypeObject Objtype; + +typedef struct { + PyObject_HEAD + char name[24]; + PyObject* objects; +} sceobject; + +staticforward PyTypeObject Scetype; + +/**********/ +/* camera */ +/**********/ + +static struct PyMethodDef cam_methods[] = { + { NULL, NULL } +}; + +static camobject* +newcamobject(char* name) +{ + camobject* self; + ID* list = NULL; + + self = PyObject_NEW(camobject, &Camtype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->Lens = PyFloat_FromDouble(35.0); + self->ClSta = PyFloat_FromDouble(0.1); + self->ClEnd = PyFloat_FromDouble(100.0); + + return self; +} + +static void +cam_dealloc(camobject* self) +{ + camobject* cam = (camobject*) self; + + Py_DECREF(cam->Lens); + Py_DECREF(cam->ClSta); + Py_DECREF(cam->ClEnd); + + PyMem_DEL(self); +} + +static int +cam_print(camobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Camera(name = \"%s\")\n", self->name); + + return 0; +} + +static PyObject* +cam_repr(camobject* self) +{ + PyObject* s; + + s = PyString_FromString("Camera()\n"); + + return s; +} + +static PyObject* +cam_str(camobject* self) +{ + PyObject* s; + + s = PyString_FromString("Camera()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist cam_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"Lens", T_OBJECT, offsetof(camobject, Lens), RO}, + {"ClSta", T_OBJECT, offsetof(camobject, ClSta), RO}, + {"ClEnd", T_OBJECT, offsetof(camobject, ClEnd), RO}, + {NULL} +}; + +static PyObject* +cam_getattr(camobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, cam_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(cam_methods, (PyObject*)self, name); +} + + +static int +cam_setattr(camobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, cam_memberlist, name, v); +} + +static char Camtype__doc__[] = +"" +; + +static PyTypeObject Camtype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Camera", /*tp_name*/ + sizeof(camobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) cam_dealloc, /*tp_dealloc*/ + (printfunc) cam_print, /*tp_print*/ + (getattrfunc) cam_getattr, /*tp_getattr*/ + (setattrfunc) cam_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) cam_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) cam_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Camtype__doc__ /* Documentation string */ +}; + +/********************/ +/* display settings */ +/********************/ + +static struct PyMethodDef dsp_methods[] = { + { NULL, NULL } +}; + +static dspobject* +newdspobject(void) +{ + dspobject* self; + ID* list = NULL; + + self = PyObject_NEW(dspobject, &Dsptype); + if (self == NULL) + { + return NULL; + } + self->startFrame = PyInt_FromLong(1); + self->endFrame = PyInt_FromLong(250); + self->currentFrame = PyInt_FromLong(1); + self->xResolution = PyInt_FromLong(320); + self->yResolution = PyInt_FromLong(256); + self->pixelAspectRatio = PyFloat_FromDouble(1.0); + + return self; +} + +static void +dsp_dealloc(dspobject* self) +{ + dspobject* dsp = (dspobject*) self; + + Py_DECREF(dsp->startFrame); + Py_DECREF(dsp->endFrame); + Py_DECREF(dsp->currentFrame); + Py_DECREF(dsp->xResolution); + Py_DECREF(dsp->yResolution); + Py_DECREF(dsp->pixelAspectRatio); + + PyMem_DEL(self); +} + +static int +dsp_print(dspobject* self, FILE* fp, int flags) +{ + fprintf(fp, "DisplaySettings()\n"); + + return 0; +} + +static PyObject* +dsp_repr(dspobject* self) +{ + PyObject* s; + + s = PyString_FromString("DisplaySettings()()\n"); + + return s; +} + +static PyObject* +dsp_str(dspobject* self) +{ + PyObject* s; + + s = PyString_FromString("DisplaySettings()()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist dsp_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"startFrame", T_OBJECT, offsetof(dspobject, startFrame), RO}, + {"endFrame", T_OBJECT, offsetof(dspobject, endFrame), RO}, + {"currentFrame", T_OBJECT, offsetof(dspobject, currentFrame), RO}, + {"xResolution", T_OBJECT, offsetof(dspobject, xResolution), RO}, + {"yResolution", T_OBJECT, offsetof(dspobject, yResolution), RO}, + {"pixelAspectRatio", T_OBJECT, offsetof(dspobject, pixelAspectRatio), RO}, + {NULL} +}; + +static PyObject* +dsp_getattr(dspobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, dsp_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(dsp_methods, (PyObject*)self, name); +} + + +static int +dsp_setattr(dspobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, dsp_memberlist, name, v); +} + +static char Dsptype__doc__[] = +"" +; + +static PyTypeObject Dsptype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "DisplaySettings", /*tp_name*/ + sizeof(dspobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) dsp_dealloc, /*tp_dealloc*/ + (printfunc) dsp_print, /*tp_print*/ + (getattrfunc) dsp_getattr, /*tp_getattr*/ + (setattrfunc) dsp_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) dsp_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) dsp_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Dsptype__doc__ /* Documentation string */ +}; + +/********/ +/* Lamp */ +/********/ + +static struct PyMethodDef lmp_methods[] = { + { NULL, NULL } +}; + +static lmpobject* +newlmpobject(char* name) +{ + lmpobject* self; + ID* list = NULL; + + self = PyObject_NEW(lmpobject, &Lmptype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->R = PyFloat_FromDouble(0.8); + self->G = PyFloat_FromDouble(0.8); + self->B = PyFloat_FromDouble(0.8); + + return self; +} + +static void +lmp_dealloc(lmpobject* self) +{ + lmpobject* lmp = (lmpobject*) self; + + Py_DECREF(lmp->R); + Py_DECREF(lmp->G); + Py_DECREF(lmp->B); + + PyMem_DEL(self); +} + +static int +lmp_print(lmpobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Lamp(name = \"%s\")\n", self->name); + + return 0; +} + +static PyObject* +lmp_repr(lmpobject* self) +{ + PyObject* s; + + s = PyString_FromString("Lamp()\n"); + + return s; +} + +static PyObject* +lmp_str(lmpobject* self) +{ + PyObject* s; + + s = PyString_FromString("Lamp()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist lmp_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"R", T_OBJECT, offsetof(lmpobject, R), RO}, + {"G", T_OBJECT, offsetof(lmpobject, G), RO}, + {"B", T_OBJECT, offsetof(lmpobject, B), RO}, + {NULL} +}; + +static PyObject* +lmp_getattr(lmpobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, lmp_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(lmp_methods, (PyObject*)self, name); +} + + +static int +lmp_setattr(lmpobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, lmp_memberlist, name, v); +} + +static char Lmptype__doc__[] = +"" +; + +static PyTypeObject Lmptype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Lamp", /*tp_name*/ + sizeof(lmpobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) lmp_dealloc, /*tp_dealloc*/ + (printfunc) lmp_print, /*tp_print*/ + (getattrfunc) lmp_getattr, /*tp_getattr*/ + (setattrfunc) lmp_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) lmp_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) lmp_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Lmptype__doc__ /* Documentation string */ +}; + +/************/ +/* material */ +/************/ + +static struct PyMethodDef mat_methods[] = { + { NULL, NULL } +}; + +static matobject* +newmatobject(char* name) +{ + matobject* self; + ID* list = NULL; + + self = PyObject_NEW(matobject, &Mattype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->R = PyFloat_FromDouble(0.8); + self->G = PyFloat_FromDouble(0.8); + self->B = PyFloat_FromDouble(0.8); + + return self; +} + +static void +mat_dealloc(matobject* self) +{ + matobject* mat = (matobject*) self; + + Py_DECREF(mat->R); + Py_DECREF(mat->G); + Py_DECREF(mat->B); + + PyMem_DEL(self); +} + +static int +mat_print(matobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Material(name = \"%s\")\n", self->name); + + return 0; +} + +static PyObject* +mat_repr(matobject* self) +{ + PyObject* s; + + s = PyString_FromString("Material()\n"); + + return s; +} + +static PyObject* +mat_str(matobject* self) +{ + PyObject* s; + + s = PyString_FromString("Material()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist mat_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"R", T_OBJECT, offsetof(matobject, R), RO}, + {"G", T_OBJECT, offsetof(matobject, G), RO}, + {"B", T_OBJECT, offsetof(matobject, B), RO}, + {NULL} +}; + +static PyObject* +mat_getattr(matobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, mat_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(mat_methods, (PyObject*)self, name); +} + + +static int +mat_setattr(matobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, mat_memberlist, name, v); +} + +static char Mattype__doc__[] = +"" +; + +static PyTypeObject Mattype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Material", /*tp_name*/ + sizeof(matobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) mat_dealloc, /*tp_dealloc*/ + (printfunc) mat_print, /*tp_print*/ + (getattrfunc) mat_getattr, /*tp_getattr*/ + (setattrfunc) mat_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) mat_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) mat_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Mattype__doc__ /* Documentation string */ +}; + +/********/ +/* mesh */ +/********/ + +static char msh_addFace__doc__[] = +"addFace(self, i1, i2, i3, i4, isSmooth, matIndex)" +; + +static PyObject* +msh_addFace(mshobject* self, PyObject* args) +{ + int index; + int i1, i2, i3, i4; + int isSmooth, matIndex; + PyObject* item = NULL; + + if (!PyArg_ParseTuple(args, "iiiiii", &i1, &i2, &i3, &i4, + &isSmooth, &matIndex)) + { + return NULL; + } + item = PyList_New(6); + PyList_SetItem(item, 0, PyInt_FromLong(i1)); + PyList_SetItem(item, 1, PyInt_FromLong(i2)); + PyList_SetItem(item, 2, PyInt_FromLong(i3)); + PyList_SetItem(item, 3, PyInt_FromLong(i4)); + PyList_SetItem(item, 4, PyInt_FromLong(isSmooth)); + PyList_SetItem(item, 5, PyInt_FromLong(matIndex)); + PyList_Append(self->faces, item); + index = PyList_Size(self->faces) - 1; + + return PyInt_FromLong(index); +} + +static char msh_addTexCoords__doc__[] = +"addTexCoords(self, coords)" +; + +static PyObject* +msh_addTexCoords(mshobject* self, PyObject* args) +{ + float u, v; + PyObject* item = NULL; + + if (!PyArg_ParseTuple(args, "ff", + &u, &v)) + { + return NULL; + } + if (u < 0.0) + { + u = 0.0; + } + if (u > 1.0) + { + u = 1.0; + } + if (v < 0.0) + { + v = 0.0; + } + if (v > 1.0) + { + v = 1.0; + } + item = PyList_New(2); + PyList_SetItem(item, 0, PyFloat_FromDouble(u)); + PyList_SetItem(item, 1, PyFloat_FromDouble(v)); + PyList_Append(self->texcoords, item); + + Py_INCREF(Py_None); + return Py_None; +} + +static char msh_addTexture__doc__[] = +"addTexture(self, filename)" +; + +static PyObject* +msh_addTexture(mshobject* self, PyObject* args) +{ + char* filename = NULL; + + if (!PyArg_ParseTuple(args, "s", &filename)) + { + return NULL; + } + self->texture = PyString_FromString(filename); + + Py_INCREF(Py_None); + return Py_None; +} + +static char msh_addVertex__doc__[] = +"addVertex(self, x, y, z, nx, ny, nz, r = -1.0, g = 0.0, b = 0.0)" +; + +static PyObject* +msh_addVertex(mshobject* self, PyObject* args) +{ + int index; + float x, y, z, nx, ny, nz; + float r = -1.0, g = 0.0, b = 0.0; + PyObject* item1 = NULL; + PyObject* item2 = NULL; + PyObject* item3 = NULL; + + if (!PyArg_ParseTuple(args, "ffffff|fff", &x, &y, &z, &nx, &ny, &nz, + &r, &g, &b)) + { + return NULL; + } + item1 = PyList_New(3); + item2 = PyList_New(3); + if (r != -1.0) + { + item3 = PyList_New(3); + } + PyList_SetItem(item1, 0, PyFloat_FromDouble(x)); + PyList_SetItem(item1, 1, PyFloat_FromDouble(y)); + PyList_SetItem(item1, 2, PyFloat_FromDouble(z)); + PyList_SetItem(item2, 0, PyFloat_FromDouble(nx)); + PyList_SetItem(item2, 1, PyFloat_FromDouble(ny)); + PyList_SetItem(item2, 2, PyFloat_FromDouble(nz)); + if (r != -1.0) + { + PyList_SetItem(item3, 0, PyFloat_FromDouble(r)); + PyList_SetItem(item3, 1, PyFloat_FromDouble(g)); + PyList_SetItem(item3, 2, PyFloat_FromDouble(b)); + } + PyList_Append(self->vertices, item1); + PyList_Append(self->normals, item2); + if (r != -1.0) + { + PyList_Append(self->colors, item3); + } + index = PyList_Size(self->vertices) - 1; + + return PyInt_FromLong(index); +} + +static struct PyMethodDef msh_methods[] = { + {"addFace", (PyCFunction)msh_addFace, + METH_VARARGS, msh_addFace__doc__}, + {"addTexCoords", (PyCFunction)msh_addTexCoords, + METH_VARARGS, msh_addTexCoords__doc__}, + {"addTexture", (PyCFunction)msh_addTexture, + METH_VARARGS, msh_addTexture__doc__}, + {"addVertex", (PyCFunction)msh_addVertex, + METH_VARARGS, msh_addVertex__doc__}, + + { NULL, NULL } +}; + +static mshobject* +newmshobject(char* name) +{ + mshobject* self; + ID* list = NULL; + + self = PyObject_NEW(mshobject, &Mshtype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->vertices = PyList_New(0); + self->normals = PyList_New(0); + self->colors = PyList_New(0); + self->faces = PyList_New(0); + self->texcoords = PyList_New(0); + Py_INCREF(Py_None); + self->texture = Py_None; + + return self; +} + +static void +msh_dealloc(mshobject* self) +{ + mshobject* msh = (mshobject*) self; + + Py_DECREF(msh->vertices); + Py_DECREF(msh->normals); + Py_DECREF(msh->colors); + Py_DECREF(msh->faces); + Py_DECREF(msh->texture); + Py_DECREF(msh->texcoords); + + PyMem_DEL(self); +} + +static int +msh_print(mshobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Mesh(name = \"%s\",\n", self->name); + fprintf(fp, " vertices = %d,\n", PyList_Size(self->vertices)); + fprintf(fp, " faces = %d)\n", PyList_Size(self->faces)); + + return 0; +} + +static PyObject* +msh_repr(mshobject* self) +{ + PyObject* s; + + s = PyString_FromString("Mesh()\n"); + + return s; +} + +static PyObject* +msh_str(mshobject* self) +{ + PyObject* s; + + s = PyString_FromString("Mesh()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist msh_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"vertices", T_OBJECT, offsetof(mshobject, vertices), RO}, + {"normals", T_OBJECT, offsetof(mshobject, normals), RO}, + {"colors", T_OBJECT, offsetof(mshobject, colors), RO}, + {"faces", T_OBJECT, offsetof(mshobject, faces), RO}, + {"texture", T_OBJECT, offsetof(mshobject, texture), RO}, + {"texcoords", T_OBJECT, offsetof(mshobject, texcoords), RO}, + {NULL} +}; + +static PyObject* +msh_getattr(mshobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, msh_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(msh_methods, (PyObject*)self, name); +} + + +static int +msh_setattr(mshobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, msh_memberlist, name, v); +} + +static char Mshtype__doc__[] = +"" +; + +static PyTypeObject Mshtype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Mesh", /*tp_name*/ + sizeof(mshobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) msh_dealloc, /*tp_dealloc*/ + (printfunc) msh_print, /*tp_print*/ + (getattrfunc) msh_getattr, /*tp_getattr*/ + (setattrfunc) msh_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) msh_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) msh_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Mshtype__doc__ /* Documentation string */ +}; + +/**********/ +/* object */ +/**********/ + +static struct PyMethodDef obj_methods[] = { + + { NULL, NULL } +}; + +static objobject* +newobjobject(char* name) +{ + objobject* self = NULL; + PyObject* row1 = NULL; + PyObject* row2 = NULL; + PyObject* row3 = NULL; + PyObject* row4 = NULL; + + self = PyObject_NEW(objobject, &Objtype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->matrix = PyList_New(4); + row1 = PyList_New(4); + row2 = PyList_New(4); + row3 = PyList_New(4); + row4 = PyList_New(4); + PyList_SetItem(row1, 0, PyInt_FromLong(1)); + PyList_SetItem(row1, 1, PyInt_FromLong(0)); + PyList_SetItem(row1, 2, PyInt_FromLong(0)); + PyList_SetItem(row1, 3, PyInt_FromLong(0)); + PyList_SetItem(row2, 0, PyInt_FromLong(0)); + PyList_SetItem(row2, 1, PyInt_FromLong(1)); + PyList_SetItem(row2, 2, PyInt_FromLong(0)); + PyList_SetItem(row2, 3, PyInt_FromLong(0)); + PyList_SetItem(row3, 0, PyInt_FromLong(0)); + PyList_SetItem(row3, 1, PyInt_FromLong(0)); + PyList_SetItem(row3, 2, PyInt_FromLong(1)); + PyList_SetItem(row3, 3, PyInt_FromLong(0)); + PyList_SetItem(row4, 0, PyInt_FromLong(0)); + PyList_SetItem(row4, 1, PyInt_FromLong(0)); + PyList_SetItem(row4, 2, PyInt_FromLong(0)); + PyList_SetItem(row4, 3, PyInt_FromLong(1)); + PyList_SetItem(self->matrix, 0, row1); + PyList_SetItem(self->matrix, 1, row2); + PyList_SetItem(self->matrix, 2, row3); + PyList_SetItem(self->matrix, 3, row4); + self->inverseMatrix = PyList_New(4); + row1 = PyList_New(4); + row2 = PyList_New(4); + row3 = PyList_New(4); + row4 = PyList_New(4); + PyList_SetItem(row1, 0, PyInt_FromLong(1)); + PyList_SetItem(row1, 1, PyInt_FromLong(0)); + PyList_SetItem(row1, 2, PyInt_FromLong(0)); + PyList_SetItem(row1, 3, PyInt_FromLong(0)); + PyList_SetItem(row2, 0, PyInt_FromLong(0)); + PyList_SetItem(row2, 1, PyInt_FromLong(1)); + PyList_SetItem(row2, 2, PyInt_FromLong(0)); + PyList_SetItem(row2, 3, PyInt_FromLong(0)); + PyList_SetItem(row3, 0, PyInt_FromLong(0)); + PyList_SetItem(row3, 1, PyInt_FromLong(0)); + PyList_SetItem(row3, 2, PyInt_FromLong(1)); + PyList_SetItem(row3, 3, PyInt_FromLong(0)); + PyList_SetItem(row4, 0, PyInt_FromLong(0)); + PyList_SetItem(row4, 1, PyInt_FromLong(0)); + PyList_SetItem(row4, 2, PyInt_FromLong(0)); + PyList_SetItem(row4, 3, PyInt_FromLong(1)); + PyList_SetItem(self->inverseMatrix, 0, row1); + PyList_SetItem(self->inverseMatrix, 1, row2); + PyList_SetItem(self->inverseMatrix, 2, row3); + PyList_SetItem(self->inverseMatrix, 3, row4); + self->materials = PyList_New(0); + Py_INCREF(Py_None); + self->data = Py_None; + Py_INCREF(Py_None); + self->type = Py_None; + + return self; +} + +static void +obj_dealloc(objobject* self) +{ + objobject* obj = (objobject*) self; + + Py_DECREF(obj->matrix); + Py_DECREF(obj->inverseMatrix); + Py_DECREF(obj->materials); + Py_DECREF(obj->data); + Py_DECREF(obj->type); + + PyMem_DEL(self); +} + +static int +obj_print(objobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Object(name = \"%s\",\n", self->name); +/* fprintf(fp, " matrix = %s,\n", */ +/* PyString_AsString(mtx_repr((mtxobject*) self->matrix))); */ + if (self->type == Py_None) + { + fprintf(fp, " data = None)\n"); + } + else + { + fprintf(fp, " data = %s(\"%s\"))\n", + PyString_AsString(self->type), + PyString_AsString(self->data)); + } + + return 0; +} + +static PyObject* +obj_repr(objobject* self) +{ + PyObject* s; + + s = PyString_FromString("Object()\n"); + + return s; +} + +static PyObject* +obj_str(objobject* self) +{ + PyObject* s; + + s = PyString_FromString("Object()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist obj_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"data", T_OBJECT, offsetof(objobject, data), RO}, + {"matrix", T_OBJECT, offsetof(objobject, matrix), RO}, + {"inverseMatrix", T_OBJECT, offsetof(objobject, inverseMatrix), RO}, + {"materials", T_OBJECT, offsetof(objobject, materials), RO}, + {"type", T_OBJECT, offsetof(objobject, type), RO}, + {NULL} +}; + +static PyObject* +obj_getattr(objobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, obj_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(obj_methods, (PyObject*)self, name); +} + + +static int +obj_setattr(objobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, obj_memberlist, name, v); +} + +static char Objtype__doc__[] = +"" +; + +static PyTypeObject Objtype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Object", /*tp_name*/ + sizeof(objobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) obj_dealloc, /*tp_dealloc*/ + (printfunc) obj_print, /*tp_print*/ + (getattrfunc) obj_getattr, /*tp_getattr*/ + (setattrfunc) obj_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) obj_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) obj_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Objtype__doc__ /* Documentation string */ +}; + +/*********/ +/* scene */ +/*********/ + +static char sce_addObject__doc__[] = +"addObject(self, object)" +; + +static PyObject* +sce_addObject(sceobject* self, PyObject* args) +{ + int index; + PyObject* object = NULL; + + if (!PyArg_ParseTuple(args, "O", &object)) + { + return NULL; + } + PyList_Append(self->objects, object); + index = PyList_Size(self->objects) - 1; + + return PyInt_FromLong(index); +} + +static char sce_getCurrentCamera__doc__[] = +"getCurrentCamera(self)" +; + +static PyObject* +sce_getCurrentCamera(sceobject* self, PyObject* args) +{ + char* name = NULL; + PyObject* camera = NULL; + + if (!PyArg_ParseTuple(args, "")) + { + return NULL; + } + if (G.scene->camera) + { + name = G.scene->camera->id.name+2; + camera = blend_getObject(NULL, + Py_BuildValue("(O)", + PyString_FromString(name))); + + return camera; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static struct PyMethodDef sce_methods[] = { + {"addObject", (PyCFunction)sce_addObject, + METH_VARARGS, sce_addObject__doc__}, + {"getCurrentCamera", (PyCFunction)sce_getCurrentCamera, + METH_VARARGS, sce_getCurrentCamera__doc__}, + + { NULL, NULL } +}; + +static sceobject* +newsceobject(char* name) +{ + sceobject* self; + + self = PyObject_NEW(sceobject, &Scetype); + if (self == NULL) + { + return NULL; + } + strcpy(self->name, name); + self->objects = PyList_New(0); + + return self; +} + +static void +sce_dealloc(sceobject* self) +{ + sceobject* sce = (sceobject*) self; + + Py_DECREF(sce->objects); + + PyMem_DEL(self); +} + +static int +sce_print(sceobject* self, FILE* fp, int flags) +{ + fprintf(fp, "Scene(name = \"%s\",\n", self->name); + fprintf(fp, " objects = %d)\n", PyList_Size(self->objects)); + + return 0; +} + +static PyObject* +sce_repr(sceobject* self) +{ + PyObject* s; + + s = PyString_FromString("Scene()\n"); + + return s; +} + +static PyObject* +sce_str(sceobject* self) +{ + PyObject* s; + + s = PyString_FromString("Scene()\n"); + + return s; +} + +#include "structmember.h" + +static struct memberlist sce_memberlist[] = { + /* XXXX Add lines like { "foo", T_INT, OFF(foo), RO } */ + {"objects", T_OBJECT, offsetof(sceobject, objects), RO}, + {NULL} +}; + +static PyObject* +sce_getattr(sceobject* self, char* name) +{ + PyObject* rv; + + /* XXXX Add your own getattr code here */ + rv = PyMember_Get((char*) self, sce_memberlist, name); + if (rv) + { + return rv; + } + PyErr_Clear(); + + return Py_FindMethod(sce_methods, (PyObject*)self, name); +} + + +static int +sce_setattr(sceobject* self, char* name, PyObject* v) +{ + /* XXXX Add your own setattr code here */ + if ( v == NULL ) + { + PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); + return -1; + } + + return PyMember_Set((char*)/*XXXX*/0, sce_memberlist, name, v); +} + +static char Scetype__doc__[] = +"" +; + +static PyTypeObject Scetype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Scene", /*tp_name*/ + sizeof(sceobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) sce_dealloc, /*tp_dealloc*/ + (printfunc) sce_print, /*tp_print*/ + (getattrfunc) sce_getattr, /*tp_getattr*/ + (setattrfunc) sce_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) sce_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc) 0, /*tp_hash*/ + (ternaryfunc) 0, /*tp_call*/ + (reprfunc) sce_str, /*tp_str*/ + + /* Space for future expansion */ + 0L,0L,0L,0L, + Scetype__doc__ /* Documentation string */ +}; + +static char blend_Mesh__doc__[] = +"Creates an (empty) instance of a Blender mesh.\n\ + E.g.: \"m = Blender.Mesh('Plane')\"\n\ + To create faces first add vertices with \n\ + \"i1 = m.addVertex(x, y, z, nx, ny, nz, r = -1.0, r = 0.0, b = 0.0)\"\n\ + then create faces with \n\ + \"index = m.addFace(i1, i2, i3, i4, isSmooth, matIndex)\".\ +" +; + +static PyObject* +blend_Mesh(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + { + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static char blend_Object__doc__[] = +"Creates an instance of a Blender object" +; + +static PyObject* +blend_Object(PyObject* self, PyObject* args) +{ + char* name = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + + return ((PyObject*) newobjobject(name)); +} + +static char blend_Scene__doc__[] = +"Creates an instance of a Blender scene" +; + +static PyObject* +blend_Scene(PyObject* self, PyObject* args) +{ + char* name = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + + return ((PyObject*) newsceobject(name)); +} + +static char blend_addMesh__doc__[] = +"Blender.addMesh(type, sceneName)\n\ + where type is one of [\"Plane\"]" +; + +static PyObject* +blend_addMesh(PyObject* self, PyObject* args) +{ + char* type = NULL; + char* sceneName = NULL; + PyObject* tuple = NULL; + PyObject* object = NULL; + PyObject* mesh = NULL; + PyObject* index = NULL; + PyObject* indices = NULL; + objobject* obj = NULL; + mshobject* msh = NULL; + + if (!PyArg_ParseTuple(args, "ss", &type, &sceneName)) + { + return NULL; + } + + if (strcmp(type, "Plane") == 0) + { + obj = newobjobject(type); + msh = newmshobject(type); + object = (PyObject*) obj; + mesh = (PyObject*) msh; + indices = PyList_New(6); + /* vertices */ + index = msh_addVertex((mshobject*) mesh, + Py_BuildValue("ffffff", + 1.0, 1.0, 0.0, 0.0, 0.0, 1.0)); + PyList_SetItem(indices, 0, index); + index = msh_addVertex((mshobject*) mesh, + Py_BuildValue("ffffff", + 1.0, -1.0, 0.0, 0.0, 0.0, 1.0)); + PyList_SetItem(indices, 1, index); + index = msh_addVertex((mshobject*) mesh, + Py_BuildValue("ffffff", + -1.0, -1.0, 0.0, 0.0, 0.0, 1.0)); + PyList_SetItem(indices, 2, index); + index = msh_addVertex((mshobject*) mesh, + Py_BuildValue("ffffff", + -1.0, 1.0, 0.0, 0.0, 0.0, 1.0)); + PyList_SetItem(indices, 3, index); + PyList_SetItem(indices, 4, PyInt_FromLong(0)); /* smooth flag */ + PyList_SetItem(indices, 5, PyInt_FromLong(0)); /* material index */ + /* faces */ + msh_addFace((mshobject*) mesh, + Py_BuildValue("OOOOOO", + PyList_GetItem(indices, 0), + PyList_GetItem(indices, 3), + PyList_GetItem(indices, 2), + PyList_GetItem(indices, 1), + PyList_GetItem(indices, 4), + PyList_GetItem(indices, 5))); + /* connection */ + blend_connect(self, Py_BuildValue("OO", + PyString_FromString(obj->name), + PyString_FromString(msh->name))); + blend_connect(self, Py_BuildValue("OO", + PyString_FromString(sceneName), + PyString_FromString(obj->name))); + /* return value */ + tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, object); + PyTuple_SetItem(tuple, 1, mesh); + + return tuple; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static char blend_connect__doc__[] = +"connect(obj1, obj2)" +; + +static PyObject* +blend_connect(PyObject* self, PyObject* args) +{ + PyObject* obj1 = NULL; + PyObject* obj2 = NULL; + + if (!PyArg_ParseTuple(args, "OO", &obj1, &obj2)) + { + return NULL; + } + if (obj1->ob_type == &Objtype) + { + if (obj2->ob_type == &Mshtype) + { + Py_INCREF(obj2); + ((objobject*) obj1)->data = obj2; + ((objobject*) obj1)->type = PyString_FromString("Mesh"); + } + } + else if (obj1->ob_type == &Scetype) + { + if (obj2->ob_type == &Objtype) + { + sce_addObject((sceobject*) obj1, Py_BuildValue("(O)", obj2)); + } + } + + Py_INCREF(Py_None); + return Py_None; +} + +static char blend_getCamera__doc__[] = +"getCamera()" +; + +static PyObject* +blend_getCamera(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Camera* cam = NULL; + camobject* camera = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->camera.first, name); + if (list) + { + cam = (Camera*) list; + camera = newcamobject(cam->id.name+2); + camera->Lens = PyFloat_FromDouble(cam->lens); + camera->ClSta = PyFloat_FromDouble(cam->clipsta); + camera->ClEnd = PyFloat_FromDouble(cam->clipend); + + return (PyObject*) camera; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static char blend_getCurrentScene__doc__[] = +"getCurrentScene()" +; + +static PyObject* +blend_getCurrentScene(PyObject* self, PyObject* args) +{ + char* name = NULL; + sceobject* scene = NULL; + Base* base = NULL; + Object* obj = NULL; + + if (!PyArg_ParseTuple(args, "")) + { + return NULL; + } + + /* create scene in Python */ + name = G.scene->id.name+2; + scene = newsceobject(name); + + /* add existing objects */ + base = G.scene->base.first; + while (base) + { + obj = base->object; + PyList_Append(scene->objects, PyString_FromString(obj->id.name+2)); + base = base->next; + } + + return (PyObject*) scene; +} + +static char blend_getDisplaySettings__doc__[] = +"getDisplaySettings()" +; + +static PyObject* +blend_getDisplaySettings(PyObject* self, PyObject* args) +{ + RenderData* rd = NULL; + dspobject* displayObject = NULL; + + if (!PyArg_ParseTuple(args, "")) + { + return NULL; + } + rd = &(G.scene->r); + displayObject = newdspobject(); + displayObject->startFrame = PyInt_FromLong(rd->sfra); + displayObject->endFrame = PyInt_FromLong(rd->efra); + displayObject->currentFrame = PyInt_FromLong(rd->cfra); + displayObject->xResolution = PyInt_FromLong(rd->xsch); + displayObject->yResolution = PyInt_FromLong(rd->ysch); + displayObject->pixelAspectRatio = PyInt_FromLong(rd->yasp / + (1.0 * rd->xasp)); + + return (PyObject*) displayObject; +} + +static char blend_getLamp__doc__[] = +"getLamp(name)" +; + +static PyObject* +blend_getLamp(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Lamp* lmp = NULL; + lmpobject* lamp = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->lamp.first, name); + if (list) + { + lmp = (Lamp*) list; + lamp = newlmpobject(lmp->id.name+2); + lamp->R = PyFloat_FromDouble(lmp->r); + lamp->G = PyFloat_FromDouble(lmp->g); + lamp->B = PyFloat_FromDouble(lmp->b); +/* lamp->Dist = PyFloat_FromDouble(lmp->dist); */ +/* lamp->SpoSi = PyFloat_FromDouble(lmp->spotsize); */ +/* lamp->SpoBl = PyFloat_FromDouble(lmp->spotblend); */ +/* lamp->Quad1 = PyFloat_FromDouble(lmp->att1); */ +/* lamp->Quad2 = PyFloat_FromDouble(lmp->att2); */ +/* lamp->HaInt = PyFloat_FromDouble(lmp->haint); */ + +/* lamp->OfsX = PyFloat_FromDouble(lmp->); */ +/* lamp->OfsY = PyFloat_FromDouble(lmp->); */ +/* lamp->OfsZ = PyFloat_FromDouble(lmp->); */ +/* lamp->SizeX = PyFloat_FromDouble(lmp->); */ +/* lamp->SizeY = PyFloat_FromDouble(lmp->); */ +/* lamp->SizeZ = PyFloat_FromDouble(lmp->); */ +/* lamp->texR = PyFloat_FromDouble(lmp->); */ +/* lamp->texG = PyFloat_FromDouble(lmp->); */ +/* lamp->texB = PyFloat_FromDouble(lmp->); */ +/* lamp->DefVar = PyFloat_FromDouble(lmp->); */ +/* lamp->Col = PyFloat_FromDouble(lmp->); */ +/* lamp->Nor = PyFloat_FromDouble(lmp->); */ +/* lamp->Var = PyFloat_FromDouble(lmp->); */ + + return (PyObject*) lamp; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static char blend_getMaterial__doc__[] = +"getMaterial(name)" +; + +static PyObject* +blend_getMaterial(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Material* mat = NULL; + matobject* material = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->mat.first, name); + if (list) + { + mat = (Material*) list; + material = newmatobject(mat->id.name+2); + material->R = PyFloat_FromDouble(mat->r); + material->G = PyFloat_FromDouble(mat->g); + material->B = PyFloat_FromDouble(mat->b); + + return (PyObject*) material; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static char blend_getMesh__doc__[] = +"getMesh(name)" +; + +static PyObject* +blend_getMesh(PyObject* self, PyObject* args) +{ + int i; + float r, g, b; + char dummy[] = ""; + char* name = NULL; + char* filename = NULL; + uint* mcol = NULL; + ID* list = NULL; + Mesh* msh = NULL; + mshobject* mesh = NULL; + MFace* mface = NULL; + TFace* tface = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->mesh.first, name); + if (list) + { + msh = (Mesh*) list; + mesh = newmshobject(msh->id.name+2); + /* is there color information? */ + if (msh->mcol) + { + mcol = mcol_to_vcol(msh); + } + /* add vertices */ + for (i = 0; i < msh->totvert; i++) + { + if (msh->mcol && mcol) + { + mcol_to_rgb(*mcol, &r, &g, &b); + msh_addVertex(mesh, + Py_BuildValue("fffffffff", + msh->mvert[i].co[0], + msh->mvert[i].co[1], + msh->mvert[i].co[2], + msh->mvert[i].no[0] / 32767.0, + msh->mvert[i].no[1] / 32767.0, + msh->mvert[i].no[2] / 32767.0, + r, g, b)); + mcol++; + } + else + { + msh_addVertex(mesh, + Py_BuildValue("ffffff", + msh->mvert[i].co[0], + msh->mvert[i].co[1], + msh->mvert[i].co[2], + msh->mvert[i].no[0] / 32767.0, + msh->mvert[i].no[1] / 32767.0, + msh->mvert[i].no[2] / 32767.0)); + } + } + /* add faces */ + for (i = 0; i < msh->totface; i++) + { + mface = ((MFace*) msh->mface)+i; + msh_addFace(mesh, + Py_BuildValue("iiiiii", + mface->v1, mface->v2, + mface->v3, mface->v4, + mface->flag, mface->mat_nr)); + } + /* add texture coordinates */ + if (msh->tface) + { + tface = (TFace*) msh->tface; + if (tface->tpage) + { + filename = ((Image*) tface->tpage)->name; + } + else + { + filename = dummy; + } + msh_addTexture(mesh, + Py_BuildValue("(O)", PyString_FromString(filename))); + for (i = 0; i < msh->totface; i++) + { + tface = (TFace*) msh->tface+i; + msh_addTexCoords(mesh, + Py_BuildValue("ff", + tface->uv[0][0], + tface->uv[0][1])); + msh_addTexCoords(mesh, + Py_BuildValue("ff", + tface->uv[1][0], + tface->uv[1][1])); + msh_addTexCoords(mesh, + Py_BuildValue("ff", + tface->uv[2][0], + tface->uv[2][1])); + msh_addTexCoords(mesh, + Py_BuildValue("ff", + tface->uv[3][0], + tface->uv[3][1])); + } + } + + return (PyObject*) mesh; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static char blend_getObject__doc__[] = +"getObject(name)" +; + +static PyObject* +blend_getObject(PyObject* self, PyObject* args) +{ + int i; + float inverse[4][4]; + char* name = NULL; + ID* list = NULL; + Object* obj = NULL; + Mesh* msh = NULL; + objobject* object = NULL; + PyObject* row1 = NULL; + PyObject* row2 = NULL; + PyObject* row3 = NULL; + PyObject* row4 = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->object.first, name); + if (list) + { + obj = (Object*) list; + object = newobjobject(obj->id.name+2); + Py_DECREF(object->matrix); + object->matrix = PyList_New(4); + row1 = PyList_New(4); + row2 = PyList_New(4); + row3 = PyList_New(4); + row4 = PyList_New(4); + PyList_SetItem(row1, 0, PyFloat_FromDouble(obj->obmat[0][0])); + PyList_SetItem(row1, 1, PyFloat_FromDouble(obj->obmat[0][1])); + PyList_SetItem(row1, 2, PyFloat_FromDouble(obj->obmat[0][2])); + PyList_SetItem(row1, 3, PyFloat_FromDouble(obj->obmat[0][3])); + PyList_SetItem(row2, 0, PyFloat_FromDouble(obj->obmat[1][0])); + PyList_SetItem(row2, 1, PyFloat_FromDouble(obj->obmat[1][1])); + PyList_SetItem(row2, 2, PyFloat_FromDouble(obj->obmat[1][2])); + PyList_SetItem(row2, 3, PyFloat_FromDouble(obj->obmat[1][3])); + PyList_SetItem(row3, 0, PyFloat_FromDouble(obj->obmat[2][0])); + PyList_SetItem(row3, 1, PyFloat_FromDouble(obj->obmat[2][1])); + PyList_SetItem(row3, 2, PyFloat_FromDouble(obj->obmat[2][2])); + PyList_SetItem(row3, 3, PyFloat_FromDouble(obj->obmat[2][3])); + PyList_SetItem(row4, 0, PyFloat_FromDouble(obj->obmat[3][0])); + PyList_SetItem(row4, 1, PyFloat_FromDouble(obj->obmat[3][1])); + PyList_SetItem(row4, 2, PyFloat_FromDouble(obj->obmat[3][2])); + PyList_SetItem(row4, 3, PyFloat_FromDouble(obj->obmat[3][3])); + PyList_SetItem(object->matrix, 0, row1); + PyList_SetItem(object->matrix, 1, row2); + PyList_SetItem(object->matrix, 2, row3); + PyList_SetItem(object->matrix, 3, row4); + /* inverse matrix */ + Mat4Invert(inverse, obj->obmat); + Py_DECREF(object->inverseMatrix); + object->inverseMatrix = PyList_New(4); + row1 = PyList_New(4); + row2 = PyList_New(4); + row3 = PyList_New(4); + row4 = PyList_New(4); + PyList_SetItem(row1, 0, PyFloat_FromDouble(inverse[0][0])); + PyList_SetItem(row1, 1, PyFloat_FromDouble(inverse[0][1])); + PyList_SetItem(row1, 2, PyFloat_FromDouble(inverse[0][2])); + PyList_SetItem(row1, 3, PyFloat_FromDouble(inverse[0][3])); + PyList_SetItem(row2, 0, PyFloat_FromDouble(inverse[1][0])); + PyList_SetItem(row2, 1, PyFloat_FromDouble(inverse[1][1])); + PyList_SetItem(row2, 2, PyFloat_FromDouble(inverse[1][2])); + PyList_SetItem(row2, 3, PyFloat_FromDouble(inverse[1][3])); + PyList_SetItem(row3, 0, PyFloat_FromDouble(inverse[2][0])); + PyList_SetItem(row3, 1, PyFloat_FromDouble(inverse[2][1])); + PyList_SetItem(row3, 2, PyFloat_FromDouble(inverse[2][2])); + PyList_SetItem(row3, 3, PyFloat_FromDouble(inverse[2][3])); + PyList_SetItem(row4, 0, PyFloat_FromDouble(inverse[3][0])); + PyList_SetItem(row4, 1, PyFloat_FromDouble(inverse[3][1])); + PyList_SetItem(row4, 2, PyFloat_FromDouble(inverse[3][2])); + PyList_SetItem(row4, 3, PyFloat_FromDouble(inverse[3][3])); + PyList_SetItem(object->inverseMatrix, 0, row1); + PyList_SetItem(object->inverseMatrix, 1, row2); + PyList_SetItem(object->inverseMatrix, 2, row3); + PyList_SetItem(object->inverseMatrix, 3, row4); + Py_DECREF(object->materials); + object->materials = PyList_New(obj->totcol); + for (i = 0; i < obj->totcol; i++) + { + if (obj->mat[i]) + { + PyList_SetItem(object->materials, i, + PyString_FromString(obj->mat[i]->id.name+2)); + } + else + { + Py_INCREF(Py_None); + PyList_SetItem(object->materials, i, Py_None); + } + } /* check type */ + switch (obj->type) + { + case OB_EMPTY: + printf("Empty\n"); + break; + case OB_MESH: + object->data = PyString_FromString(((Mesh*) obj->data)->id.name+2); + object->type = PyString_FromString("Mesh"); + msh = (Mesh*) obj->data; + for (i = 0; i < msh->totcol; i++) + { + if (msh->mat[i]) + { + PyList_SetItem(object->materials, i, + PyString_FromString(msh->mat[i]->id.name+2)); + } + } + break; + case OB_CURVE: + printf("Curve\n"); + break; + case OB_SURF: + printf("Surface\n"); + break; + case OB_FONT: + printf("Font\n"); + break; + case OB_MBALL: + printf("Metaball\n"); + break; + case OB_LAMP: + object->data = PyString_FromString(((Lamp*) obj->data)->id.name+2); + object->type = PyString_FromString("Lamp"); + break; + case OB_CAMERA: + object->data = PyString_FromString(((Camera*) obj->data)->id.name+2); + object->type = PyString_FromString("Camera"); + break; + case OB_IKA: + printf("Ika\n"); + break; + case OB_WAVE: + printf("Wave\n"); + break; + case OB_LATTICE: + printf("Lattice\n"); + break; + default: + printf("ERROR: py_main.c:blend_getObject(...)\n"); + printf(" unknown type ...\n"); + break; + } + + return (PyObject*) object; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +static char blend_isCamera__doc__[] = +"isCamera(name)" +; + +static PyObject* +blend_isCamera(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Object* obj = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->object.first, name); + if (list) + { + obj = (Object*) list; + if (obj->type == OB_CAMERA) + { + return PyInt_FromLong(1); + } + else + { + return PyInt_FromLong(0); + } + } + else + { + return NULL; + } +} + +static char blend_isLamp__doc__[] = +"isLamp(name)" +; + +static PyObject* +blend_isLamp(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Object* obj = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->object.first, name); + if (list) + { + obj = (Object*) list; + if (obj->type == OB_LAMP) + { + return PyInt_FromLong(1); + } + else + { + return PyInt_FromLong(0); + } + } + else + { + return NULL; + } +} + +static char blend_isMesh__doc__[] = +"isMesh(name)" +; + +static PyObject* +blend_isMesh(PyObject* self, PyObject* args) +{ + char* name = NULL; + ID* list = NULL; + Object* obj = NULL; + + if (!PyArg_ParseTuple(args, "s", &name)) + { + return NULL; + } + list = find_name_in_list((ID*) G.main->object.first, name); + if (list) + { + obj = (Object*) list; + if (obj->type == OB_MESH) + { + return PyInt_FromLong(1); + } + else + { + return PyInt_FromLong(0); + } + } + else + { + return NULL; + } +} + +static char blend_setCurrentFrame__doc__[] = +"setCurrentFrame(frame)" +; + +static PyObject* +blend_setCurrentFrame(PyObject* self, PyObject* args) +{ + int frame = -1; + + if (!PyArg_ParseTuple(args, "i", &frame)) + { + return NULL; + } + CFRA = frame; + drawview3d(); + + Py_INCREF(Py_None); + return Py_None; +} + +/* List of methods defined in the module */ + +static struct PyMethodDef blend_methods[] = { + {"Mesh", (PyCFunction) blend_Mesh, + METH_VARARGS, blend_Mesh__doc__}, + {"Object", (PyCFunction) blend_Object, + METH_VARARGS, blend_Object__doc__}, + {"Scene", (PyCFunction) blend_Scene, + METH_VARARGS, blend_Scene__doc__}, + {"addMesh", (PyCFunction) blend_addMesh, + METH_VARARGS, blend_addMesh__doc__}, + {"connect", (PyCFunction) blend_connect, + METH_VARARGS, blend_connect__doc__}, + {"getCamera", (PyCFunction) blend_getCamera, + METH_VARARGS, blend_getCamera__doc__}, + {"getCurrentScene", (PyCFunction) blend_getCurrentScene, + METH_VARARGS, blend_getCurrentScene__doc__}, + {"getDisplaySettings", (PyCFunction) blend_getDisplaySettings, + METH_VARARGS, blend_getDisplaySettings__doc__}, + {"getLamp", (PyCFunction) blend_getLamp, + METH_VARARGS, blend_getLamp__doc__}, + {"getMaterial", (PyCFunction) blend_getMaterial, + METH_VARARGS, blend_getMaterial__doc__}, + {"getMesh", (PyCFunction) blend_getMesh, + METH_VARARGS, blend_getMesh__doc__}, + {"getObject", (PyCFunction) blend_getObject, + METH_VARARGS, blend_getObject__doc__}, + {"isCamera", (PyCFunction) blend_isCamera, + METH_VARARGS, blend_isCamera__doc__}, + {"isLamp", (PyCFunction) blend_isLamp, + METH_VARARGS, blend_isLamp__doc__}, + {"isMesh", (PyCFunction) blend_isMesh, + METH_VARARGS, blend_isMesh__doc__}, + {"setCurrentFrame", (PyCFunction) blend_setCurrentFrame, + METH_VARARGS, blend_setCurrentFrame__doc__}, + { NULL, (PyCFunction) NULL, 0, NULL } +}; + +static char Blender_module_documentation[] = +"This is the Python API for Blender" +; + +void +initBlender() +{ + PyObject* m; + PyObject* d; + + /* Create the module and add the functions */ + m = Py_InitModule4("Blender", blend_methods, + Blender_module_documentation, + (PyObject*)NULL,PYTHON_API_VERSION); + + /* Add some symbolic constants to the module */ + d = PyModule_GetDict(m); + ErrorObject = PyString_FromString("Blender.error"); + PyDict_SetItemString(d, "error", ErrorObject); + + /* XXXX Add constants here */ + + /* Check for errors */ + if (PyErr_Occurred()) + { + Py_FatalError("can't initialize module Blender"); + } +} +/* Jan Walter's stuff */ |