bmesh py api:

add mtexpoly image access
This commit is contained in:
Campbell Barton 2012-05-01 06:50:43 +00:00
parent ae4fda82b0
commit 9fe1fe0aa8
6 changed files with 127 additions and 6 deletions

View File

@ -845,7 +845,6 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
prim.mface++;
// bind texture images to faces
if (texture_face && (*color_texture)) {
texture_face->mode = TF_TEX;
texture_face->tpage = (Image*)(*color_texture)->tex->ima;
texture_face++;
}

View File

@ -178,7 +178,7 @@ typedef enum GPUBuiltinShader {
} GPUBuiltinShader;
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
void GPU_shader_free_builtin_shaders();
void GPU_shader_free_builtin_shaders(void);
/* Vertex attributes for shaders */

View File

@ -989,8 +989,7 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer)
}
case CD_MTEXPOLY:
{
ret = Py_NotImplemented; /* TODO */
Py_INCREF(ret);
ret = BPy_BMTexPoly_CreatePyObject(value);
break;
}
case CD_MLOOPUV:
@ -1083,8 +1082,7 @@ int BPy_BMLayerItem_SetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer, PyObj
}
case CD_MTEXPOLY:
{
PyErr_SetString(PyExc_AttributeError, "readonly"); /* could make this writeable later */
ret = -1;
ret = BPy_BMTexPoly_AssignPyObject(value, py_value);
break;
}
case CD_MLOOPUV:

View File

@ -41,9 +41,100 @@
#include "BLI_math_vector.h"
#include "BKE_deform.h"
#include "BKE_library.h"
#include "bmesh_py_types_meshdata.h"
/* Mesh BMTexPoly
* ************** */
#define BPy_BMTexPoly_Check(v) (Py_TYPE(v) == &BPy_BMTexPoly_Type)
typedef struct BPy_BMTexPoly {
PyObject_VAR_HEAD
MTexPoly *data;
} BPy_BMTexPoly;
extern PyObject *pyrna_id_CreatePyObject(ID *id);
extern int pyrna_id_FromPyObject(PyObject *obj, ID **id);
PyDoc_STRVAR(bpy_bmtexpoly_image_doc,
"Image or None.\n\n:type: :class:`bpy.types.Image`"
);
static PyObject *bpy_bmtexpoly_image_get(BPy_BMTexPoly *self, void *UNUSED(closure))
{
return pyrna_id_CreatePyObject((ID *)self->data->tpage);
}
static int bpy_bmtexpoly_image_set(BPy_BMTexPoly *self, PyObject *value, void *UNUSED(closure))
{
ID *id;
if (value == Py_None) {
id = NULL;
}
else if (pyrna_id_FromPyObject(value, &id) && id && GS(id->name) == ID_IM) {
/* pass */
}
else {
PyErr_Format(PyExc_KeyError, "BMTexPoly.image = x"
"expected an image or None, not '%.200s'",
Py_TYPE(value)->tp_name);
return -1;
}
id_lib_extern(id);
self->data->tpage = (struct Image *)id;
return 0;
}
static PyGetSetDef bpy_bmtexpoly_getseters[] = {
/* attributes match rna_def_mtpoly */
{(char *)"image", (getter)bpy_bmtexpoly_image_get, (setter)bpy_bmtexpoly_image_set, (char *)bpy_bmtexpoly_image_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
PyTypeObject BPy_BMTexPoly_Type = {{{0}}}; /* bm.loops.layers.uv.active */
static void bm_init_types_bmtexpoly(void)
{
BPy_BMTexPoly_Type.tp_basicsize = sizeof(BPy_BMTexPoly);
BPy_BMTexPoly_Type.tp_name = "BMTexPoly";
BPy_BMTexPoly_Type.tp_doc = NULL; // todo
BPy_BMTexPoly_Type.tp_getset = bpy_bmtexpoly_getseters;
BPy_BMTexPoly_Type.tp_flags = Py_TPFLAGS_DEFAULT;
PyType_Ready(&BPy_BMTexPoly_Type);
}
int BPy_BMTexPoly_AssignPyObject(struct MTexPoly *mtpoly, PyObject *value)
{
if (UNLIKELY(!BPy_BMTexPoly_Check(value))) {
PyErr_Format(PyExc_TypeError, "expected BMTexPoly, not a %.200s", Py_TYPE(value)->tp_name);
return -1;
}
else {
*((MTexPoly *)mtpoly) = *(((BPy_BMTexPoly *)value)->data);
return 0;
}
}
PyObject *BPy_BMTexPoly_CreatePyObject(struct MTexPoly *mtpoly)
{
BPy_BMTexPoly *self = PyObject_New(BPy_BMTexPoly, &BPy_BMTexPoly_Type);
self->data = mtpoly;
return (PyObject *)self;
}
/* --- End Mesh BMTexPoly --- */
/* Mesh Loop UV
* ************ */
@ -597,6 +688,7 @@ PyObject *BPy_BMDeformVert_CreatePyObject(struct MDeformVert *dvert)
/* call to init all types */
void BPy_BM_init_types_meshdata(void)
{
bm_init_types_bmtexpoly();
bm_init_types_bmloopuv();
bm_init_types_bmloopcol();
bm_init_types_bmdvert();

View File

@ -40,10 +40,17 @@ typedef struct BPy_BMGenericMeshData {
void *data;
} BPy_BMGenericMeshData;
struct MTexPoly;
struct MLoopUV;
struct MLoopCol;
struct MDeformVert;
int BPy_BMTexPoly_AssignPyObject(struct MTexPoly *mloopuv, PyObject *value);
PyObject *BPy_BMTexPoly_CreatePyObject(struct MTexPoly *mloopuv);
int BPy_BMLoopUV_AssignPyObject(struct MLoopUV *data, PyObject *value);
PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data);
int BPy_BMLoopUV_AssignPyObject(struct MLoopUV *data, PyObject *value);
PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data);

View File

@ -6254,6 +6254,31 @@ PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
return (PyObject *)pyrna;
}
/* utility func to be used by external modules, *sneaky!* */
PyObject *pyrna_id_CreatePyObject(ID *id)
{
if (id) {
PointerRNA ptr;
RNA_id_pointer_create(id, &ptr);
return pyrna_struct_CreatePyObject(&ptr);
}
else {
Py_RETURN_NONE;
}
}
int pyrna_id_FromPyObject(PyObject *obj, ID **id)
{
if (BPy_StructRNA_Check(obj) && (RNA_struct_is_ID(((BPy_StructRNA *)obj)->ptr.type))) {
*id = ((BPy_StructRNA *)obj)->ptr.id.data;
return TRUE;
}
else {
*id = NULL;
return FALSE;
}
}
void BPY_rna_init(void)
{
#ifdef USE_MATHUTILS // register mathutils callbacks, ok to run more then once.