initial python support for dealing with multires meshes.

Can only change levels and values at the moment. adding and removing is still needed.

multires: bool
multiresLevelCount: int
multiresDrawLevel: int
multiresEdgeLevel: int
multiresPinLevel: int
multiresRenderLevel: int
This commit is contained in:
2006-12-24 10:51:31 +00:00
parent edf18ca767
commit 1be58e7a8d
3 changed files with 157 additions and 6 deletions

View File

@@ -48,7 +48,7 @@ extern PyTypeObject KeyBlock_Type;
typedef struct {
PyObject_HEAD /* required python macro */
Key * key;
/* Object *object;/* /* for vertex grouping info, since it's stored on the object */
/* Object *object;*/ /* for vertex grouping info, since it's stored on the object */
/*PyObject *keyBlock;*/
PyObject *ipo;
} BPy_Key;

View File

@@ -87,7 +87,7 @@
#include "meshPrimitive.h"
#include "constant.h"
#include "gen_utils.h"
#include "multires.h"
/* EXPP Mesh defines */
@@ -101,6 +101,12 @@
#define MESH_HASFACEUV 0
#define MESH_HASMCOL 1
#define MESH_HASVERTUV 2
#define MESH_HASMULTIRES 3
#define MESH_MULTIRES_LEVEL 0
#define MESH_MULTIRES_EDGE 1
#define MESH_MULTIRES_PIN 2
#define MESH_MULTIRES_RENDER 3
#define MESH_TOOL_TOSPHERE 0
#define MESH_TOOL_VERTEXSMOOTH 1
@@ -6392,7 +6398,6 @@ static PyObject *Mesh_removeLayer_internal( BPy_Mesh * self, PyObject * args, in
{
Mesh *me = self->mesh;
CustomData *data = &me->fdata;
CustomDataLayer *layer;
char *name;
int i;
@@ -6540,6 +6545,91 @@ static int Mesh_setActiveLayer( BPy_Mesh * self, PyObject * value, void *type )
return 0;
}
/* multires */
static PyObject *Mesh_getMultiresLevelCount( BPy_Mesh * self )
{
int i;
if (!self->mesh->mr)
i=0;
else
i= self->mesh->mr->level_count;
return PyInt_FromLong(i);
}
static PyObject *Mesh_getMultires( BPy_Mesh * self, void *type )
{
int i=0;
if (self->mesh->mr) {
switch ((int)type) {
case MESH_MULTIRES_LEVEL:
i = self->mesh->mr->newlvl;
break;
case MESH_MULTIRES_EDGE:
i = self->mesh->mr->edgelvl;
break;
case MESH_MULTIRES_PIN:
i = self->mesh->mr->pinlvl;
break;
case MESH_MULTIRES_RENDER:
i = self->mesh->mr->renderlvl;
break;
}
}
return PyInt_FromLong(i);
}
static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type )
{
int i;
if( !PyInt_CheckExact( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected integer argument" );
if (!self->object)
return EXPP_ReturnIntError( PyExc_RuntimeError,
"This mesh must be linked to an object" );
if (!self->mesh->mr)
return EXPP_ReturnIntError( PyExc_RuntimeError,
"the mesh has no multires data" );
if (!self->mesh->mr->level_count)
return EXPP_ReturnIntError( PyExc_RuntimeError,
"multires data has no levels added" );
i = PyInt_AsLong(value);
if (i<1||i>self->mesh->mr->level_count)
return EXPP_ReturnIntError( PyExc_TypeError,
"value out of range" );
switch ((int)type) {
case MESH_MULTIRES_LEVEL:
self->mesh->mr->newlvl = i;
multires_set_level(self->object, self->mesh);
break;
case MESH_MULTIRES_EDGE:
self->mesh->mr->edgelvl = i;
multires_edge_level_update(self->object, self->mesh);
break;
case MESH_MULTIRES_PIN:
self->mesh->mr->pinlvl = i;
break;
case MESH_MULTIRES_RENDER:
self->mesh->mr->renderlvl = i;
break;
}
return 0;
}
/* end multires */
static PyObject *Mesh_Tools( BPy_Mesh * self, int type, void **args )
{
Base *base;
@@ -7129,6 +7219,10 @@ static PyObject *Mesh_getFlag( BPy_Mesh * self, void *type )
attr = self->mesh->msticky ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
break;
case MESH_HASMULTIRES:
attr = self->mesh->mr ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
break;
default:
attr = NULL;
}
@@ -7194,6 +7288,21 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
}
}
return 0;
case MESH_HASMULTIRES:
if (!self->object)
return EXPP_ReturnIntError( PyExc_RuntimeError,
"This mesh must be linked to an object" );
if( !param ) {
if ( mesh->mr ) {
multires_delete(self->object, mesh);
}
} else {
if ( !mesh->mr ) {
multires_make(self->object, mesh);
}
}
return 0;
default:
return EXPP_ReturnIntError( PyExc_RuntimeError,
"couldn't get attribute" );
@@ -7531,6 +7640,10 @@ static PyGetSetDef BPy_Mesh_getseters[] = {
(getter)Mesh_getFlag, (setter)Mesh_setFlag,
"'Sticky' flag for per vertex UV coordinates enabled",
(void *)MESH_HASVERTUV},
{"multires",
(getter)Mesh_getFlag, (setter)Mesh_setFlag,
"'Sticky' flag for per vertex UV coordinates enabled",
(void *)MESH_HASMULTIRES},
{"activeFace",
(getter)Mesh_getActiveFace, (setter)Mesh_setActiveFace,
"Index of the mesh's active texture face (in UV editor)",
@@ -7548,6 +7661,7 @@ static PyGetSetDef BPy_Mesh_getseters[] = {
"Active group for the mesh",
NULL},
/* uv layers */
{"activeColorLayer",
(getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer,
"Name of the active UV layer",
@@ -7556,7 +7670,29 @@ static PyGetSetDef BPy_Mesh_getseters[] = {
(getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer,
"Name of the active vertex color layer",
(void *)CD_MTFACE},
/* Multires */
{"multiresLevelCount",
(getter)Mesh_getMultiresLevelCount, (setter)NULL,
"The total number of multires levels",
NULL},
{"multiresDrawLevel",
(getter)Mesh_getMultires, (setter)Mesh_setMultires,
"The current multires display level",
(void *)MESH_MULTIRES_LEVEL},
{"multiresEdgeLevel",
(getter)Mesh_getMultires, (setter)Mesh_setMultires,
"The current multires edge level",
(void *)MESH_MULTIRES_EDGE},
{"multiresPinLevel",
(getter)Mesh_getMultires, (setter)Mesh_setMultires,
"The current multires pin level",
(void *)MESH_MULTIRES_PIN},
{"multiresRenderLevel",
(getter)Mesh_getMultires, (setter)Mesh_setMultires,
"The current multires render level",
(void *)MESH_MULTIRES_RENDER},
{"texMesh",
(getter)Mesh_getTexMesh, (setter)Mesh_setTexMesh,
"The meshes tex mesh proxy texture coord mesh",

View File

@@ -60,13 +60,13 @@ done once.
- AUTOSMOOTH - turn auto smoothing of faces "on".
- note: SUBSURF and OPTIMAL have been removed, use Modifiers to apply subsurf.
@var FaceFlags: The available *texture face* (uv face select mode) selection
flags. Note: these refer to TexFace faces, available if mesh.faceUV()
flags. Note: these refer to TexFace faces, available if mesh.faceUV
returns true.
- SELECT - selected.
- HIDE - hidden.
- ACTIVE - the active face, read only - Use L{mesh.activeFace<Mesh.Mesh.activeFace>} to set.
@var FaceModes: The available *texture face* modes. Note: these are only
meaningful if mesh.faceUV() returns true, since in Blender this info is
meaningful if mesh.faceUV returns true, since in Blender this info is
stored at the TexFace (TexFace button in Edit Mesh buttons) structure.
- ALL - set all modes at once.
- BILLBOARD - always orient after camera.
@@ -780,6 +780,21 @@ class Mesh:
@type activeUVLayer: string
@ivar activeColorLayer: The mesh's active Vertex Color layer. None if there is no UV/Image layers.
@type activeColorLayer: string
@ivar multires: The mesh has multires data, set True to add multires data.
@type multires: bool
@ivar multiresLevelCount: The mesh has multires data. (read only)
@type multiresLevelCount: int
@ivar multiresDrawLevel: The multires level to display in the 3dview in [1 - multiresLevelCount].
@type multiresDrawLevel: int
@ivar multiresEdgeLevel: The multires level edge display in the 3dview [1 - multiresLevelCount].
@type multiresEdgeLevel: int
@ivar multiresPinLevel: The multires pin level, used for applying modifiers [1 - multiresLevelCount].
@type multiresPinLevel: int
@ivar multiresRenderLevel: The multires level to render [1 - multiresLevelCount].
@type multiresRenderLevel: int
"""
def getFromObject(object, cage=0, render=0):