From 29831ca0871112e7b5ddfd3439adbef1ac19d3cb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 17 Mar 2012 06:40:44 +0000 Subject: bmesh py api: added per loop UV layer access --- source/blender/python/bmesh/CMakeLists.txt | 2 + source/blender/python/bmesh/bmesh_py_api.c | 2 + source/blender/python/bmesh/bmesh_py_types.c | 6 + .../python/bmesh/bmesh_py_types_customdata.c | 4 +- .../blender/python/bmesh/bmesh_py_types_meshdata.c | 132 +++++++++++++++++++++ .../blender/python/bmesh/bmesh_py_types_meshdata.h | 41 +++++++ 6 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 source/blender/python/bmesh/bmesh_py_types_meshdata.c create mode 100644 source/blender/python/bmesh/bmesh_py_types_meshdata.h (limited to 'source') diff --git a/source/blender/python/bmesh/CMakeLists.txt b/source/blender/python/bmesh/CMakeLists.txt index 512b3291186..40bde7161b6 100644 --- a/source/blender/python/bmesh/CMakeLists.txt +++ b/source/blender/python/bmesh/CMakeLists.txt @@ -35,12 +35,14 @@ set(SRC bmesh_py_api.c bmesh_py_types.c bmesh_py_types_customdata.c + bmesh_py_types_meshdata.c bmesh_py_types_select.c bmesh_py_utils.c bmesh_py_api.h bmesh_py_types.h bmesh_py_types_customdata.h + bmesh_py_types_meshdata.h bmesh_py_types_select.h bmesh_py_utils.h ) diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c index 9ef6929a8d5..23a3f6ed5c0 100644 --- a/source/blender/python/bmesh/bmesh_py_api.c +++ b/source/blender/python/bmesh/bmesh_py_api.c @@ -36,6 +36,7 @@ #include "bmesh_py_types.h" #include "bmesh_py_types_select.h" #include "bmesh_py_types_customdata.h" +#include "bmesh_py_types_meshdata.h" #include "bmesh_py_utils.h" @@ -133,6 +134,7 @@ PyObject *BPyInit_bmesh(void) BPy_BM_init_types(); BPy_BM_init_types_select(); BPy_BM_init_types_customdata(); + BPy_BM_init_types_meshdata(); mod = PyModule_Create(&BPy_BM_module_def); diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 217631dcabf..84aadb9b8f6 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -47,6 +47,7 @@ #include "bmesh_py_types.h" /* own include */ #include "bmesh_py_types_select.h" #include "bmesh_py_types_customdata.h" +#include "bmesh_py_types_meshdata.h" /* Common Flags * ************ */ @@ -2770,6 +2771,7 @@ PyObject *BPyInit_bmesh_types(void) #define mod_type_add(s, 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_BMVert_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_BMLoopSeq_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_BMEditSelIter_Type); + /* bmesh_py_types_customdata.c */ mod_type_add(submodule, BPy_BMLayerAccess_Type); mod_type_add(submodule, BPy_BMLayerCollection_Type); mod_type_add(submodule, BPy_BMLayerItem_Type); + /* bmesh_py_types_meshdata.c */ + mod_type_add(submodule, BPy_BMLoopUV_Type); #undef mod_type_add diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c index 01a91d1cafc..f3232ef334b 100644 --- a/source/blender/python/bmesh/bmesh_py_types_customdata.c +++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c @@ -39,6 +39,7 @@ #include "bmesh_py_types.h" #include "bmesh_py_types_customdata.h" +#include "bmesh_py_types_meshdata.h" #include "../mathutils/mathutils.h" @@ -649,8 +650,7 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer) } case CD_MLOOPUV: { - ret = Py_NotImplemented; /* TODO */ - Py_INCREF(ret); + ret = BPy_BMLoopUV_CreatePyObject(value); break; } case CD_MLOOPCOL: diff --git a/source/blender/python/bmesh/bmesh_py_types_meshdata.c b/source/blender/python/bmesh/bmesh_py_types_meshdata.c new file mode 100644 index 00000000000..2d89b514058 --- /dev/null +++ b/source/blender/python/bmesh/bmesh_py_types_meshdata.c @@ -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 + +#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(); +} diff --git a/source/blender/python/bmesh/bmesh_py_types_meshdata.h b/source/blender/python/bmesh/bmesh_py_types_meshdata.h new file mode 100644 index 00000000000..4255166ef08 --- /dev/null +++ b/source/blender/python/bmesh/bmesh_py_types_meshdata.h @@ -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__ */ -- cgit v1.2.3