diff options
author | Michel Selten <michel@mselten.demon.nl> | 2003-11-22 21:33:54 +0300 |
---|---|---|
committer | Michel Selten <michel@mselten.demon.nl> | 2003-11-22 21:33:54 +0300 |
commit | 2b59d04f9607f74700b9869ed4c6aa886600ac22 (patch) | |
tree | 210de37c0daa7d107b7ebdcd74c735583b19b5e1 /source/blender/bpython/intern/opy_nmesh.c | |
parent | ef9bfdcc7513a1928ce3773c0962f2b07e1ac574 (diff) |
Last part of removing the old Python API implementation. Removed
/source/blender/bpython.
To remove the directories on your system, do a:
cvs update -P
Diffstat (limited to 'source/blender/bpython/intern/opy_nmesh.c')
-rw-r--r-- | source/blender/bpython/intern/opy_nmesh.c | 1720 |
1 files changed, 0 insertions, 1720 deletions
diff --git a/source/blender/bpython/intern/opy_nmesh.c b/source/blender/bpython/intern/opy_nmesh.c deleted file mode 100644 index 418d953f59e..00000000000 --- a/source/blender/bpython/intern/opy_nmesh.c +++ /dev/null @@ -1,1720 +0,0 @@ -/* python.c MIXED MODEL - * - * june 99 - * $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 ***** - */ - -#include "Python.h" -#include "BPY_macros.h" -#include "b_interface.h" -#include "BPY_tools.h" -#include "BPY_main.h" - -#include "opy_datablock.h" -#include "opy_nmesh.h" - -#include "MEM_guardedalloc.h" -#include "BIF_editmesh.h" /* vertexnormals_mesh() */ -#include "BDR_editface.h" /* make_tfaces */ - -#include "BKE_mesh.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_displist.h" -#include "BKE_screen.h" -#include "BKE_object.h" -#include "BPY_objtypes.h" -#include "BLI_blenlib.h" -#include "BIF_space.h" - -#include "opy_vector.h" - -#include "b_interface.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/* PROTOS */ - -static int convert_NMeshToMesh(Mesh *mesh, NMesh *nmesh); -static int unlink_existingMeshdata(Mesh *mesh); -void initNMesh(void); -PyObject *init_py_nmesh(void); -int BPY_check_sequence_consistency(PyObject *seq, PyTypeObject *against); - -/* TYPE OBJECTS */ - -PyTypeObject NMesh_Type; -PyTypeObject NMFace_Type; -PyTypeObject NMVert_Type; -PyTypeObject NMCol_Type; - -/* DEFINES */ - - -#define COL_R (b) -#define COL_G (g) -#define COL_B (r) -#define COL_A (a) - -#define COLOR_CONVERT(col,comp) (col##->COL_##) - -/* GLOBALS */ - -static PyObject *g_nmeshmodule = NULL; - -/*****************************/ -/* Mesh Color Object */ -/*****************************/ - -static void NMCol_dealloc(PyObject *self) { - PyMem_DEL(self); -} - -static NMCol *newcol (char r, char g, char b, char a) { - NMCol *mc= (NMCol *) PyObject_NEW(NMCol, &NMCol_Type); - - mc->r= r; - mc->g= g; - mc->b= b; - mc->a= a; - - return mc; -} - -static char NMeshmodule_Col_doc[]= -"([r, g, b, a]) - Get a new mesh color\n\ -\n\ -[r=255, g=255, b=255, a=255] Specify the color components"; - -static PyObject *NMeshmodule_Col(PyObject *self, PyObject *args) { - int r=255, g=255, b=255, a=255; - -/* -if(PyArg_ParseTuple(args, "fff|f", &fr, &fg, &fb, &fa)) - return (PyObject *) newcol(255.0 * fr, 255.0 * fg, 255.0 * fb, 255.0 * fa); - */ - if(PyArg_ParseTuple(args, "|iiii", &r, &g, &b, &a)) - return (PyObject *) newcol(r, g, b, a); - return NULL; -} - -static PyObject *NMCol_getattr(PyObject *self, char *name) { - NMCol *mc= (NMCol *) self; - - if (strcmp(name, "r")==0) return Py_BuildValue("i", mc->r); - else if (strcmp(name, "g")==0) return Py_BuildValue("i", mc->g); - else if (strcmp(name, "b")==0) return Py_BuildValue("i", mc->b); - else if (strcmp(name, "a")==0) return Py_BuildValue("i", mc->a); - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -static int NMCol_setattr(PyObject *self, char *name, PyObject *v) { - NMCol *mc= (NMCol *) self; - int ival; - - if(!PyArg_Parse(v, "i", &ival)) return -1; - - CLAMP(ival, 0, 255); - - if (strcmp(name, "r")==0) mc->r= ival; - else if (strcmp(name, "g")==0) mc->g= ival; - else if (strcmp(name, "b")==0) mc->b= ival; - else if (strcmp(name, "a")==0) mc->a= ival; - else return -1; - - return 0; -} - -PyObject *NMCol_repr(NMCol *self) -{ - static char s[256]; - sprintf (s, "[NMCol - <%d, %d, %d, %d>]", self->r, self->g, self->b, self->a); - return Py_BuildValue("s", s); -} - -PyTypeObject NMCol_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "NMCol", /*tp_name*/ - sizeof(NMCol), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor) NMCol_dealloc, /*tp_dealloc*/ - (printfunc) 0, /*tp_print*/ - (getattrfunc) NMCol_getattr, /*tp_getattr*/ - (setattrfunc) NMCol_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc) NMCol_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; - - -/*****************************/ -/* NMesh Python Object */ -/*****************************/ - - -static void NMFace_dealloc(PyObject *self) { - NMFace *mf= (NMFace *) self; - - Py_DECREF(mf->v); - Py_DECREF(mf->uv); - Py_DECREF(mf->col); - - PyMem_DEL(self); - -} - -static NMFace *newNMFace(PyObject *vertexlist) { - NMFace *mf= PyObject_NEW(NMFace, &NMFace_Type); - - mf->v= vertexlist; - mf->uv= PyList_New(0); - mf->tpage= NULL; - mf->mode = TF_DYNAMIC + TF_TEX; - mf->flag= TF_SELECT; - mf->transp= TF_SOLID; - mf->col= PyList_New(0); - - mf->smooth= 0; - mf->mat_nr= 0; - - return mf; -} - -static char NMeshmodule_Face_doc[]= -"(vertexlist = None) - Get a new face, and pass optional vertex list"; -static PyObject *NMeshmodule_Face(PyObject *self, PyObject *args) { - PyObject *vertlist = NULL; - BPY_TRY(PyArg_ParseTuple(args, "|O!", &PyList_Type, &vertlist)); - - if (!vertlist) { - vertlist = PyList_New(0); - } - return (PyObject *) newNMFace(vertlist); -} - -/* XXX this code will be used later... -static PyObject *Method_getmode(PyObject *self, PyObject *args) { - PyObject *dict, *list; - PyObject *constants, *values, *c; - int flag; - int i, n; - - list = PyList_New(0); - dict = PyObject_GetAttrString(g_nmeshmodule, "Const"); - - if (!dict) return 0; - - constants = PyDict_Keys(dict); - values = PyDict_Values(dict); - - n = PySequence_Length(constants); - for (i = 0; i < n; i++) - { - flag = PyInt_AsLong(PySequence_GetItem(values, i)); - if (flag & ((NMFace*) self)->mode) - { - c = PySequence_GetItem(constants, i); - PyList_Append(list, c) - } - } - return list; -} -*/ - -static char NMFace_append_doc[]= "(vert) - appends Vertex 'vert' to face vertex list"; - -static PyObject *NMFace_append(PyObject *self, PyObject *args) -{ - PyObject *vert; - NMFace *f= (NMFace *) self; - - BPY_TRY(PyArg_ParseTuple(args, "O!", &NMVert_Type, &vert)); - PyList_Append(f->v, vert); - RETURN_INC(Py_None); -} - - -#undef MethodDef -#define MethodDef(func) {#func, NMFace_##func, METH_VARARGS, NMFace_##func##_doc} - -static struct PyMethodDef NMFace_methods[] = { - MethodDef(append), - {NULL, NULL} -}; - -static PyObject *NMFace_getattr(PyObject *self, char *name) { - NMFace *mf= (NMFace *) self; - - if(strcmp(name, "v")==0) - return Py_BuildValue("O", mf->v); - else if (strcmp(name, "col")==0) - return Py_BuildValue("O", mf->col); - else if (strcmp(name, "mat")==0) // emulation XXX - return Py_BuildValue("i", mf->mat_nr); - else if (strcmp(name, "materialIndex")==0) - return Py_BuildValue("i", mf->mat_nr); - else if (strcmp(name, "smooth")==0) - return Py_BuildValue("i", mf->smooth); - else if (strcmp(name, "image")==0) { - if (mf->tpage) - return Py_BuildValue("O", (PyObject *) mf->tpage); - else - RETURN_INC(Py_None); - } - else if (strcmp(name, "mode")==0) - return Py_BuildValue("i", mf->mode); - else if (strcmp(name, "flag")==0) - return Py_BuildValue("i", mf->flag); - else if (strcmp(name, "transp")==0) - return Py_BuildValue("i", mf->transp); - else if (strcmp(name, "uv")==0) - return Py_BuildValue("O", mf->uv); - - return Py_FindMethod(NMFace_methods, (PyObject*)self, name); -/* - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -*/ -} - -static int NMFace_setattr(PyObject *self, char *name, PyObject *v) { - NMFace *mf= (NMFace *) self; - int ival; - PyObject *tmp; - - if (STREQ(name, "v")) { - if(PySequence_Check(v)) { - Py_DECREF(mf->v); - mf->v= BPY_incr_ret(v); - - return 0; - } - } else if (STREQ(name, "col")) { - if(PySequence_Check(v)) { - Py_DECREF(mf->col); - mf->col= BPY_incr_ret(v); - - return 0; - } - } else if (STREQ(name, "mat") || STREQ(name, "materialIndex")) { - PyArg_Parse(v, "i", &ival); - - mf->mat_nr= ival; - - return 0; - } else if (STREQ(name, "smooth")) { - PyArg_Parse(v, "i", &ival); - - mf->smooth= ival?1:0; - - return 0; - } else if (STREQ(name, "uv")) { - if(PySequence_Check(v)) { - Py_DECREF(mf->uv); - mf->uv= BPY_incr_ret(v); - return 0; - } - } else if (STREQ(name, "flag")) { - PyArg_Parse(v, "i", &ival); - mf->flag = ival; - return 0; - } else if (STREQ(name, "mode")) { - PyArg_Parse(v, "i", &ival); - mf->mode = ival; - return 0; - } else if (STREQ(name, "transp")) { - PyArg_Parse(v, "i", &ival); - mf->transp = ival; - return 0; - } else if (STREQ(name, "image")) { - PyArg_Parse(v, "O", &tmp); - if (tmp == Py_None) { - mf->tpage = 0; - return 0; - } - if (!DataBlock_isType((DataBlock *) tmp, ID_IM)) - { - PyErr_SetString(PyExc_TypeError, "expects Image Datablock type"); - return -1; - } - mf->tpage = (DataBlock *) tmp; - return 0; - } - - PyErr_SetString(PyExc_AttributeError, name); - return -1; -} - -static PyObject *NMFace_repr (PyObject *self) -{ - return PyString_FromString("[NMFace]"); -} - -static int NMFace_len(NMFace *self) -{ - return PySequence_Length(self->v); -} - -static PyObject *NMFace_item(NMFace *self, int i) -{ - return PySequence_GetItem(self->v, i); // new ref -} - -static PyObject *NMFace_slice(NMFace *self, int begin, int end) -{ - return PyList_GetSlice(self->v, begin, end); // new ref -} - -static PySequenceMethods NMFace_SeqMethods = { - (inquiry) NMFace_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (intargfunc) 0, /* sq_repeat */ - (intargfunc) NMFace_item, /* sq_item */ - (intintargfunc) NMFace_slice, /* sq_slice */ - (intobjargproc) 0, /* sq_ass_item */ - (intintobjargproc) 0, /* sq_ass_slice */ -}; - - -PyTypeObject NMFace_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "NMFace", /*tp_name*/ - sizeof(NMFace), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor) NMFace_dealloc, /*tp_dealloc*/ - (printfunc) 0, /*tp_print*/ - (getattrfunc) NMFace_getattr, /*tp_getattr*/ - (setattrfunc) NMFace_setattr,/*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc) NMFace_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - &NMFace_SeqMethods, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; - - -static NMVert *newvert(float *co) { - NMVert *mv= PyObject_NEW(NMVert, &NMVert_Type); - - VECCOPY(mv->co, co); - mv->no[0]= mv->no[1]= mv->no[2]= 0.0; - mv->uvco[0]= mv->uvco[1]= mv->uvco[2]= 0.0; - - return mv; -} - -static char NMeshmodule_Vert_doc[]= -"([x, y, z]) - Get a new vertice\n\ -\n\ -[x, y, z] Specify new coordinates"; - -static PyObject *NMeshmodule_Vert(PyObject *self, PyObject *args) { - float co[3]= {0.0, 0.0, 0.0}; - - BPY_TRY(PyArg_ParseTuple(args, "|fff", &co[0], &co[1], &co[2])); - - return (PyObject *) newvert(co); -} - -static void NMVert_dealloc(PyObject *self) { - PyMem_DEL(self); -} - -static PyObject *NMVert_getattr(PyObject *self, char *name) { - NMVert *mv= (NMVert *) self; - - if (STREQ(name, "co") || STREQ(name, "loc")) return newVectorObject(mv->co, 3); - else if (STREQ(name, "no")) return newVectorObject(mv->no, 3); - else if (STREQ(name, "uvco")) return newVectorObject(mv->uvco, 3); - else if (STREQ(name, "index")) return PyInt_FromLong(mv->index); - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -static int NMVert_setattr(PyObject *self, char *name, PyObject *v) { - NMVert *mv= (NMVert *) self; - int i; - - if (STREQ(name,"index")) { - PyArg_Parse(v, "i", &i); - mv->index= i; - return 0; - } else if (STREQ(name, "uvco")) { - if (!PyArg_ParseTuple(v, "ff|f", &(mv->uvco[0]), &(mv->uvco[1]), &(mv->uvco[2]))) { - PyErr_SetString(PyExc_AttributeError, "Vector tuple or triple expected"); - return -1; - } - return 0; -/* -PyErr_SetString(PyExc_AttributeError, "Use slice assignment: uvco[i]"); - return -1; - */ - } - - PyErr_SetString(PyExc_AttributeError, name); - return -1; -} - - -static int NMVert_len(NMVert *self) { - return 3; -} - -static PyObject *NMVert_item(NMVert *self, int i) -{ - if (i < 0 || i >= 3) { - PyErr_SetString(PyExc_IndexError, "array index out of range"); - return NULL; - } - return Py_BuildValue("f", self->co[i]); -} - -static PyObject *NMVert_slice(NMVert *self, int begin, int end) -{ - PyObject *list; - int count; - - if (begin<0) begin= 0; - if (end>3) end= 3; - if (begin>end) begin= end; - - list= PyList_New(end-begin); - - for (count= begin; count<end; count++) - PyList_SetItem(list, count-begin, PyFloat_FromDouble(self->co[count])); - - return list; -} - -static int NMVert_ass_item(NMVert *self, int i, PyObject *ob) -{ - if (i < 0 || i >= 3) { - PyErr_SetString(PyExc_IndexError, "array assignment index out of range"); - return -1; - } - - if (!PyNumber_Check(ob)) { - PyErr_SetString(PyExc_IndexError, "NMVert member must be a number"); - return -1; - } - - self->co[i]= PyFloat_AsDouble(ob); -/* if(!PyArg_Parse(ob, "f", &)) return -1; */ - - return 0; -} - -/** I guess this hurts... - * sorry, couldn't resist (strubi) */ - -static int NMVert_ass_slice(NMVert *self, int begin, int end, PyObject *seq) -{ - int count; - - if (begin<0) begin= 0; - if (end>3) end= 3; - if (begin>end) begin= end; - - if (!PySequence_Check(seq)) { - PyErr_SetString(PyExc_TypeError, "illegal argument type for built-in operation"); - return -1; - } - - if (PySequence_Length(seq)!=(end-begin)) { - PyErr_SetString(PyExc_TypeError, "size mismatch in slice assignment"); - return -1; - } - - for (count= begin; count<end; count++) { - PyObject *ob= PySequence_GetItem(seq, count); - if (!PyArg_Parse(ob, "f", &self->co[count])) { - Py_DECREF(ob); - return -1; - } - Py_DECREF(ob); - } - - return 0; -} - -static PySequenceMethods NMVert_SeqMethods = { - (inquiry) NMVert_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (intargfunc) 0, /* sq_repeat */ - (intargfunc) NMVert_item, /* sq_item */ - (intintargfunc) NMVert_slice, /* sq_slice */ - (intobjargproc) NMVert_ass_item, /* sq_ass_item */ - (intintobjargproc) NMVert_ass_slice, /* sq_ass_slice */ -}; - -PyTypeObject NMVert_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "NMVert", /*tp_name*/ - sizeof(NMVert), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor) NMVert_dealloc, /*tp_dealloc*/ - (printfunc) 0, /*tp_print*/ - (getattrfunc) NMVert_getattr, /*tp_getattr*/ - (setattrfunc) NMVert_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc) 0, /*tp_repr*/ - 0, /*tp_as_number*/ - &NMVert_SeqMethods, /*tp_as_sequence*/ -}; - - -static void NMesh_dealloc(PyObject *self) { - NMesh *me= (NMesh *) self; - - Py_DECREF(me->name); - Py_DECREF(me->verts); - Py_DECREF(me->faces); - - PyMem_DEL(self); -} - - -static char NMesh_getSelectedFaces_doc[] = "(flag = None) - returns list of selected Faces\n\ -If flag = 1, return indices instead"; -static PyObject *NMesh_getSelectedFaces(PyObject *self, PyObject *args) -{ - NMesh *nm= (NMesh *) self; - Mesh *me = nm->mesh; - int flag = 0; - - TFace *tf; - int i; - PyObject *l= PyList_New(0); - - if (me == NULL) return NULL; - - tf = me->tface; - if (tf == 0) { - return l; - } - - if (!PyArg_ParseTuple(args, "|i", &flag)) - return NULL; - if (flag) { - for (i =0 ; i < me->totface; i++) { - if (tf[i].flag & TF_SELECT ) { - PyList_Append(l, PyInt_FromLong(i)); - } - } - } else { - for (i =0 ; i < me->totface; i++) { - if (tf[i].flag & TF_SELECT ) { - PyList_Append(l, PyList_GetItem(nm->faces, i)); - } - } - } - return l; -} - - -static char NMesh_getActiveFace_doc[] = "returns the index of the active face "; -static PyObject *NMesh_getActiveFace(PyObject *self, PyObject *args) -{ - if (((NMesh *)self)->sel_face < 0) - RETURN_INC(Py_None); - return Py_BuildValue("i", ((NMesh *)self)->sel_face); -} - -static char NMesh_hasVertexUV_doc[] = "(flag = None) - returns 1 if Mesh has per vertex UVs ('Sticky')\n\ -The optional argument sets the Sticky flag"; - -static PyObject *NMesh_hasVertexUV(PyObject *self, PyObject *args) -{ - NMesh *me= (NMesh *) self; - int flag; - - if (args) { - if (PyArg_ParseTuple(args, "i", &flag)) { - if(flag) me->flags |= NMESH_HASVERTUV; - else me->flags &= ~NMESH_HASVERTUV; - } - } - PyErr_Clear(); - if (me->flags & NMESH_HASVERTUV) - return BPY_incr_ret(Py_True); - else - return BPY_incr_ret(Py_False); -} - -static char NMesh_hasFaceUV_doc[] = "(flag = None) - returns 1 if Mesh has textured faces\n\ -The optional argument sets the textured faces flag"; - -static PyObject *NMesh_hasFaceUV(PyObject *self, PyObject *args) -{ - NMesh *me= (NMesh *) self; - int flag = -1; - - BPY_TRY(PyArg_ParseTuple(args, "|i", &flag)); - - switch (flag) { - case 0: - me->flags |= NMESH_HASFACEUV; - break; - case 1: - me->flags &= ~NMESH_HASFACEUV; - break; - default: - break; - } - - if (me->flags & NMESH_HASFACEUV) - return BPY_incr_ret(Py_True); - else - return BPY_incr_ret(Py_False); -} - - -static char NMesh_hasVertexColours_doc[] = "(flag = None) - returns 1 if Mesh has vertex colours.\n\ -The optional argument sets the vertex colour flag"; - -static PyObject *NMesh_hasVertexColours(PyObject *self, PyObject *args) -{ - NMesh *me= (NMesh *) self; - int flag = -1; - - BPY_TRY(PyArg_ParseTuple(args, "|i", &flag)); - - switch (flag) { - case 0: - me->flags &= ~NMESH_HASMCOL; - break; - case 1: - me->flags |= NMESH_HASMCOL; - break; - default: - break; - } - - if (me->flags & NMESH_HASMCOL) - return BPY_incr_ret(Py_True); - else - return BPY_incr_ret(Py_False); - -} - - -static char NMesh_update_doc[] = "updates the Mesh"; -static PyObject *NMesh_update(PyObject *self, PyObject *args) -{ - NMesh *nmesh= (NMesh *) self; - Mesh *mesh = nmesh->mesh; - - if (mesh) { - unlink_existingMeshdata(mesh); - convert_NMeshToMesh(mesh, nmesh); - mesh_update(mesh); - } else { - nmesh->mesh = Mesh_fromNMesh(nmesh); - } - - nmesh_updateMaterials(nmesh); -/** This is another ugly fix due to the weird material handling of blender. - * it makes sure that object material lists get updated (by their length) - * according to their data material lists, otherwise blender crashes. - * It just stupidly runs through all objects...BAD BAD BAD. - */ - test_object_materials((ID *)mesh); - - if (!during_script()) - allqueue(REDRAWVIEW3D, 0); - return PyInt_FromLong(1); - -} - - -Mesh *Mesh_fromNMesh(NMesh *nmesh) -{ - Mesh *mesh= NULL; - mesh = mesh_new(); // new empty mesh Bobject - if (!mesh) { - PyErr_SetString(PyExc_RuntimeError, "FATAL: could not create mesh object"); - return NULL; - } - - convert_NMeshToMesh(mesh, nmesh); - mesh_update(mesh); - return mesh; -} - -#ifdef EXPERIMENTAL - -static char NMesh_asMesh_doc[] = "returns free Mesh datablock object from NMesh"; -static PyObject *NMesh_asMesh(PyObject *self, PyObject *args) -{ - char *name= NULL; - Mesh *mesh= NULL; - NMesh *nmesh; - int recalc_normals= 1; - - nmesh = (NMesh *) self; - - BPY_TRY(PyArg_ParseTuple(args, "|si", &name, &recalc_normals)); - - if (!PySequence_Check(nmesh->verts)) - return BPY_err_ret_ob(PyExc_AttributeError, - "nmesh vertices are not a sequence"); - if (!PySequence_Check(nmesh->faces)) - return BPY_err_ret_ob(PyExc_AttributeError, - "nmesh faces are not a sequence"); - if (!PySequence_Check(nmesh->materials)) - return BPY_err_ret_ob(PyExc_AttributeError, - "nmesh materials are not a sequence"); - if (!BPY_check_sequence_consistency(nmesh->verts, &NMVert_Type)) - return BPY_err_ret_ob(PyExc_AttributeError, - "nmesh vertices must be NMVerts"); - if (!BPY_check_sequence_consistency(nmesh->faces, &NMFace_Type)) - return BPY_err_ret_ob(PyExc_AttributeError, - "nmesh faces must be NMFaces"); - - mesh = Mesh_fromNMesh(nmesh); - return DataBlock_fromData(mesh); -} - -#endif -static char NMesh_link_doc[] = "(object) - Links NMesh data with Object 'object'"; - -PyObject * NMesh_link(PyObject *self, PyObject *args) -{ - return DataBlock_link(self, args); -} - -#undef MethodDef -#define MethodDef(func) {#func, NMesh_##func, METH_VARARGS, NMesh_##func##_doc} - -static struct PyMethodDef NMesh_methods[] = { - MethodDef(hasVertexColours), - MethodDef(hasFaceUV), - MethodDef(hasVertexUV), - MethodDef(getActiveFace), - MethodDef(getSelectedFaces), - MethodDef(update), -#ifdef EXPERIMENTAL - MethodDef(asMesh), -#endif - {NULL, NULL} -}; - -static PyObject *NMesh_getattr(PyObject *self, char *name) { - NMesh *me= (NMesh *) self; - - if (STREQ(name, "name")) - return BPY_incr_ret(me->name); - - else if (STREQ(name, "block_type")) - return PyString_FromString("NMesh"); - - else if (STREQ(name, "materials")) - return BPY_incr_ret(me->materials); - - else if (STREQ(name, "verts")) - return BPY_incr_ret(me->verts); - - else if (STREQ(name, "users")) { - if (me->mesh) { - return PyInt_FromLong(me->mesh->id.us); - } else { // it's a free mesh: - return Py_BuildValue("i", 0); - } - } - - else if (STREQ(name, "faces")) - return BPY_incr_ret(me->faces); - - return Py_FindMethod(NMesh_methods, (PyObject*)self, name); - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -static int NMesh_setattr(PyObject *self, char *name, PyObject *v) { - NMesh *me= (NMesh *) self; - - if (STREQ3(name, "verts", "faces", "materials")) { - if(PySequence_Check(v)) { - if(STREQ(name, "materials")) { - Py_DECREF(me->materials); - me->materials= BPY_incr_ret(v); - } else if (STREQ(name, "verts")) { - Py_DECREF(me->verts); - me->verts= BPY_incr_ret(v); - } else { - Py_DECREF(me->faces); - me->faces= BPY_incr_ret(v); - } - } else { - PyErr_SetString(PyExc_AttributeError, "expected a sequence"); - return -1; - } - } else { - PyErr_SetString(PyExc_AttributeError, name); - return -1; - } - - return 0; -} - -PyTypeObject NMesh_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "NMesh", /*tp_name*/ - sizeof(NMesh), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor) NMesh_dealloc, /*tp_dealloc*/ - (printfunc) 0, /*tp_print*/ - (getattrfunc) NMesh_getattr, /*tp_getattr*/ - (setattrfunc) NMesh_setattr, /*tp_setattr*/ -}; - -static NMFace *nmface_from_data(NMesh *mesh, int vidxs[4], char mat_nr, char flag, TFace *tface, MCol *col) -{ - NMFace *newf= PyObject_NEW(NMFace, &NMFace_Type); - int i, len; - - if(vidxs[3]) len= 4; - else if(vidxs[2]) len= 3; - else len= 2; - - newf->v= PyList_New(len); - - for (i=0; i<len; i++) - PyList_SetItem(newf->v, i, BPY_incr_ret(PyList_GetItem(mesh->verts, vidxs[i]))); - - if (tface) { - newf->uv = PyList_New(len); // per-face UV coordinates - for (i = 0; i < len; i++) - { - PyList_SetItem(newf->uv, i, Py_BuildValue("(ff)", tface->uv[i][0], tface->uv[i][1])); - } - if (tface->tpage) - newf->tpage = (DataBlock *) DataBlock_fromData((void *) tface->tpage); /* pointer to image per face */ - else - newf->tpage = 0; - newf->mode = tface->mode; /* draw mode */ - newf->flag = tface->flag; /* select flag */ - newf->transp = tface->transp; /* transparency flag */ - col = (MCol *) (tface->col); - } else { - newf->tpage = 0; - newf->uv = PyList_New(0); - } - - newf->mat_nr= mat_nr; - newf->smooth= flag&ME_SMOOTH; - - if (col) { - newf->col= PyList_New(4); - for(i=0; i<4; i++, col++) - PyList_SetItem(newf->col, i, - (PyObject *) newcol(col->b, col->g, col->r, col->a)); - } else { - newf->col= PyList_New(0); - } - return newf; -} - -static NMFace *nmface_from_shortdata(NMesh *mesh, MFace *face, TFace *tface, MCol *col) -{ - int vidxs[4]; - vidxs[0]= face->v1; - vidxs[1]= face->v2; - vidxs[2]= face->v3; - vidxs[3]= face->v4; - - return nmface_from_data(mesh, vidxs, face->mat_nr, face->flag, tface, col); -} - -static NMFace *nmface_from_intdata(NMesh *mesh, MFaceInt *face, TFace *tface, MCol *col) -{ - int vidxs[4]; - vidxs[0]= face->v1; - vidxs[1]= face->v2; - vidxs[2]= face->v3; - vidxs[3]= face->v4; - - return nmface_from_data(mesh, vidxs, face->mat_nr, face->flag, tface, col); -} - -static NMVert *nmvert_from_data(NMesh *me, MVert *vert, MSticky *st, float *co, int idx) -{ - NMVert *mv= PyObject_NEW(NMVert, &NMVert_Type); - - VECCOPY (mv->co, co); - - mv->no[0]= vert->no[0]/32767.0; - mv->no[1]= vert->no[1]/32767.0; - mv->no[2]= vert->no[2]/32767.0; - - if (st) { - mv->uvco[0]= st->co[0]; - mv->uvco[1]= st->co[1]; - mv->uvco[2]= 0.0; - - } else mv->uvco[0]= mv->uvco[1]= mv->uvco[2]= 0.0; - - mv->index= idx; - - return mv; -} - -static int get_active_faceindex(Mesh *me) -{ - TFace *tf; - int i; - - if (me == NULL) return -1; - - tf = me->tface; - if (tf == 0) return -1; - - for (i =0 ; i < me->totface; i++) { - if (tf[i].flag & TF_ACTIVE ) { - return i; - } - } - return -1; -} - -static PyObject *newNMesh_internal(Mesh *oldmesh, DispListMesh *dlm, float *extverts) -{ - NMesh *me= PyObject_NEW(NMesh, &NMesh_Type); - me->flags= 0; - - if (!oldmesh) { - me->name= BPY_incr_ret(Py_None); - me->materials= PyList_New(0); - me->verts= PyList_New(0); - me->faces= PyList_New(0); - me->mesh= 0; - } else { - MVert *mverts; - MSticky *msticky; - MFaceInt *mfaceints; - MFace *mfaces; - TFace *tfaces; - MCol *mcols; - int i, totvert, totface; - - if (dlm) { - me->name= BPY_incr_ret(Py_None); - me->mesh= 0; - - msticky= NULL; - mfaces= NULL; - mverts= dlm->mvert; - mfaceints= dlm->mface; - tfaces= dlm->tface; - mcols= dlm->mcol; - - totvert= dlm->totvert; - totface= dlm->totface; - } else { - me->name= PyString_FromString(oldmesh->id.name+2); - me->mesh= oldmesh; - - mfaceints= NULL; - msticky= oldmesh->msticky; - mverts= oldmesh->mvert; - mfaces= oldmesh->mface; - tfaces= oldmesh->tface; - mcols= oldmesh->mcol; - - totvert= oldmesh->totvert; - totface= oldmesh->totface; - - me->sel_face= get_active_faceindex(oldmesh); - } - - if (msticky) me->flags |= NMESH_HASVERTUV; - if (tfaces) me->flags |= NMESH_HASFACEUV; - if (mcols) me->flags |= NMESH_HASMCOL; - - me->verts= PyList_New(totvert); - for (i=0; i<totvert; i++) { - MVert *oldmv= &mverts[i]; - MSticky *oldst= msticky?&msticky[i]:NULL; - float *vco= extverts?&extverts[i*3]:oldmv->co; - - PyList_SetItem(me->verts, i, (PyObject *) nmvert_from_data(me, oldmv, oldst, vco, i)); - } - - me->faces= PyList_New(totface); - for (i=0; i<totface; i++) { - TFace *oldtf= tfaces?&tfaces[i]:NULL; - MCol *oldmc= mcols?&mcols[i*4]:NULL; - - if (mfaceints) { - MFaceInt *oldmf= &mfaceints[i]; - PyList_SetItem(me->faces, i, (PyObject *) nmface_from_intdata(me, oldmf, oldtf, oldmc)); - } else { - MFace *oldmf= &mfaces[i]; - PyList_SetItem(me->faces, i, (PyObject *) nmface_from_shortdata(me, oldmf, oldtf, oldmc)); - } - } - me->materials = PyList_fromMaterialList(oldmesh->mat, oldmesh->totcol); - } - - return (PyObject *) me; -} - -PyObject *newNMesh(Mesh *oldmesh) -{ - return newNMesh_internal(oldmesh, NULL, NULL); -} - -static char NMeshmodule_New_doc[]= -"() - returns a new, empty NMesh mesh object\n"; - -static PyObject *NMeshmodule_New(PyObject *self, PyObject *args) -{ - return newNMesh(NULL); -} - -static char NMeshmodule_GetRaw_doc[]= -"([name]) - Get a raw mesh from Blender\n\ -\n\ -[name] Name of the mesh to be returned\n\ -\n\ -If name is not specified a new empty mesh is\n\ -returned, otherwise Blender returns an existing\n\ -mesh."; - -static PyObject *NMeshmodule_GetRaw(PyObject *self, PyObject *args) -{ - char *name=NULL; - Mesh *oldmesh=NULL; - - BPY_TRY(PyArg_ParseTuple(args, "|s", &name)); - - if(name) { - oldmesh = (Mesh *) getFromList(getMeshList(), name); - - if (!oldmesh) return BPY_incr_ret(Py_None); - } - return newNMesh(oldmesh); -} - -static char NMeshmodule_GetRawFromObject_doc[]= -"(name) - Get the raw mesh used by a Blender object\n" -"\n" -"(name) Name of the object to get the mesh from\n" -"\n" -"This returns the mesh as used by the object, which\n" -"means it contains all deformations and modifications."; - -static PyObject *NMeshmodule_GetRawFromObject(PyObject *self, PyObject *args) -{ - char *name; - Object *ob; - PyObject *nmesh; - - BPY_TRY(PyArg_ParseTuple(args, "s", &name)); - - ob= (Object*) getFromList(getObjectList(), name); - if (!ob) - return BPY_err_ret_ob(PyExc_AttributeError, name); - else if (ob->type!=OB_MESH) - return BPY_err_ret_ob(PyExc_AttributeError, "Object does not have Mesh data"); - else { - Mesh *me= (Mesh*) ob->data; - DispList *dl; - - if (mesh_uses_displist(me) && (dl= find_displist(&me->disp, DL_MESH))) - nmesh = newNMesh_internal(me, dl->mesh, NULL); - else if ((dl= find_displist(&ob->disp, DL_VERTS))) - nmesh = newNMesh_internal(me, NULL, dl->verts); - else - nmesh = newNMesh(me); - } - ((NMesh *) nmesh)->mesh = 0; // hack: to mark that (deformed) mesh is readonly, - // so the update function will not try to write it. - return nmesh; -} - -static void mvert_from_data(MVert *mv, MSticky *st, NMVert *from) -{ - VECCOPY (mv->co, from->co); - mv->no[0]= from->no[0]*32767.0; - mv->no[1]= from->no[1]*32767.0; - mv->no[2]= from->no[2]*32767.0; - - mv->flag= 0; - mv->mat_nr= 0; - - if (st) { - st->co[0]= from->uvco[0]; - st->co[1]= from->uvco[1]; - } -} - -/* TODO: this function is just a added hack. Don't look at the - * RGBA/BRGA confusion, it just works, but will never work with - * a restructured Blender */ - -static void assign_perFaceColors(TFace *tf, NMFace *from) -{ - MCol *col; - int i; - - col = (MCol *) (tf->col); - - if (col) { - int len= PySequence_Length(from->col); - - if(len>4) len= 4; - - for (i=0; i<len; i++, col++) { - NMCol *mc= (NMCol *) PySequence_GetItem(from->col, i); - if(!NMCol_Check(mc)) { - Py_DECREF(mc); - continue; - } - - col->r= mc->b; - col->b= mc->r; - col->g= mc->g; - col->a= mc->a; - - Py_DECREF(mc); - } - } -} - -static int assignFaceUV(TFace *tf, NMFace *nmface) -{ - PyObject *fuv, *tmp; - int i; - - fuv = nmface->uv; - if (PySequence_Length(fuv) == 0) - return 0; - /* fuv = [(u_1, v_1), ... (u_n, v_n)] */ - for (i = 0; i < PySequence_Length(fuv); i++) { - tmp = PyList_GetItem(fuv, i); /* stolen reference ! */ - if (!PyArg_ParseTuple(tmp, "ff", &(tf->uv[i][0]), &(tf->uv[i][1]))) - return 0; - } - if (nmface->tpage) /* image assigned ? */ - { - tf->tpage = nmface->tpage->data; - } - else - tf->tpage = 0; - - tf->mode = nmface->mode; /* copy mode */ - tf->flag = nmface->flag; /* copy flag */ - tf->transp = nmface->transp; /* copy transp flag */ - - /* assign vertex colours */ - assign_perFaceColors(tf, nmface); - return 1; -} - -static void mface_from_data(MFace *mf, TFace *tf, MCol *col, NMFace *from) -{ - NMVert *nmv; - - int i= PyList_Size(from->v); - if(i>=1) { - nmv= (NMVert *) PyList_GetItem(from->v, 0); - if (NMVert_Check(nmv) && nmv->index!=-1) mf->v1= nmv->index; - else mf->v1= 0; - } - if(i>=2) { - nmv= (NMVert *) PyList_GetItem(from->v, 1); - if (NMVert_Check(nmv) && nmv->index!=-1) mf->v2= nmv->index; - else mf->v2= 0; - } - if(i>=3) { - nmv= (NMVert *) PyList_GetItem(from->v, 2); - if (NMVert_Check(nmv) && nmv->index!=-1) mf->v3= nmv->index; - else mf->v3= 0; - } - if(i>=4) { - nmv= (NMVert *) PyList_GetItem(from->v, 3); - if (NMVert_Check(nmv) && nmv->index!=-1) mf->v4= nmv->index; - else mf->v4= 0; - } - - /* this function is evil: - - test_index_mface(mf, i); - - It rotates vertex indices, if there are illegal '0's (end marker) - in the vertex index list. - But it doesn't do that with vertex colours or texture coordinates... - */ - - if (tf) { - assignFaceUV(tf, from); - if (PyErr_Occurred()) - { - PyErr_Print(); - return; - } - - test_index_face(mf, tf, i); - } else { - test_index_mface(mf, i); - } - - mf->puno= 0; - mf->mat_nr= from->mat_nr; - mf->edcode= 0; - if (from->smooth) - mf->flag= ME_SMOOTH; - else - mf->flag= 0; - - if (col) { - int len= PySequence_Length(from->col); - - if(len>4) len= 4; - - for (i=0; i<len; i++, col++) { - NMCol *mc= (NMCol *) PySequence_GetItem(from->col, i); - if(!NMCol_Check(mc)) { - Py_DECREF(mc); - continue; - } - - col->b= mc->r; - col->g= mc->g; - col->r= mc->b; - col->a= mc->a; - - Py_DECREF(mc); - } - } -} - - -/* check for a valid UV sequence */ -static int check_validFaceUV(NMesh *nmesh) -{ - PyObject *faces; - NMFace *nmface; - int i, n; - - faces = nmesh->faces; - for (i = 0; i < PySequence_Length(faces); i++) { - nmface = (NMFace *) PyList_GetItem(faces, i); - n = PySequence_Length(nmface->uv); - if (n != PySequence_Length(nmface->v)) - { - if (n > 0) - printf("Warning: different length of vertex and UV coordinate " - "list in face!\n"); - return 0; - } - } - return 1; -} - -static int unlink_existingMeshdata(Mesh *mesh) -{ - freedisplist(&mesh->disp); - unlink_mesh(mesh); - if(mesh->mvert) MEM_freeN(mesh->mvert); - if(mesh->mface) MEM_freeN(mesh->mface); - if(mesh->mcol) MEM_freeN(mesh->mcol); - if(mesh->msticky) MEM_freeN(mesh->msticky); - if(mesh->mat) MEM_freeN(mesh->mat); - if(mesh->tface) MEM_freeN(mesh->tface); - return 1; -} - -Material **nmesh_updateMaterials(NMesh *nmesh) -{ - Material **matlist; - Mesh *mesh = nmesh->mesh; - int len = PySequence_Length(nmesh->materials); - - if (!mesh) { - printf("FATAL INTERNAL ERROR: illegal call to updateMaterials()\n"); - return 0; - } - - if (len > 0) { - matlist = newMaterialList_fromPyList(nmesh->materials); - if (mesh->mat) - MEM_freeN(mesh->mat); - mesh->mat = matlist; - } else { - matlist = 0; - } - mesh->totcol = len; - return matlist; -} - -PyObject *NMesh_assignMaterials_toObject(NMesh *nmesh, Object *ob) -{ - DataBlock *block; - Material *ma; - int i; - short old_matmask; - - old_matmask = ob->colbits; // HACK: save previous colbits - ob->colbits = 0; // make assign_material work on mesh linked material - - for (i= 0; i < PySequence_Length(nmesh->materials); i++) { - block= (DataBlock *) PySequence_GetItem(nmesh->materials, i); - - if (DataBlock_isType(block, ID_MA)) { - ma = (Material *) block->data; - assign_material(ob, ma, i+1); // XXX don't use this function anymore - } else { - PyErr_SetString(PyExc_TypeError, - "Material type in attribute list 'materials' expected!"); - Py_DECREF(block); - return NULL; - } - - Py_DECREF(block); - } - ob->colbits = old_matmask; // HACK - - ob->actcol = 1; - RETURN_INC(Py_None); -} - -static int convert_NMeshToMesh(Mesh *mesh, NMesh *nmesh) -{ - MFace *newmf; - TFace *newtf; - MVert *newmv; - MSticky *newst; - MCol *newmc; - - int i, j; - - mesh->mvert= NULL; - mesh->mface= NULL; - mesh->mcol= NULL; - mesh->msticky= NULL; - mesh->tface = NULL; - mesh->mat= NULL; - - // material assignment moved to PutRaw - mesh->totvert= PySequence_Length(nmesh->verts); - if (mesh->totvert) { - if (nmesh->flags&NMESH_HASVERTUV) - mesh->msticky= MEM_callocN(sizeof(MSticky)*mesh->totvert, "msticky"); - - mesh->mvert= MEM_callocN(sizeof(MVert)*mesh->totvert, "mverts"); - } - - if (mesh->totvert) - mesh->totface= PySequence_Length(nmesh->faces); - else - mesh->totface= 0; - - - if (mesh->totface) { - -/* only create vertcol array if mesh has no texture faces */ - -/* TODO: get rid of double storage of vertex colours. In a mesh, - * vertex colors can be stored the following ways: - * - per (TFace*)->col - * - per (Mesh*)->mcol - * This is stupid, but will reside for the time being -- at least until - * a redesign of the internal Mesh structure */ - - if (!(nmesh->flags & NMESH_HASFACEUV) && (nmesh->flags&NMESH_HASMCOL)) - mesh->mcol= MEM_callocN(4*sizeof(MCol)*mesh->totface, "mcol"); - - mesh->mface= MEM_callocN(sizeof(MFace)*mesh->totface, "mfaces"); - } - - /* This stuff here is to tag all the vertices referenced - * by faces, then untag the vertices which are actually - * in the vert list. Any vertices untagged will be ignored - * by the mface_from_data function. It comes from my - * screwed up decision to not make faces only store the - * index. - Zr - */ - for (i=0; i<mesh->totface; i++) { - NMFace *mf= (NMFace *) PySequence_GetItem(nmesh->faces, i); - - j= PySequence_Length(mf->v); - while (j--) { - NMVert *mv= (NMVert *) PySequence_GetItem(mf->v, j); - if (NMVert_Check(mv)) mv->index= -1; - Py_DECREF(mv); - } - - Py_DECREF(mf); - } - - for (i=0; i<mesh->totvert; i++) { - NMVert *mv= (NMVert *) PySequence_GetItem(nmesh->verts, i); - mv->index= i; - Py_DECREF(mv); - } - - newmv= mesh->mvert; - newst= mesh->msticky; - for (i=0; i<mesh->totvert; i++) { - PyObject *mv= PySequence_GetItem(nmesh->verts, i); - mvert_from_data(newmv, newst, (NMVert *)mv); - Py_DECREF(mv); - - newmv++; - if (newst) newst++; - } - -/* assign per face texture UVs */ - - /* check face UV flag, then check whether there was one - * UV coordinate assigned, if yes, make tfaces */ - if ((nmesh->flags & NMESH_HASFACEUV) || (check_validFaceUV(nmesh))) { - make_tfaces(mesh); /* initialize TFaces */ - - newmc= mesh->mcol; - newmf= mesh->mface; - newtf= mesh->tface; - for (i=0; i<mesh->totface; i++) { - PyObject *mf= PySequence_GetItem(nmesh->faces, i); - mface_from_data(newmf, newtf, newmc, (NMFace *) mf); - Py_DECREF(mf); - - newtf++; - newmf++; - if (newmc) newmc++; - } - - nmesh->flags |= NMESH_HASFACEUV; - } else { - - newmc= mesh->mcol; - newmf= mesh->mface; - for (i=0; i<mesh->totface; i++) { - PyObject *mf= PySequence_GetItem(nmesh->faces, i); - mface_from_data(newmf, 0, newmc, (NMFace *) mf); - Py_DECREF(mf); - - newmf++; - if (newmc) newmc += 4; /* there are 4 MCol's per face */ - } - } - return 1; -} - - - -static char NMeshmodule_PutRaw_doc[]= -"(mesh, [name, renormal]) - Return a raw mesh to Blender\n\ -\n\ -(mesh) The NMesh object to store\n\ -[name] The mesh to replace\n\ -[renormal=1] Flag to control vertex normal recalculation\n\ -\n\ -If the name of a mesh to replace is not given a new\n\ -object is created and returned."; - -static PyObject *NMeshmodule_PutRaw(PyObject *self, PyObject *args) -{ - char *name= NULL; - Mesh *mesh= NULL; - Object *ob= NULL; - NMesh *nmesh; - int recalc_normals= 1; - - BPY_TRY(PyArg_ParseTuple(args, "O!|si", &NMesh_Type, &nmesh, &name, &recalc_normals)); - - if (!PySequence_Check(nmesh->verts)) - return BPY_err_ret_ob(PyExc_AttributeError, "nmesh vertices are not a sequence"); - if (!PySequence_Check(nmesh->faces)) - return BPY_err_ret_ob(PyExc_AttributeError, "nmesh faces are not a sequence"); - if (!PySequence_Check(nmesh->materials)) - return BPY_err_ret_ob(PyExc_AttributeError, "nmesh materials are not a sequence"); - - if (!BPY_check_sequence_consistency(nmesh->verts, &NMVert_Type)) - return BPY_err_ret_ob(PyExc_AttributeError, "nmesh vertices must be NMVerts"); - if (!BPY_check_sequence_consistency(nmesh->faces, &NMFace_Type)) - return BPY_err_ret_ob(PyExc_AttributeError, "nmesh faces must be NMFaces"); - - if (name) - mesh= (Mesh *) getFromList(getMeshList(), name); - /* returns new mesh if not found */ - - if(!mesh || mesh->id.us==0) { - ob= add_object(OB_MESH); - if (!ob) { - PyErr_SetString(PyExc_RuntimeError, "Fatal: could not create mesh object"); - return 0; - } - if (mesh) - set_mesh(ob, mesh); - else - mesh= (Mesh *) ob->data; - } - if(name) new_id(getMeshList(), &mesh->id, name); - - unlink_existingMeshdata(mesh); - convert_NMeshToMesh(mesh, nmesh); - nmesh->mesh = mesh; - - if(recalc_normals) - vertexnormals_mesh(mesh, 0); - - mesh_update(mesh); - - if (!during_script()) - allqueue(REDRAWVIEW3D, 0); - - // OK...this requires some explanation: - // Materials can be assigned two ways: - // a) to the object data (in this case, the mesh) - // b) to the Object - // - // Case a) is wanted, if Mesh data should be shared among objects, - // as well as its materials (up to 16) - // Case b) is wanted, when Mesh data should be shared, but not the - // materials. For example, you want several checker boards sharing their - // mesh data, but having different colors. So you would assign material - // index 0 to all even, index 1 to all odd faces and bind the materials - // to the Object instead (MaterialButtons: [OB] button "link materials to object") - // - // This feature implies that pointers to materials can be stored in - // an object or a mesh. The number of total materials MUST be - // synchronized (ob->totcol <-> mesh->totcol). We avoid the dangerous - // direct access by calling blenderkernel/material.c:assign_material(). - - // The flags setting the material binding is found in ob->colbits, where - // each bit indicates the binding PER MATERIAL - - if (ob) { // we created a new object - NMesh_assignMaterials_toObject(nmesh, ob); - return DataBlock_fromData(ob); - } else { - RETURN_INC(Py_None); - } -} - -#undef MethodDef -#define MethodDef(func) {#func, NMeshmodule_##func, METH_VARARGS, NMeshmodule_##func##_doc} - -static struct PyMethodDef NMeshmodule_methods[] = { -// These should be: Mesh.Col, Mesh.Vert, Mesh.Face in fure -// -- for ownership reasons - MethodDef(Col), - MethodDef(Vert), - MethodDef(Face), - MethodDef(New), - MethodDef(GetRaw), - MethodDef(GetRawFromObject), - MethodDef(PutRaw), - {NULL, NULL} -}; -#undef BPY_ADDCONST -#define BPY_ADDCONST(dict, name) insertConst(dict, #name, PyInt_FromLong(TF_##name)) - -/* set constants for face drawing mode -- see drawmesh.c */ - -static void init_NMeshConst(PyObject *d) -{ - insertConst(d, "BILLBOARD", PyInt_FromLong(TF_BILLBOARD2)); - //BPY_ADDCONST(d, BILLBOARD); - insertConst(d, "ALL", PyInt_FromLong(0xffff)); - BPY_ADDCONST(d, DYNAMIC); - BPY_ADDCONST(d, INVISIBLE); - insertConst(d, "HALO", PyInt_FromLong(TF_BILLBOARD)); - BPY_ADDCONST(d, LIGHT); - BPY_ADDCONST(d, OBCOL); - BPY_ADDCONST(d, SHADOW); - BPY_ADDCONST(d, SHAREDVERT); - BPY_ADDCONST(d, SHAREDCOL); - BPY_ADDCONST(d, TEX); - BPY_ADDCONST(d, TILES); - BPY_ADDCONST(d, TWOSIDE); -/* transparent modes */ - BPY_ADDCONST(d, SOLID); - BPY_ADDCONST(d, ADD); - BPY_ADDCONST(d, ALPHA); - BPY_ADDCONST(d, SUB); -/* TFACE flags */ - BPY_ADDCONST(d, SELECT); - BPY_ADDCONST(d, HIDE); - BPY_ADDCONST(d, ACTIVE); -} - -PyObject *init_py_nmesh(void) -{ - PyObject *d; - PyObject *mod= Py_InitModule(SUBMODULE(NMesh), NMeshmodule_methods); - PyObject *dict= PyModule_GetDict(mod); - - NMesh_Type.ob_type= &PyType_Type; - NMVert_Type.ob_type= &PyType_Type; - NMFace_Type.ob_type= &PyType_Type; - NMCol_Type.ob_type= &PyType_Type; - - d = ConstObject_New(); - PyDict_SetItemString(dict, "Const" , d); - init_NMeshConst(d); - - g_nmeshmodule = mod; - return mod; -} - -#ifdef SHAREDMODULE -void initNMesh(void) -{ - init_py_nmesh(); -} -#endif |