bmesh py api:

added per loop UV layer access
This commit is contained in:
Campbell Barton 2012-03-17 06:40:44 +00:00
parent 8634d0e9c1
commit 29831ca087
6 changed files with 185 additions and 2 deletions

@ -35,12 +35,14 @@ set(SRC
bmesh_py_api.c bmesh_py_api.c
bmesh_py_types.c bmesh_py_types.c
bmesh_py_types_customdata.c bmesh_py_types_customdata.c
bmesh_py_types_meshdata.c
bmesh_py_types_select.c bmesh_py_types_select.c
bmesh_py_utils.c bmesh_py_utils.c
bmesh_py_api.h bmesh_py_api.h
bmesh_py_types.h bmesh_py_types.h
bmesh_py_types_customdata.h bmesh_py_types_customdata.h
bmesh_py_types_meshdata.h
bmesh_py_types_select.h bmesh_py_types_select.h
bmesh_py_utils.h bmesh_py_utils.h
) )

@ -36,6 +36,7 @@
#include "bmesh_py_types.h" #include "bmesh_py_types.h"
#include "bmesh_py_types_select.h" #include "bmesh_py_types_select.h"
#include "bmesh_py_types_customdata.h" #include "bmesh_py_types_customdata.h"
#include "bmesh_py_types_meshdata.h"
#include "bmesh_py_utils.h" #include "bmesh_py_utils.h"
@ -133,6 +134,7 @@ PyObject *BPyInit_bmesh(void)
BPy_BM_init_types(); BPy_BM_init_types();
BPy_BM_init_types_select(); BPy_BM_init_types_select();
BPy_BM_init_types_customdata(); BPy_BM_init_types_customdata();
BPy_BM_init_types_meshdata();
mod = PyModule_Create(&BPy_BM_module_def); mod = PyModule_Create(&BPy_BM_module_def);

@ -47,6 +47,7 @@
#include "bmesh_py_types.h" /* own include */ #include "bmesh_py_types.h" /* own include */
#include "bmesh_py_types_select.h" #include "bmesh_py_types_select.h"
#include "bmesh_py_types_customdata.h" #include "bmesh_py_types_customdata.h"
#include "bmesh_py_types_meshdata.h"
/* Common Flags /* Common Flags
* ************ */ * ************ */
@ -2770,6 +2771,7 @@ PyObject *BPyInit_bmesh_types(void)
#define mod_type_add(s, t) \ #define mod_type_add(s, t) \
PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t) PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t)
/* bmesh_py_types.c */
mod_type_add(submodule, BPy_BMesh_Type); mod_type_add(submodule, BPy_BMesh_Type);
mod_type_add(submodule, BPy_BMVert_Type); mod_type_add(submodule, BPy_BMVert_Type);
mod_type_add(submodule, BPy_BMEdge_Type); mod_type_add(submodule, BPy_BMEdge_Type);
@ -2781,11 +2783,15 @@ PyObject *BPyInit_bmesh_types(void)
mod_type_add(submodule, BPy_BMFaceSeq_Type); mod_type_add(submodule, BPy_BMFaceSeq_Type);
mod_type_add(submodule, BPy_BMLoopSeq_Type); mod_type_add(submodule, BPy_BMLoopSeq_Type);
mod_type_add(submodule, BPy_BMIter_Type); mod_type_add(submodule, BPy_BMIter_Type);
/* bmesh_py_types_select.c */
mod_type_add(submodule, BPy_BMEditSelSeq_Type); mod_type_add(submodule, BPy_BMEditSelSeq_Type);
mod_type_add(submodule, BPy_BMEditSelIter_Type); mod_type_add(submodule, BPy_BMEditSelIter_Type);
/* bmesh_py_types_customdata.c */
mod_type_add(submodule, BPy_BMLayerAccess_Type); mod_type_add(submodule, BPy_BMLayerAccess_Type);
mod_type_add(submodule, BPy_BMLayerCollection_Type); mod_type_add(submodule, BPy_BMLayerCollection_Type);
mod_type_add(submodule, BPy_BMLayerItem_Type); mod_type_add(submodule, BPy_BMLayerItem_Type);
/* bmesh_py_types_meshdata.c */
mod_type_add(submodule, BPy_BMLoopUV_Type);
#undef mod_type_add #undef mod_type_add

@ -39,6 +39,7 @@
#include "bmesh_py_types.h" #include "bmesh_py_types.h"
#include "bmesh_py_types_customdata.h" #include "bmesh_py_types_customdata.h"
#include "bmesh_py_types_meshdata.h"
#include "../mathutils/mathutils.h" #include "../mathutils/mathutils.h"
@ -649,8 +650,7 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer)
} }
case CD_MLOOPUV: case CD_MLOOPUV:
{ {
ret = Py_NotImplemented; /* TODO */ ret = BPy_BMLoopUV_CreatePyObject(value);
Py_INCREF(ret);
break; break;
} }
case CD_MLOOPCOL: case CD_MLOOPCOL:

@ -0,0 +1,132 @@
/*
* ***** BEGIN GPL 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.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2012 Blender Foundation.
* All rights reserved.
*
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/python/bmesh/bmesh_py_types_meshdata.c
* \ingroup pybmesh
*
* This file defines customdata types which can't be accessed as primitive
* python types such as MDeformVert, MLoopUV, MTexPoly
*/
#include <Python.h>
#include "../mathutils/mathutils.h"
#include "DNA_meshdata_types.h"
#include "BLI_utildefines.h"
#include "BLI_math_vector.h"
/* Mesh Loop UV
* ************ */
typedef struct BPy_BMLoopUV {
PyObject_VAR_HEAD
MLoopUV *data;
} BPy_BMLoopUV;
static PyObject *bpy_bmloopuv_uv_get(BPy_BMLoopUV *self, void *UNUSED(closure))
{
return Vector_CreatePyObject(self->data->uv, 2, Py_WRAP, NULL);
}
static int bpy_bmloopuv_uv_set(BPy_BMLoopUV *self, PyObject *value, void *UNUSED(closure))
{
float tvec[2];
if (mathutils_array_parse(tvec, 2, 2, value, "BMLoop.uv") != -1) {
copy_v2_v2(self->data->uv, tvec);
return 0;
}
else {
return -1;
}
}
static PyObject *bpy_bmloopuv_flag_get(BPy_BMLoopUV *self, void *flag_p)
{
const int flag = GET_INT_FROM_POINTER(flag_p);
return PyBool_FromLong(self->data->flag & flag);
}
static int bpy_bmloopuv_flag_set(BPy_BMLoopUV *self, PyObject *value, void *flag_p)
{
const int flag = GET_INT_FROM_POINTER(flag_p);
switch (PyLong_AsLong(value)) {
case TRUE:
self->data->flag |= flag;
return 0;
case FALSE:
self->data->flag &= ~flag;
return 0;
default:
PyErr_SetString(PyExc_TypeError,
"expected a boolean type 0/1");
return -1;
}
}
static PyGetSetDef bpy_bmloopuv_getseters[] = {
/* attributes match rna_def_mloopuv */
{(char *)"uv", (getter)bpy_bmloopuv_uv_get, (setter)bpy_bmloopuv_uv_set, (char *)NULL, NULL},
{(char *)"pin_uv", (getter)bpy_bmloopuv_flag_get, (setter)bpy_bmloopuv_flag_set, (char *)NULL, (void *)MLOOPUV_PINNED},
{(char *)"select", (getter)bpy_bmloopuv_flag_get, (setter)bpy_bmloopuv_flag_set, (char *)NULL, (void *)MLOOPUV_VERTSEL},
{(char *)"select_edge", (getter)bpy_bmloopuv_flag_get, (setter)bpy_bmloopuv_flag_set, (char *)NULL, (void *)MLOOPUV_EDGESEL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
PyTypeObject BPy_BMLoopUV_Type = {{{0}}}; /* bm.loops.layers.uv.active */
static void bm_init_types_bmloopuv(void)
{
BPy_BMLoopUV_Type.tp_basicsize = sizeof(BPy_BMLoopUV);
BPy_BMLoopUV_Type.tp_name = "BMLoopUV";
BPy_BMLoopUV_Type.tp_doc = NULL; // todo
BPy_BMLoopUV_Type.tp_getset = bpy_bmloopuv_getseters;
BPy_BMLoopUV_Type.tp_flags = Py_TPFLAGS_DEFAULT;
PyType_Ready(&BPy_BMLoopUV_Type);
}
PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data)
{
BPy_BMLoopUV *self = PyObject_New(BPy_BMLoopUV, &BPy_BMLoopUV_Type);
self->data = data;
return (PyObject *)self;
}
/* --- End Mesh Loop UV --- */
/* call to init all types */
void BPy_BM_init_types_meshdata(void)
{
bm_init_types_bmloopuv();
}

@ -0,0 +1,41 @@
/*
* ***** BEGIN GPL 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.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2012 Blender Foundation.
* All rights reserved.
*
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/python/bmesh/bmesh_py_types_meshdata.h
* \ingroup pybmesh
*/
#ifndef __BMESH_PY_TYPES_MESHDATA_H__
#define __BMESH_PY_TYPES_MESHDATA_H__
extern PyTypeObject BPy_BMLoopUV_Type;
struct MLoopUV;
PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data);
void BPy_BM_init_types_meshdata(void);
#endif /* __BMESH_PY_TYPES_MESHDATA_H__ */