-- added an optional "cage" parameter to mesh.getFromObject() to allow

getting cage vertices from geometry objects
This commit is contained in:
Ken Hughes 2005-11-20 01:07:54 +00:00
parent b6c5b24f4f
commit a86b0af575
2 changed files with 40 additions and 22 deletions

@ -639,7 +639,7 @@ static PyObject *MCol_getAttr( BPy_MCol * self, void *type )
unsigned char param;
PyObject *attr;
switch( (int)type ) {
switch( (long)type ) {
case 'R': /* these are backwards, but that how it works */
param = self->color->b;
break;
@ -655,7 +655,8 @@ static PyObject *MCol_getAttr( BPy_MCol * self, void *type )
default:
{
char errstr[1024];
sprintf( errstr, "undefined type '%d' in MCol_getAttr", (int)type );
sprintf( errstr, "undefined type '%d' in MCol_getAttr",
(int)((long)type & 0xff));
return EXPP_ReturnPyObjError( PyExc_RuntimeError, errstr );
}
}
@ -676,23 +677,24 @@ static int MCol_setAttr( BPy_MCol * self, PyObject * value, void * type )
{
unsigned char *param;
switch( (int)type ) {
switch( (long)type ) {
case 'R': /* these are backwards, but that how it works */
param = &self->color->b;
param = (unsigned char *)&self->color->b;
break;
case 'G':
param = &self->color->g;
param = (unsigned char *)&self->color->g;
break;
case 'B': /* these are backwards, but that how it works */
param = &self->color->r;
param = (unsigned char *)&self->color->r;
break;
case 'A':
param = &self->color->a;
param = (unsigned char *)&self->color->a;
break;
default:
{
char errstr[1024];
sprintf( errstr, "undefined type '%d' in MCol_setAttr", (int)type );
sprintf( errstr, "undefined type '%d' in MCol_setAttr",
(int)((long)type & 0xff));
return EXPP_ReturnIntError( PyExc_RuntimeError, errstr );
}
}
@ -3065,7 +3067,7 @@ static PyObject *MFace_getMFlagBits( BPy_MFace * self, void * type )
if( !face )
return NULL;
return EXPP_getBitfield( &face->flag, (int)type, 'b' );
return EXPP_getBitfield( &face->flag, (int)((long)type & 0xff), 'b' );
}
/*
@ -3080,7 +3082,7 @@ static int MFace_setMFlagBits( BPy_MFace * self, PyObject * value,
if( !face )
return -1;
return EXPP_setBitfield( value, &face->flag, (int)type, 'b' );
return EXPP_setBitfield( value, &face->flag, (int)((long)type & 0xff), 'b' );
}
/*
@ -4736,10 +4738,15 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
DispListMesh *dlm;
DerivedMesh *dm;
Object *tmpobj = NULL;
int cage = 0;
if( !PyArg_ParseTuple( args, "s", &name ) )
if( !PyArg_ParseTuple( args, "s|i", &name, &cage ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected string argument" );
"expected string and optional integer arguments" );
if( cage != 0 && cage != 1 )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"cage value must be 0 or 1" );
/* find the specified object */
ob = ( Object * ) GetIdFromList( &( G.main->object ), name );
@ -4756,6 +4763,10 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
tmpcu = (Curve *)tmpobj->data;
tmpcu->id.us--;
/* if getting the original caged mesh, delete object modifiers */
if( cage )
object_free_modifiers(tmpobj);
/* copies the data */
tmpobj->data = copy_curve( (Curve *) ob->data );
@ -4768,6 +4779,7 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
MEM_freeN( cu->disp.first );
cu->disp.first = NULL;
}
#endif
/* get updated display list, and convert to a mesh */
@ -4793,11 +4805,13 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
G.totmesh++;
tmpmesh = tmpobj->data;
/* get the final derived mesh */
dm = mesh_create_derived_render( tmpobj );
dlm = dm->convertToDispListMesh( dm, 0 );
displistmesh_to_mesh( dlm, tmpmesh );
dm->release( dm );
/* if not getting the original caged mesh, get final derived mesh */
if( !cage ) {
dm = mesh_create_derived_render( tmpobj );
dlm = dm->convertToDispListMesh( dm, 0 );
displistmesh_to_mesh( dlm, tmpmesh );
dm->release( dm );
}
/* take control of mesh before object is freed */
tmpobj->data = NULL;
@ -5752,7 +5766,7 @@ static PyObject *Mesh_getFlag( BPy_Mesh * self, void *type )
{
PyObject *attr;
switch( (int)type ) {
switch( (long)type ) {
case MESH_HASFACEUV:
attr = self->mesh->tface ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
@ -5793,7 +5807,7 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
/* sticky is independent of faceUV and vertUV */
/* faceUV (tface) has priority over vertUV (mcol) */
switch( (int)type ) {
switch( (long)type ) {
case MESH_HASFACEUV:
if( !param ) {
if( mesh->tface ) {

@ -620,17 +620,21 @@ class Mesh:
@type activeFace: int
"""
def getFromObject(name):
def getFromObject(name,cage=0):
"""
Replace the mesh's existing data with the raw mesh data from a Blender
Object. This method supports all the geometry based objects (mesh, text,
curve, surface, and meta). If the object has modifiers, they will be
applied before to the object before extracting the vertex data.
@note: The mesh coordinates are in i{local space}, not the world space of
applied before to the object before extracting the vertex data unless
the B{cage} parameter is 1.
@note: The mesh coordinates are in I{local space}, not the world space of
its object. For world space vertex coordinates, each vertex location must
be multiplied by the object's 4x4 transform matrix (see L{transform}).
@type name: string
@param name: name of the Blender object which contains the geometry data.
@type cage: int
@param cage: determines whether the original vertices or derived vertices
(for objects with modifiers) are used. The default is derived vertices.
"""
def calcNormals():