forked from bartvdbraak/blender
Exppython:
- Object: implemented getBoundBox and makeDisplayList methods - NMesh and Object: small internal changes for nicer behavior - Draw: added function PupMenu - Docs: updated for the additions above Auto build tiny fix: added the imbuf include dir to source/creator/Makefile.am
This commit is contained in:
parent
7a510b7240
commit
c0303d78b4
@ -670,6 +670,27 @@ static PyObject *Method_Text (PyObject *self, PyObject *args)
|
|||||||
return PyInt_FromLong (BMF_GetStringWidth (font, text));
|
return PyInt_FromLong (BMF_GetStringWidth (font, text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *Method_PupMenu (PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
char *text;
|
||||||
|
int maxrow = -1;
|
||||||
|
PyObject *ret;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "s|i", &text, &maxrow))
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||||
|
"expected a string and optionally an int as arguments");
|
||||||
|
|
||||||
|
if (maxrow >= 0)
|
||||||
|
ret = PyInt_FromLong (pupmenu_col (text, maxrow));
|
||||||
|
else
|
||||||
|
ret = PyInt_FromLong (pupmenu (text));
|
||||||
|
|
||||||
|
if (ret) return ret;
|
||||||
|
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_MemoryError,
|
||||||
|
"couldn't create a PyInt");
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *Draw_Init (void)
|
PyObject *Draw_Init (void)
|
||||||
{
|
{
|
||||||
PyObject *submodule, *dict;
|
PyObject *submodule, *dict;
|
||||||
|
@ -123,8 +123,9 @@ static void exit_pydraw(SpaceText *st);
|
|||||||
static void exec_callback(SpaceText *st, PyObject *callback, PyObject *args);
|
static void exec_callback(SpaceText *st, PyObject *callback, PyObject *args);
|
||||||
void BPY_spacetext_do_pywin_draw(SpaceText *st);
|
void BPY_spacetext_do_pywin_draw(SpaceText *st);
|
||||||
static void spacetext_do_pywin_buttons(SpaceText *st, unsigned short event);
|
static void spacetext_do_pywin_buttons(SpaceText *st, unsigned short event);
|
||||||
void BPY_spacetext_do_pywin_event(SpaceText *st, unsigned short event, short val);
|
void BPY_spacetext_do_pywin_event(SpaceText *st,
|
||||||
int BPY_spacetext_is_pywin(SpaceText *st);
|
unsigned short event, short val);
|
||||||
|
int BPY_spacetext_is_pywin(SpaceText *sc);
|
||||||
|
|
||||||
static char Method_Exit_doc[] =
|
static char Method_Exit_doc[] =
|
||||||
"() - Exit the windowing interface";
|
"() - Exit the windowing interface";
|
||||||
@ -278,6 +279,20 @@ NEW! - This function now returns the width of the drawn string.";
|
|||||||
static PyObject *Method_GetStringWidth (PyObject *self, PyObject *args);
|
static PyObject *Method_GetStringWidth (PyObject *self, PyObject *args);
|
||||||
static PyObject *Method_Text (PyObject *self, PyObject *args);
|
static PyObject *Method_Text (PyObject *self, PyObject *args);
|
||||||
|
|
||||||
|
static char Method_PupMenu_doc[] =
|
||||||
|
"(string, maxrow = None) - Display a pop-up menu at the screen.\n\
|
||||||
|
The contents of the pop-up are specified through the 'string' argument,\n\
|
||||||
|
like with Draw.Menu.\n\
|
||||||
|
'maxrow' is an optional int to control how many rows the pop-up should have.\n\
|
||||||
|
Options are followed by a format code and separated\n\
|
||||||
|
by the '|' (pipe) character.\n\
|
||||||
|
Valid format codes are\n\
|
||||||
|
%t - The option should be used as the title\n\
|
||||||
|
%xN - The option should set the integer N in the button value.\n\n\
|
||||||
|
Ex: Draw.PupMenu('OK?%t|QUIT BLENDER') # should be familiar ...";
|
||||||
|
|
||||||
|
static PyObject *Method_PupMenu (PyObject *self, PyObject *args);
|
||||||
|
|
||||||
#define _MethodDef(func, prefix) \
|
#define _MethodDef(func, prefix) \
|
||||||
{#func, prefix##_##func, METH_VARARGS, prefix##_##func##_doc}
|
{#func, prefix##_##func, METH_VARARGS, prefix##_##func##_doc}
|
||||||
|
|
||||||
@ -296,11 +311,9 @@ static struct PyMethodDef Draw_methods[] = {
|
|||||||
MethodDef(Scrollbar),
|
MethodDef(Scrollbar),
|
||||||
MethodDef(Number),
|
MethodDef(Number),
|
||||||
MethodDef(String),
|
MethodDef(String),
|
||||||
|
|
||||||
MethodDef(GetStringWidth),
|
MethodDef(GetStringWidth),
|
||||||
|
|
||||||
MethodDef(Text),
|
MethodDef(Text),
|
||||||
|
MethodDef(PupMenu),
|
||||||
MethodDef(Exit),
|
MethodDef(Exit),
|
||||||
MethodDef(Redraw),
|
MethodDef(Redraw),
|
||||||
MethodDef(Draw),
|
MethodDef(Draw),
|
||||||
|
@ -886,12 +886,14 @@ static PyObject *NMesh_getVertexInfluences(PyObject *self, PyObject *args)
|
|||||||
Mesh *Mesh_fromNMesh(BPy_NMesh *nmesh)
|
Mesh *Mesh_fromNMesh(BPy_NMesh *nmesh)
|
||||||
{
|
{
|
||||||
Mesh *mesh = NULL;
|
Mesh *mesh = NULL;
|
||||||
mesh = add_mesh(); /* us == 1, should we zero it for all added objs ? */
|
mesh = add_mesh();
|
||||||
|
|
||||||
if (!mesh)
|
if (!mesh)
|
||||||
EXPP_ReturnPyObjError(PyExc_RuntimeError,
|
EXPP_ReturnPyObjError(PyExc_RuntimeError,
|
||||||
"FATAL: could not create mesh object");
|
"FATAL: could not create mesh object");
|
||||||
|
|
||||||
|
mesh->id.us = 0; /* no user yet */
|
||||||
|
G.totmesh++;
|
||||||
convert_NMeshToMesh(mesh, nmesh);
|
convert_NMeshToMesh(mesh, nmesh);
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
@ -905,11 +907,54 @@ PyObject *NMesh_link(PyObject *self, PyObject *args)
|
|||||||
return EXPP_ReturnPyErrorObj (PyExc_TypeError,
|
return EXPP_ReturnPyErrorObj (PyExc_TypeError,
|
||||||
"NMesh can only be linked to Objects");
|
"NMesh can only be linked to Objects");
|
||||||
|
|
||||||
bl_obj->data = (PyObject *)self; do this function later */
|
bl_obj->data = (PyObject *)self;*/
|
||||||
|
|
||||||
|
/* Better use object.link(nmesh), no need for this nmesh.link(object) */
|
||||||
|
|
||||||
return EXPP_incr_ret(Py_None);
|
return EXPP_incr_ret(Py_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *NMesh_getMode (BPy_NMesh *self)
|
||||||
|
{
|
||||||
|
PyObject *attr = PyInt_FromLong (self->mode);
|
||||||
|
|
||||||
|
if (attr) return attr;
|
||||||
|
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||||
|
"couldn't get NMesh.mode attribute");
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *NMesh_setMode (PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
BPy_NMesh *nmesh = (BPy_NMesh *)self;
|
||||||
|
char *m[4] = {NULL, NULL, NULL, NULL};
|
||||||
|
short i, mode = 0;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "|ssss", &m[0], &m[1], &m[2], &m[3]))
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||||
|
"expected from none to 4 strings as argument(s)");
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
if (!m[i]) break;
|
||||||
|
if (strcmp(m[i], "NoVNormalsFlip") == 0)
|
||||||
|
mode |= EXPP_NMESH_MODE_NOPUNOFLIP;
|
||||||
|
else if (strcmp(m[i], "TwoSided") == 0)
|
||||||
|
mode |= EXPP_NMESH_MODE_TWOSIDED;
|
||||||
|
else if (strcmp(m[i], "AutoSmooth") == 0)
|
||||||
|
mode |= EXPP_NMESH_MODE_AUTOSMOOTH;
|
||||||
|
else if (strcmp(m[i], "SubSurf") == 0)
|
||||||
|
mode |= EXPP_NMESH_MODE_SUBSURF;
|
||||||
|
else
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||||
|
"unknown NMesh mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
nmesh->mode = mode;
|
||||||
|
|
||||||
|
Py_INCREF (Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
#undef MethodDef
|
#undef MethodDef
|
||||||
#define MethodDef(func) {#func, NMesh_##func, METH_VARARGS, NMesh_##func##_doc}
|
#define MethodDef(func) {#func, NMesh_##func, METH_VARARGS, NMesh_##func##_doc}
|
||||||
|
|
||||||
@ -925,6 +970,8 @@ static struct PyMethodDef NMesh_methods[] =
|
|||||||
MethodDef(insertKey),
|
MethodDef(insertKey),
|
||||||
MethodDef(removeAllKeys),
|
MethodDef(removeAllKeys),
|
||||||
MethodDef(update),
|
MethodDef(update),
|
||||||
|
{"getMode", (PyCFunction)NMesh_getMode, METH_NOARGS, NMesh_getMode_doc},
|
||||||
|
MethodDef(setMode),
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -935,7 +982,10 @@ static PyObject *NMesh_getattr(PyObject *self, char *name)
|
|||||||
if (strcmp(name, "name") == 0)
|
if (strcmp(name, "name") == 0)
|
||||||
return EXPP_incr_ret(me->name);
|
return EXPP_incr_ret(me->name);
|
||||||
|
|
||||||
else if (strcmp(name, "block_type") == 0)
|
else if (strcmp(name, "mode") == 0)
|
||||||
|
return PyInt_FromLong(me->mode);
|
||||||
|
|
||||||
|
else if (strcmp(name, "block_type") == 0) /* for compatibility */
|
||||||
return PyString_FromString("NMesh");
|
return PyString_FromString("NMesh");
|
||||||
|
|
||||||
else if (strcmp(name, "materials") == 0)
|
else if (strcmp(name, "materials") == 0)
|
||||||
@ -948,7 +998,7 @@ static PyObject *NMesh_getattr(PyObject *self, char *name)
|
|||||||
if (me->mesh) {
|
if (me->mesh) {
|
||||||
return PyInt_FromLong(me->mesh->id.us);
|
return PyInt_FromLong(me->mesh->id.us);
|
||||||
}
|
}
|
||||||
else { // it's a free mesh:
|
else { /* it's a free mesh: */
|
||||||
return Py_BuildValue("i", 0);
|
return Py_BuildValue("i", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -977,6 +1027,20 @@ static int NMesh_setattr(PyObject *self, char *name, PyObject *v)
|
|||||||
me->name = EXPP_incr_ret(v);
|
me->name = EXPP_incr_ret(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (!strcmp(name, "mode")) {
|
||||||
|
short mode;
|
||||||
|
|
||||||
|
if (!PyInt_Check(v))
|
||||||
|
return EXPP_ReturnIntError (PyExc_TypeError,
|
||||||
|
"expected int argument");
|
||||||
|
|
||||||
|
mode = (short)PyInt_AsLong(v);
|
||||||
|
if (mode >= 0) me->mode = mode;
|
||||||
|
else
|
||||||
|
return EXPP_ReturnIntError (PyExc_ValueError,
|
||||||
|
"expected positive int argument");
|
||||||
|
}
|
||||||
|
|
||||||
else if (!strcmp(name, "verts") || !strcmp(name, "faces") ||
|
else if (!strcmp(name, "verts") || !strcmp(name, "faces") ||
|
||||||
!strcmp(name, "materials")) {
|
!strcmp(name, "materials")) {
|
||||||
|
|
||||||
@ -1142,7 +1206,7 @@ static PyObject *new_NMesh_internal(Mesh *oldmesh,
|
|||||||
{
|
{
|
||||||
BPy_NMesh *me = PyObject_NEW (BPy_NMesh, &NMesh_Type);
|
BPy_NMesh *me = PyObject_NEW (BPy_NMesh, &NMesh_Type);
|
||||||
me->flags = 0;
|
me->flags = 0;
|
||||||
me->object = NULL; /* not linked to any object in particular yet */
|
me->object = NULL; /* not linked to any object yet */
|
||||||
|
|
||||||
if (!oldmesh) {
|
if (!oldmesh) {
|
||||||
me->name = EXPP_incr_ret(Py_None);
|
me->name = EXPP_incr_ret(Py_None);
|
||||||
@ -1177,6 +1241,7 @@ static PyObject *new_NMesh_internal(Mesh *oldmesh,
|
|||||||
else {
|
else {
|
||||||
me->name = PyString_FromString(oldmesh->id.name+2);
|
me->name = PyString_FromString(oldmesh->id.name+2);
|
||||||
me->mesh = oldmesh;
|
me->mesh = oldmesh;
|
||||||
|
me->mode = oldmesh->flag; /* yes, we save the mesh flags in nmesh->mode */
|
||||||
|
|
||||||
mfaceints = NULL;
|
mfaceints = NULL;
|
||||||
msticky = oldmesh->msticky;
|
msticky = oldmesh->msticky;
|
||||||
@ -1235,7 +1300,22 @@ PyObject *new_NMesh(Mesh *oldmesh)
|
|||||||
|
|
||||||
static PyObject *M_NMesh_New(PyObject *self, PyObject *args)
|
static PyObject *M_NMesh_New(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
return new_NMesh(NULL);
|
char *name = NULL;
|
||||||
|
PyObject *ret = NULL;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "|s", &name))
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||||
|
"expected nothing or a string as argument");
|
||||||
|
|
||||||
|
ret = new_NMesh(NULL);
|
||||||
|
|
||||||
|
if (ret && name) {
|
||||||
|
BPy_NMesh *nmesh = (BPy_NMesh *)ret;
|
||||||
|
Py_DECREF (nmesh->name);
|
||||||
|
nmesh->name = PyString_FromString(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *M_NMesh_GetRaw(PyObject *self, PyObject *args)
|
static PyObject *M_NMesh_GetRaw(PyObject *self, PyObject *args)
|
||||||
@ -1256,6 +1336,8 @@ static PyObject *M_NMesh_GetRaw(PyObject *self, PyObject *args)
|
|||||||
return new_NMesh(oldmesh);
|
return new_NMesh(oldmesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note: NMesh.GetRawFromObject gets the display list mesh from Blender:
|
||||||
|
* the vertices are already transformed / deformed. */
|
||||||
static PyObject *M_NMesh_GetRawFromObject(PyObject *self, PyObject *args)
|
static PyObject *M_NMesh_GetRawFromObject(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
@ -1285,7 +1367,7 @@ static PyObject *M_NMesh_GetRawFromObject(PyObject *self, PyObject *args)
|
|||||||
nmesh = new_NMesh(me);
|
nmesh = new_NMesh(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hack: to mark that (deformed) mesh is readonly, so the update function
|
/* @hack: to mark that (deformed) mesh is readonly, so the update function
|
||||||
* will not try to write it. */
|
* will not try to write it. */
|
||||||
|
|
||||||
((BPy_NMesh *) nmesh)->mesh = 0;
|
((BPy_NMesh *) nmesh)->mesh = 0;
|
||||||
@ -1586,6 +1668,9 @@ static int convert_NMeshToMesh (Mesh *mesh, BPy_NMesh *nmesh)
|
|||||||
mesh->tface = NULL;
|
mesh->tface = NULL;
|
||||||
mesh->mat = NULL;
|
mesh->mat = NULL;
|
||||||
|
|
||||||
|
/* Minor note: we used 'mode' because 'flag' was already used internally by nmesh */
|
||||||
|
mesh->flag = nmesh->mode;
|
||||||
|
|
||||||
/*@ material assignment moved to PutRaw */
|
/*@ material assignment moved to PutRaw */
|
||||||
mesh->totvert = PySequence_Length(nmesh->verts);
|
mesh->totvert = PySequence_Length(nmesh->verts);
|
||||||
if (mesh->totvert) {
|
if (mesh->totvert) {
|
||||||
@ -1724,19 +1809,31 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
|||||||
if (name)
|
if (name)
|
||||||
mesh = (Mesh *)GetIdFromList(&(G.main->mesh), name);
|
mesh = (Mesh *)GetIdFromList(&(G.main->mesh), name);
|
||||||
|
|
||||||
if(!mesh || mesh->id.us == 0) {
|
if (!mesh) {
|
||||||
ob = add_object(OB_MESH);
|
ob = add_object(OB_MESH);
|
||||||
|
|
||||||
if (!ob) {
|
if (!ob) {
|
||||||
PyErr_SetString(PyExc_RuntimeError,
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
"Fatal: could not create mesh object");
|
"Fatal: could not create mesh object");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mesh)
|
|
||||||
set_mesh(ob, mesh);
|
|
||||||
else
|
|
||||||
mesh = (Mesh *)ob->data;
|
mesh = (Mesh *)ob->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (mesh->id.us == 0) {
|
||||||
|
ob = add_object(OB_EMPTY); /* we already have a mesh */
|
||||||
|
|
||||||
|
if (!ob) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
|
"Fatal: could not create mesh object");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ob->type = OB_MESH;
|
||||||
|
set_mesh(ob, mesh); /* also does id.us++ */
|
||||||
|
}
|
||||||
|
|
||||||
if (name) new_id(&(G.main->mesh), &mesh->id, name);
|
if (name) new_id(&(G.main->mesh), &mesh->id, name);
|
||||||
else if (nmesh->name && nmesh->name != Py_None)
|
else if (nmesh->name && nmesh->name != Py_None)
|
||||||
new_id(&(G.main->mesh), &mesh->id, PyString_AsString(nmesh->name));
|
new_id(&(G.main->mesh), &mesh->id, PyString_AsString(nmesh->name));
|
||||||
@ -1752,7 +1849,7 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
|||||||
if (!during_script())
|
if (!during_script())
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
|
|
||||||
// OK...this requires some explanation:
|
// @OK...this requires some explanation:
|
||||||
// Materials can be assigned two ways:
|
// Materials can be assigned two ways:
|
||||||
// a) to the object data (in this case, the mesh)
|
// a) to the object data (in this case, the mesh)
|
||||||
// b) to the Object
|
// b) to the Object
|
||||||
@ -1791,8 +1888,6 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
|||||||
{#func, M_NMesh_##func, METH_VARARGS, M_NMesh_##func##_doc}
|
{#func, M_NMesh_##func, METH_VARARGS, M_NMesh_##func##_doc}
|
||||||
|
|
||||||
static struct PyMethodDef M_NMesh_methods[] = {
|
static struct PyMethodDef M_NMesh_methods[] = {
|
||||||
/*@ These should be: Mesh.Col, Mesh.Vert, Mesh.Face in fure */
|
|
||||||
/* -- for ownership reasons */
|
|
||||||
MethodDef(Col),
|
MethodDef(Col),
|
||||||
MethodDef(Vert),
|
MethodDef(Vert),
|
||||||
MethodDef(Face),
|
MethodDef(Face),
|
||||||
@ -1803,6 +1898,23 @@ static struct PyMethodDef M_NMesh_methods[] = {
|
|||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static PyObject *M_NMesh_Modes (void)
|
||||||
|
{
|
||||||
|
PyObject *Modes = M_constant_New();
|
||||||
|
|
||||||
|
if (Modes) {
|
||||||
|
BPy_constant *d = (BPy_constant *)Modes;
|
||||||
|
|
||||||
|
constant_insert(d, "NOVNORMALSFLIP",
|
||||||
|
PyInt_FromLong(EXPP_NMESH_MODE_NOPUNOFLIP));
|
||||||
|
constant_insert(d, "TWOSIDED", PyInt_FromLong(EXPP_NMESH_MODE_TWOSIDED));
|
||||||
|
constant_insert(d, "AUTOSMOOTH",PyInt_FromLong(EXPP_NMESH_MODE_AUTOSMOOTH));
|
||||||
|
constant_insert(d, "SUBSURF", PyInt_FromLong(EXPP_NMESH_MODE_SUBSURF));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Modes;
|
||||||
|
}
|
||||||
|
|
||||||
#undef EXPP_ADDCONST
|
#undef EXPP_ADDCONST
|
||||||
#define EXPP_ADDCONST(dict, name) \
|
#define EXPP_ADDCONST(dict, name) \
|
||||||
constant_insert(dict, #name, PyInt_FromLong(TF_##name))
|
constant_insert(dict, #name, PyInt_FromLong(TF_##name))
|
||||||
@ -1868,6 +1980,7 @@ PyObject *NMesh_Init (void)
|
|||||||
{
|
{
|
||||||
PyObject *submodule;
|
PyObject *submodule;
|
||||||
|
|
||||||
|
PyObject *Modes = M_NMesh_Modes ();
|
||||||
PyObject *FaceFlags = M_NMesh_FaceFlagsDict ();
|
PyObject *FaceFlags = M_NMesh_FaceFlagsDict ();
|
||||||
PyObject *FaceModes = M_NMesh_FaceModesDict ();
|
PyObject *FaceModes = M_NMesh_FaceModesDict ();
|
||||||
PyObject *FaceTranspModes = M_NMesh_FaceTranspModesDict ();
|
PyObject *FaceTranspModes = M_NMesh_FaceTranspModesDict ();
|
||||||
@ -1879,10 +1992,11 @@ PyObject *NMesh_Init (void)
|
|||||||
|
|
||||||
submodule = Py_InitModule3("Blender.NMesh", M_NMesh_methods, M_NMesh_doc);
|
submodule = Py_InitModule3("Blender.NMesh", M_NMesh_methods, M_NMesh_doc);
|
||||||
|
|
||||||
if (FaceFlags) PyModule_AddObject (submodule, "FaceFlags" , FaceFlags);
|
if (Modes) PyModule_AddObject (submodule, "Modes", Modes);
|
||||||
if (FaceModes) PyModule_AddObject (submodule, "FaceModes" , FaceModes);
|
if (FaceFlags) PyModule_AddObject (submodule, "FaceFlags", FaceFlags);
|
||||||
|
if (FaceModes) PyModule_AddObject (submodule, "FaceModes", FaceModes);
|
||||||
if (FaceTranspModes)
|
if (FaceTranspModes)
|
||||||
PyModule_AddObject (submodule, "FaceTranspModes" , FaceTranspModes);
|
PyModule_AddObject (submodule, "FaceTranspModes", FaceTranspModes);
|
||||||
|
|
||||||
g_nmeshmodule = submodule;
|
g_nmeshmodule = submodule;
|
||||||
return submodule;
|
return submodule;
|
||||||
@ -1904,7 +2018,7 @@ int NMesh_CheckPyObject (PyObject *pyobj)
|
|||||||
return (pyobj->ob_type == &NMesh_Type);
|
return (pyobj->ob_type == &NMesh_Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh *NMesh_FromPyObject (PyObject *pyobj, Object *ob)
|
Mesh *Mesh_FromPyObject (PyObject *pyobj, Object *ob)
|
||||||
{
|
{
|
||||||
if (pyobj->ob_type == &NMesh_Type) {
|
if (pyobj->ob_type == &NMesh_Type) {
|
||||||
Mesh *mesh;
|
Mesh *mesh;
|
||||||
@ -1922,6 +2036,9 @@ Mesh *NMesh_FromPyObject (PyObject *pyobj, Object *ob)
|
|||||||
|
|
||||||
nmesh->object = ob; /* linking for vgrouping methods */
|
nmesh->object = ob; /* linking for vgrouping methods */
|
||||||
|
|
||||||
|
if (nmesh->name && nmesh->name != Py_None)
|
||||||
|
new_id(&(G.main->mesh), &mesh->id, PyString_AsString(nmesh->name));
|
||||||
|
|
||||||
mesh_update(mesh);
|
mesh_update(mesh);
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,12 @@
|
|||||||
#include "gen_utils.h"
|
#include "gen_utils.h"
|
||||||
#include "modules.h"
|
#include "modules.h"
|
||||||
|
|
||||||
|
/* EXPP Mesh defines */
|
||||||
|
|
||||||
|
#define EXPP_NMESH_MODE_NOPUNOFLIP ME_NOPUNOFLIP
|
||||||
|
#define EXPP_NMESH_MODE_TWOSIDED ME_TWOSIDED
|
||||||
|
#define EXPP_NMESH_MODE_AUTOSMOOTH ME_AUTOSMOOTH
|
||||||
|
#define EXPP_NMESH_MODE_SUBSURF ME_SUBSURF
|
||||||
|
|
||||||
/* EXPP PyType Objects */
|
/* EXPP PyType Objects */
|
||||||
|
|
||||||
@ -151,11 +157,14 @@ bone name and the weight.";
|
|||||||
|
|
||||||
static char NMesh_update_doc[] = "(recalc_normals = 0) - updates the Mesh.\n\
|
static char NMesh_update_doc[] = "(recalc_normals = 0) - updates the Mesh.\n\
|
||||||
if recalc_normals is given and is equal to 1, normal vectors are recalculated.";
|
if recalc_normals is given and is equal to 1, normal vectors are recalculated.";
|
||||||
/*
|
|
||||||
static char NMesh_asMesh_doc[] = "returns free Mesh datablock object from NMesh";
|
|
||||||
|
|
||||||
static char NMesh_link_doc[] = "(object) - Links NMesh data with Object 'object'";
|
static char NMesh_getMode_doc[] =
|
||||||
*/
|
"() - get the mode flags of this nmesh as an or'ed int value.";
|
||||||
|
|
||||||
|
static char NMesh_setMode_doc[] =
|
||||||
|
"(none to 4 strings) - set the mode flags of this nmesh.\n\
|
||||||
|
() - unset all flags.";
|
||||||
|
|
||||||
static char M_NMesh_New_doc[] =
|
static char M_NMesh_New_doc[] =
|
||||||
"() - returns a new, empty NMesh mesh object\n";
|
"() - returns a new, empty NMesh mesh object\n";
|
||||||
|
|
||||||
@ -213,12 +222,13 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
Mesh *mesh;
|
Mesh *mesh;
|
||||||
Object *object; /* object the mesh is linked to (can be NULL) */
|
Object *object; /* for vertex grouping info, since it's stored on the object */
|
||||||
PyObject *name;
|
PyObject *name;
|
||||||
PyObject *materials;
|
PyObject *materials;
|
||||||
PyObject *verts;
|
PyObject *verts;
|
||||||
PyObject *faces;
|
PyObject *faces;
|
||||||
int sel_face; /*@ XXX remove */
|
int sel_face; /*@ XXX remove */
|
||||||
|
short mode; /* see the EXPP_NMESH_* defines in the beginning of this file */
|
||||||
char flags;
|
char flags;
|
||||||
|
|
||||||
#define NMESH_HASMCOL 1<<0
|
#define NMESH_HASMCOL 1<<0
|
||||||
|
@ -97,6 +97,8 @@ static PyObject *Object_getName (BPy_Object *self);
|
|||||||
static PyObject *Object_getParent (BPy_Object *self);
|
static PyObject *Object_getParent (BPy_Object *self);
|
||||||
static PyObject *Object_getTracked (BPy_Object *self);
|
static PyObject *Object_getTracked (BPy_Object *self);
|
||||||
static PyObject *Object_getType (BPy_Object *self);
|
static PyObject *Object_getType (BPy_Object *self);
|
||||||
|
static PyObject *Object_getBoundBox (BPy_Object *self);
|
||||||
|
static PyObject *Object_makeDisplayList (BPy_Object *self);
|
||||||
static PyObject *Object_link (BPy_Object *self, PyObject *args);
|
static PyObject *Object_link (BPy_Object *self, PyObject *args);
|
||||||
static PyObject *Object_makeParent (BPy_Object *self, PyObject *args);
|
static PyObject *Object_makeParent (BPy_Object *self, PyObject *args);
|
||||||
static PyObject *Object_materialUsage (BPy_Object *self, PyObject *args);
|
static PyObject *Object_materialUsage (BPy_Object *self, PyObject *args);
|
||||||
@ -148,6 +150,12 @@ e.g. Mesh"},
|
|||||||
"Returns the object's tracked object"},
|
"Returns the object's tracked object"},
|
||||||
{"getType", (PyCFunction)Object_getType, METH_NOARGS,
|
{"getType", (PyCFunction)Object_getType, METH_NOARGS,
|
||||||
"Returns type of string of Object"},
|
"Returns type of string of Object"},
|
||||||
|
{"getBoundBox", (PyCFunction)Object_getBoundBox, METH_NOARGS,
|
||||||
|
"Returns the object's bounding box"},
|
||||||
|
{"makeDisplayList", (PyCFunction)Object_makeDisplayList, METH_NOARGS,
|
||||||
|
"Update this object's Display List. Some changes like turning \n\
|
||||||
|
'SubSurf' on for a mesh need this method (followed by a Redraw) to \n\
|
||||||
|
show the changes on the 3d window."},
|
||||||
{"link", (PyCFunction)Object_link, METH_VARARGS,
|
{"link", (PyCFunction)Object_link, METH_VARARGS,
|
||||||
"Links Object with data provided in the argument. The data must \n\
|
"Links Object with data provided in the argument. The data must \n\
|
||||||
match the Object's type, so you cannot link a Lamp to a Mesh type object."},
|
match the Object's type, so you cannot link a Lamp to a Mesh type object."},
|
||||||
@ -320,55 +328,6 @@ PyObject *M_Object_New(PyObject *self, PyObject *args)
|
|||||||
object->gameflag = OB_PROP;
|
object->gameflag = OB_PROP;
|
||||||
|
|
||||||
object->lay = 1; // Layer, by default visible
|
object->lay = 1; // Layer, by default visible
|
||||||
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case OB_ARMATURE:
|
|
||||||
/* TODO: Do we need to add something to G? (see the OB_LAMP case) */
|
|
||||||
object->data = add_armature();
|
|
||||||
break;
|
|
||||||
case OB_CAMERA:
|
|
||||||
/* TODO: Do we need to add something to G? (see the OB_LAMP case) */
|
|
||||||
object->data = add_camera();
|
|
||||||
break;
|
|
||||||
case OB_CURVE:
|
|
||||||
object->data = add_curve(OB_CURVE);
|
|
||||||
G.totcurve++;
|
|
||||||
break;
|
|
||||||
case OB_LAMP:
|
|
||||||
object->data = add_lamp();
|
|
||||||
G.totlamp++;
|
|
||||||
break;
|
|
||||||
case OB_MESH:
|
|
||||||
object->data = add_mesh();
|
|
||||||
G.totmesh++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* TODO the following types will be supported later
|
|
||||||
case OB_SURF:
|
|
||||||
object->data = add_curve(OB_SURF);
|
|
||||||
G.totcurve++;
|
|
||||||
break;
|
|
||||||
case OB_FONT:
|
|
||||||
object->data = add_curve(OB_FONT);
|
|
||||||
break;
|
|
||||||
case OB_MBALL:
|
|
||||||
object->data = add_mball();
|
|
||||||
break;
|
|
||||||
case OB_IKA:
|
|
||||||
object->data = add_ika();
|
|
||||||
object->dt = OB_WIRE;
|
|
||||||
break;
|
|
||||||
case OB_LATTICE:
|
|
||||||
object->data = (void *)add_lattice();
|
|
||||||
object->dt = OB_WIRE;
|
|
||||||
break;
|
|
||||||
case OB_WAVE:
|
|
||||||
object->data = add_wave();
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
G.totobj++;
|
G.totobj++;
|
||||||
|
|
||||||
/* Create a Python object from it. */
|
/* Create a Python object from it. */
|
||||||
@ -572,49 +531,98 @@ static PyObject *Object_clrParent (BPy_Object *self, PyObject *args)
|
|||||||
static PyObject *Object_getData (BPy_Object *self)
|
static PyObject *Object_getData (BPy_Object *self)
|
||||||
{
|
{
|
||||||
PyObject * data_object;
|
PyObject * data_object;
|
||||||
|
Object * object = self->object;
|
||||||
|
|
||||||
/* If there's no data associated to the Object, then there's nothing to */
|
/* If there's no data associated to the Object, then there's nothing to */
|
||||||
/* return. */
|
/* return. */
|
||||||
if (self->object->data == NULL)
|
if (object->data == NULL)
|
||||||
{
|
{
|
||||||
|
switch(object->type)
|
||||||
|
{
|
||||||
|
case OB_ARMATURE:
|
||||||
|
/* TODO: Do we need to add something to G? (see the OB_LAMP case) */
|
||||||
|
object->data = add_armature();
|
||||||
|
break;
|
||||||
|
case OB_CAMERA:
|
||||||
|
/* TODO: Do we need to add something to G? (see the OB_LAMP case) */
|
||||||
|
object->data = add_camera();
|
||||||
|
break;
|
||||||
|
case OB_CURVE:
|
||||||
|
object->data = add_curve(OB_CURVE);
|
||||||
|
G.totcurve++;
|
||||||
|
break;
|
||||||
|
case OB_LAMP:
|
||||||
|
object->data = add_lamp();
|
||||||
|
G.totlamp++;
|
||||||
|
break;
|
||||||
|
case OB_MESH:
|
||||||
|
object->data = add_mesh();
|
||||||
|
G.totmesh++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* TODO the following types will be supported later
|
||||||
|
case OB_SURF:
|
||||||
|
object->data = add_curve(OB_SURF);
|
||||||
|
G.totcurve++;
|
||||||
|
break;
|
||||||
|
case OB_FONT:
|
||||||
|
object->data = add_curve(OB_FONT);
|
||||||
|
break;
|
||||||
|
case OB_MBALL:
|
||||||
|
object->data = add_mball();
|
||||||
|
break;
|
||||||
|
case OB_IKA:
|
||||||
|
object->data = add_ika();
|
||||||
|
object->dt = OB_WIRE;
|
||||||
|
break;
|
||||||
|
case OB_LATTICE:
|
||||||
|
object->data = (void *)add_lattice();
|
||||||
|
object->dt = OB_WIRE;
|
||||||
|
break;
|
||||||
|
case OB_WAVE:
|
||||||
|
object->data = add_wave();
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
default:
|
||||||
Py_INCREF (Py_None);
|
Py_INCREF (Py_None);
|
||||||
return (Py_None);
|
return (Py_None);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data_object = NULL;
|
data_object = NULL;
|
||||||
|
|
||||||
switch (self->object->type)
|
switch (object->type)
|
||||||
{
|
{
|
||||||
case OB_ARMATURE:
|
case OB_ARMATURE:
|
||||||
data_object = Armature_CreatePyObject (self->object->data);
|
data_object = Armature_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case OB_CAMERA:
|
case OB_CAMERA:
|
||||||
data_object = Camera_CreatePyObject (self->object->data);
|
data_object = Camera_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case OB_CURVE:
|
case OB_CURVE:
|
||||||
data_object = Curve_CreatePyObject (self->object->data);
|
data_object = Curve_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case ID_IM:
|
case ID_IM:
|
||||||
data_object = Image_CreatePyObject (self->object->data);
|
data_object = Image_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case ID_IP:
|
case ID_IP:
|
||||||
data_object = Ipo_CreatePyObject (self->object->data);
|
data_object = Ipo_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case OB_LAMP:
|
case OB_LAMP:
|
||||||
data_object = Lamp_CreatePyObject (self->object->data);
|
data_object = Lamp_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case ID_MA:
|
case ID_MA:
|
||||||
break;
|
break;
|
||||||
case OB_MESH:
|
case OB_MESH:
|
||||||
data_object = NMesh_CreatePyObject (self->object->data, self->object);
|
data_object = NMesh_CreatePyObject (object->data, object);
|
||||||
break;
|
break;
|
||||||
case ID_OB:
|
case ID_OB:
|
||||||
data_object = Object_CreatePyObject (self->object->data);
|
data_object = Object_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case ID_SCE:
|
case ID_SCE:
|
||||||
break;
|
break;
|
||||||
case ID_TXT:
|
case ID_TXT:
|
||||||
data_object = Text_CreatePyObject (self->object->data);
|
data_object = Text_CreatePyObject (object->data);
|
||||||
break;
|
break;
|
||||||
case ID_WO:
|
case ID_WO:
|
||||||
break;
|
break;
|
||||||
@ -781,6 +789,70 @@ static PyObject *Object_getType (BPy_Object *self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *Object_getBoundBox (BPy_Object *self)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
float *vec = NULL;
|
||||||
|
PyObject *vector, *bbox;
|
||||||
|
|
||||||
|
if (!self->object->data)
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||||
|
"This object isn't linked to any object data (mesh, curve, etc) yet");
|
||||||
|
|
||||||
|
if (!self->object->bb) {
|
||||||
|
Mesh *me;
|
||||||
|
Curve *curve;
|
||||||
|
switch (self->object->type) {
|
||||||
|
case OB_MESH:
|
||||||
|
me = self->object->data;
|
||||||
|
if (!me->bb) tex_space_mesh(me);
|
||||||
|
vec = (float *)me->bb->vec;
|
||||||
|
break;
|
||||||
|
case OB_CURVE:
|
||||||
|
case OB_FONT:
|
||||||
|
case OB_SURF:
|
||||||
|
curve = self->object->data;
|
||||||
|
if (!curve->bb) tex_space_curve(curve);
|
||||||
|
vec = (float *)curve->bb->vec;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Py_INCREF (Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else vec = (float *)self->object->bb->vec;
|
||||||
|
|
||||||
|
if (!vec)
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||||
|
"couldn't retrieve bounding box data");
|
||||||
|
|
||||||
|
bbox = PyList_New(8);
|
||||||
|
|
||||||
|
if (!bbox)
|
||||||
|
return EXPP_ReturnPyObjError (PyExc_MemoryError,
|
||||||
|
"couldn't create pylist");
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
vector = newVectorObject(vec, 3);
|
||||||
|
PyList_SET_ITEM(bbox, i, vector);
|
||||||
|
vec += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *Object_makeDisplayList (BPy_Object *self)
|
||||||
|
{
|
||||||
|
Object *ob = self->object;
|
||||||
|
|
||||||
|
if (ob->type == OB_FONT) text_to_curve(ob, 0);
|
||||||
|
|
||||||
|
makeDispList(ob);
|
||||||
|
|
||||||
|
Py_INCREF (Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *Object_link (BPy_Object *self, PyObject *args)
|
static PyObject *Object_link (BPy_Object *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject * py_data;
|
PyObject * py_data;
|
||||||
@ -801,7 +873,7 @@ static PyObject *Object_link (BPy_Object *self, PyObject *args)
|
|||||||
if (Curve_CheckPyObject (py_data))
|
if (Curve_CheckPyObject (py_data))
|
||||||
data = (void *)Curve_FromPyObject (py_data);
|
data = (void *)Curve_FromPyObject (py_data);
|
||||||
if (NMesh_CheckPyObject (py_data))
|
if (NMesh_CheckPyObject (py_data))
|
||||||
data = (void *)NMesh_FromPyObject (py_data, self->object);
|
data = (void *)Mesh_FromPyObject (py_data, self->object);
|
||||||
|
|
||||||
/* have we set data to something good? */
|
/* have we set data to something good? */
|
||||||
if( !data )
|
if( !data )
|
||||||
|
@ -43,6 +43,8 @@
|
|||||||
#include <BKE_mesh.h>
|
#include <BKE_mesh.h>
|
||||||
#include <BKE_object.h>
|
#include <BKE_object.h>
|
||||||
#include <BKE_scene.h>
|
#include <BKE_scene.h>
|
||||||
|
#include <BKE_displist.h> /* for makeDispList */
|
||||||
|
#include <BKE_font.h> /* for text_to_font */
|
||||||
#include <BLI_arithb.h>
|
#include <BLI_arithb.h>
|
||||||
#include <BLI_blenlib.h>
|
#include <BLI_blenlib.h>
|
||||||
#include <DNA_armature_types.h>
|
#include <DNA_armature_types.h>
|
||||||
|
@ -152,13 +152,14 @@ def PupMenu(name, maxrow = None):
|
|||||||
L{Menu}: options are followed by a format code and separated by the '|'
|
L{Menu}: options are followed by a format code and separated by the '|'
|
||||||
character. Valid format codes are:
|
character. Valid format codes are:
|
||||||
- %t - The option should be used as the title of the pop-up;
|
- %t - The option should be used as the title of the pop-up;
|
||||||
- %l - insert a separating line;
|
- %l - insert a separating line (only works if 'maxrow' isn't given);
|
||||||
- %xB{N} - Chosen this option, PupMenu should return the integer B{N}.
|
- %xB{N} - Chosen this option, PupMenu should return the integer B{N}.
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
name = "OK?%t|QUIT BLENDER" # if no %xN integer is set, indices start from 1
|
name = "OK?%t|QUIT BLENDER" # if no %xN int is set, indices start from 1
|
||||||
result = Draw.PupMenu(name)
|
result = Draw.PupMenu(name)
|
||||||
if result: Draw.PupMenu("Do you really think we'd let scripts close Blender?%t|Yes|No")
|
if result:
|
||||||
|
Draw.PupMenu("Really?%t|Yes|No")
|
||||||
|
|
||||||
@type name: string
|
@type name: string
|
||||||
@param name: The format string to define the contents of the button.
|
@param name: The format string to define the contents of the button.
|
||||||
|
@ -28,9 +28,15 @@ Example::
|
|||||||
v.co[2] *= 2.5
|
v.co[2] *= 2.5
|
||||||
me.update() # update the real mesh in Blender
|
me.update() # update the real mesh in Blender
|
||||||
|
|
||||||
|
@type Modes: readonly dictionary
|
||||||
@type FaceFlags: readonly dictionary
|
@type FaceFlags: readonly dictionary
|
||||||
@type FaceModes: readonly dictionary
|
@type FaceModes: readonly dictionary
|
||||||
@type FaceTranspModes: readonly dictionary
|
@type FaceTranspModes: readonly dictionary
|
||||||
|
@var Modes: The available mesh modes.
|
||||||
|
- NOVNORMALSFLIP - no flipping of vertex normals during render.
|
||||||
|
- TWOSIDED - double sided mesh.
|
||||||
|
- AUTOSMOOTH - turn auto smoothing of faces "on".
|
||||||
|
- SUBSURF - turn Catmull-Clark subdivision of surfaces "on".
|
||||||
@var FaceFlags: The available face selection flags.
|
@var FaceFlags: The available face selection flags.
|
||||||
- SELECT - selected.
|
- SELECT - selected.
|
||||||
- HIDE - hidden.
|
- HIDE - hidden.
|
||||||
@ -89,9 +95,11 @@ def Face(vertexList = None):
|
|||||||
@return: A new NMFace object.
|
@return: A new NMFace object.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def New():
|
def New(name = 'Mesh'):
|
||||||
"""
|
"""
|
||||||
Create a new mesh object.
|
Create a new mesh object.
|
||||||
|
@type name: string
|
||||||
|
@param name: An optional name for the created mesh.
|
||||||
rtype: NMesh
|
rtype: NMesh
|
||||||
@return: A new (B{empty}) NMesh object.
|
@return: A new (B{empty}) NMesh object.
|
||||||
"""
|
"""
|
||||||
@ -223,6 +231,7 @@ class NMesh:
|
|||||||
@cvar verts: The list of NMesh vertices (NMVerts).
|
@cvar verts: The list of NMesh vertices (NMVerts).
|
||||||
@cvar users: The number of Objects using (linked to) this mesh.
|
@cvar users: The number of Objects using (linked to) this mesh.
|
||||||
@cvar faces: The list of NMesh faces (NMFaces).
|
@cvar faces: The list of NMesh faces (NMFaces).
|
||||||
|
@cvar mode: The mode flags for this mesh. See L{setMode}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def addMaterial(material):
|
def addMaterial(material):
|
||||||
@ -348,3 +357,23 @@ class NMesh:
|
|||||||
@param recalc_normals: If given and equal to 1, the vertex normals are
|
@param recalc_normals: If given and equal to 1, the vertex normals are
|
||||||
recalculated.
|
recalculated.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def getMode():
|
||||||
|
"""
|
||||||
|
Get this mesh's mode flags.
|
||||||
|
@rtype: int
|
||||||
|
@return: Or'ed value. See L{Modes}.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setMode(m = None, m1=None, m2=None, m3=None):
|
||||||
|
"""
|
||||||
|
Set the mode flags for this mesh. Given mode strings turn the mode "on".
|
||||||
|
Modes not passed in are turned "off", so setMode() (without arguments)
|
||||||
|
unsets all mode flags.
|
||||||
|
@type m: string
|
||||||
|
@param m: mode string. From none to 4 can be given:
|
||||||
|
- "NoVNormalsFlip"
|
||||||
|
- "TwoSided"
|
||||||
|
- "AutoSmooth"
|
||||||
|
- "SubSurf"
|
||||||
|
"""
|
||||||
|
@ -409,3 +409,34 @@ class Object:
|
|||||||
@type object: Blender Object
|
@type object: Blender Object
|
||||||
@param object: A Blender Object of the same type.
|
@param object: A Blender Object of the same type.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def getBoundBox():
|
||||||
|
"""
|
||||||
|
Returns the bounding box of this object. This works for meshes (out of
|
||||||
|
edit mode) and curves.
|
||||||
|
@rtype: list of 8 (x,y,z) float coordinate vectors
|
||||||
|
@return: The coordinates of the 8 corners of the bounding box.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def makeDisplayList():
|
||||||
|
"""
|
||||||
|
Updates this object's display list. Blender uses display lists to store
|
||||||
|
already transformed data (like a mesh with its vertices already modified
|
||||||
|
by coordinate transformations and armature deformation). If the object
|
||||||
|
isn't modified, there's no need to recalculate this data. This method is
|
||||||
|
here for the *few cases* where a script may need it, like when toggling
|
||||||
|
the "SubSurf" mode for a mesh:
|
||||||
|
Example::
|
||||||
|
object = Blender.Object.Get("Sphere")
|
||||||
|
nmesh = object.getData()
|
||||||
|
nmesh.setMode("SubSurf")
|
||||||
|
nmesh.update() # don't forget to update!
|
||||||
|
object.makeDisplayList()
|
||||||
|
Blender.Window.RedrawAll() # and don't forget to redraw
|
||||||
|
|
||||||
|
If you try this example without the line to update the display list, the
|
||||||
|
object will disappear from the screen until you press "SubSurf".
|
||||||
|
@warn: If after running your script objects disappear from the screen or
|
||||||
|
are not displayed correctly, try this method function. But if the script
|
||||||
|
works properly without it, there's no reason to use it.
|
||||||
|
"""
|
||||||
|
@ -86,7 +86,7 @@ PyObject * Types_Init (void);
|
|||||||
/* NMesh Data */
|
/* NMesh Data */
|
||||||
PyObject * NMesh_Init (void);
|
PyObject * NMesh_Init (void);
|
||||||
PyObject * NMesh_CreatePyObject (Mesh *me, Object *ob);
|
PyObject * NMesh_CreatePyObject (Mesh *me, Object *ob);
|
||||||
Mesh * NMesh_FromPyObject (PyObject *pyobj, Object *ob);
|
Mesh * Mesh_FromPyObject (PyObject *pyobj, Object *ob);
|
||||||
int NMesh_CheckPyObject (PyObject *pyobj);
|
int NMesh_CheckPyObject (PyObject *pyobj);
|
||||||
|
|
||||||
/* Material */
|
/* Material */
|
||||||
|
Loading…
Reference in New Issue
Block a user