[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46127] trunk/blender/source/blender: bmesh - python api
Andrew Hale
trumanblending at gmail.com
Tue May 1 13:14:27 CEST 2012
Hi Campbell,
Seems we cannot create multiple customdata layers of ANY type, i.e. no
multiple float/int/string layers at all in py. Was this intended?
Cheers,
Andrew
On Tue, May 1, 2012 at 4:54 AM, Campbell Barton <ideasman42 at gmail.com>wrote:
> Revision: 46127
>
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46127
> Author: campbellbarton
> Date: 2012-04-30 18:54:14 +0000 (Mon, 30 Apr 2012)
> Log Message:
> -----------
> bmesh - python api
>
> - bm.*.layers.*.verify()
> - bm.*.layers.*.is_singleton
> - bm.*.layers.*.copy_from(other)
>
>
> also added api functons
> - BM_data_layer_copy(...)
> - CustomData_layertype_is_singleton(type)
>
> Modified Paths:
> --------------
> trunk/blender/source/blender/blenkernel/BKE_customdata.h
> trunk/blender/source/blender/blenkernel/intern/customdata.c
> trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
> trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
> trunk/blender/source/blender/editors/mesh/mesh_data.c
> trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_customdata.h 2012-04-30
> 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/blenkernel/BKE_customdata.h 2012-04-30
> 18:54:14 UTC (rev 46127)
> @@ -305,6 +305,7 @@
>
> /* get the name of a layer type */
> const char *CustomData_layertype_name(int type);
> +int CustomData_layertype_is_singleton(int type);
>
> /* make sure the name of layer at index is unique */
> void CustomData_set_layer_unique_name(struct CustomData *data, int index);
>
> Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-04-30
> 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-04-30
> 18:54:14 UTC (rev 46127)
> @@ -71,8 +71,12 @@
> int size; /* the memory size of one element of this
> layer's data */
> const char *structname; /* name of the struct used, for file
> writing */
> int structnum; /* number of structs per element, for file
> writing */
> - const char *defaultname; /* default layer name */
>
> + /* default layer name.
> + * note! when NULL this is a way to ensure there is only ever one
> item
> + * see: CustomData_layertype_is_singleton() */
> + const char *defaultname;
> +
> /* a function to copy count elements of this layer's data
> * (deep copy if appropriate)
> * if NULL, memcpy is used
> @@ -2601,6 +2605,16 @@
> return layerType_getName(type);
> }
>
> +
> +/**
> + * Can only ever be one of these.
> + */
> +int CustomData_layertype_is_singleton(int type)
> +{
> + const LayerTypeInfo *typeInfo = layerType_getInfo(type);
> + return typeInfo->defaultname != NULL;
> +}
> +
> static int CustomData_is_property_layer(int type)
> {
> if ((type == CD_PROP_FLT) || (type == CD_PROP_INT) || (type ==
> CD_PROP_STR))
>
> Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
> ===================================================================
> --- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c 2012-04-30
> 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c 2012-04-30
> 18:54:14 UTC (rev 46127)
> @@ -853,6 +853,52 @@
> if (olddata.layers) MEM_freeN(olddata.layers);
> }
>
> +void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n,
> int dst_n)
> +{
> + BMIter iter;
> +
> + if (&bm->vdata == data) {
> + BMVert *eve;
> +
> + BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
> + void *ptr = CustomData_bmesh_get_n(data,
> eve->head.data, type, dst_n);
> + CustomData_bmesh_set_n(data, eve->head.data, type,
> src_n, ptr);
> + }
> + }
> + else if (&bm->edata == data) {
> + BMEdge *eed;
> +
> + BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
> + void *ptr = CustomData_bmesh_get_n(data,
> eed->head.data, type, dst_n);
> + CustomData_bmesh_set_n(data, eed->head.data, type,
> src_n, ptr);
> + }
> + }
> + else if (&bm->pdata == data) {
> + BMFace *efa;
> +
> + BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
> + void *ptr = CustomData_bmesh_get_n(data,
> efa->head.data, type, dst_n);
> + CustomData_bmesh_set_n(data, efa->head.data, type,
> src_n, ptr);
> + }
> + }
> + else if (&bm->ldata == data) {
> + BMIter liter;
> + BMFace *efa;
> + BMLoop *l;
> +
> + BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
> + BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
> + void *ptr = CustomData_bmesh_get_n(data,
> l->head.data, type, dst_n);
> + CustomData_bmesh_set_n(data, l->head.data,
> type, src_n, ptr);
> + }
> + }
> + }
> + else {
> + /* should never reach this! */
> + BLI_assert(0);
> + }
> +}
> +
> float BM_elem_float_data_get(CustomData *cd, void *element, int type)
> {
> float *f = CustomData_bmesh_get(cd, ((BMHeader *)element)->data,
> type);
>
> Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
> ===================================================================
> --- trunk/blender/source/blender/bmesh/intern/bmesh_interp.h 2012-04-30
> 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.h 2012-04-30
> 18:54:14 UTC (rev 46127)
> @@ -36,6 +36,8 @@
> void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type,
> const char *name);
> void BM_data_layer_free(BMesh *em, CustomData *data, int type);
> void BM_data_layer_free_n(BMesh *bm, CustomData *data, int type, int n);
> +void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int
> src_n, int dst_n);
> +
> float BM_elem_float_data_get(CustomData *cd, void *element, int type);
> void BM_elem_float_data_set(CustomData *cd, void *element, int type,
> const float val);
>
>
> Modified: trunk/blender/source/blender/editors/mesh/mesh_data.c
> ===================================================================
> --- trunk/blender/source/blender/editors/mesh/mesh_data.c 2012-04-30
> 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/editors/mesh/mesh_data.c 2012-04-30
> 18:54:14 UTC (rev 46127)
> @@ -189,42 +189,6 @@
> }
> }
>
> -/* copies from active to 'index' */
> -static void editmesh_face_copy_customdata(BMEditMesh *em, int type, int
> index)
> -{
> - BMesh *bm = em->bm;
> - CustomData *pdata = &bm->pdata;
> - BMIter iter;
> - BMFace *efa;
> - const int n = CustomData_get_active_layer(pdata, type);
> -
> - /* ensure all current elements follow new customdata layout */
> - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
> - void *data = CustomData_bmesh_get_n(pdata, efa->head.data,
> type, n);
> - CustomData_bmesh_set_n(pdata, efa->head.data, type, index,
> data);
> - }
> -}
> -
> -/* copies from active to 'index' */
> -static void editmesh_loop_copy_customdata(BMEditMesh *em, int type, int
> index)
> -{
> - BMesh *bm = em->bm;
> - CustomData *ldata = &bm->ldata;
> - BMIter iter;
> - BMIter liter;
> - BMFace *efa;
> - BMLoop *loop;
> - const int n = CustomData_get_active_layer(ldata, type);
> -
> - /* ensure all current elements follow new customdata layout */
> - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
> - BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
> - void *data = CustomData_bmesh_get_n(ldata,
> loop->head.data, type, n);
> - CustomData_bmesh_set_n(ldata, loop->head.data,
> type, index, data);
> - }
> - }
> -}
> -
> int ED_mesh_uv_loop_reset_ex(struct bContext *C, struct Mesh *me, const
> int layernum)
> {
> BMEditMesh *em = me->edit_btmesh;
> @@ -360,7 +324,8 @@
> BM_data_layer_add_named(em->bm, &em->bm->pdata,
> CD_MTEXPOLY, name);
> /* copy data from active UV */
> if (layernum) {
> - editmesh_face_copy_customdata(em, CD_MTEXPOLY,
> layernum);
> + const int layernum_dst =
> CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY);
> + BM_data_layer_copy(em->bm, &em->bm->pdata,
> CD_MTEXPOLY, layernum, layernum_dst);
> }
> if (active_set || layernum == 0) {
> CustomData_set_layer_active(&em->bm->pdata,
> CD_MTEXPOLY, layernum);
> @@ -370,7 +335,9 @@
> BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV,
> name);
> /* copy data from active UV */
> if (layernum) {
> - editmesh_loop_copy_customdata(em, CD_MLOOPUV,
> layernum);
> + const int layernum_dst =
> CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV);
> + BM_data_layer_copy(em->bm, &em->bm->ldata,
> CD_MLOOPUV, layernum, layernum_dst);
> +
> is_init = TRUE;
> }
> if (active_set || layernum == 0) {
> @@ -457,7 +424,8 @@
> BM_data_layer_add_named(em->bm, &em->bm->ldata,
> CD_MLOOPCOL, name);
> /* copy data from active vertex color layer */
> if (layernum) {
> - editmesh_loop_copy_customdata(em, CD_MLOOPCOL,
> layernum);
> + const int layernum_dst =
> CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPCOL);
> + BM_data_layer_copy(em->bm, &em->bm->ldata,
> CD_MLOOPUV, layernum, layernum_dst);
> }
> if (active_set || layernum == 0) {
> CustomData_set_layer_active(&em->bm->ldata,
> CD_MLOOPCOL, layernum);
>
> Modified:
> trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
> ===================================================================
> --- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
> 2012-04-30 18:37:34 UTC (rev 46126)
> +++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
> 2012-04-30 18:54:14 UTC (rev 46127)
> @@ -124,7 +124,7 @@
>
>
> PyDoc_STRVAR(bpy_bmlayercollection_active_doc,
> -"This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`"
> +"The active layer of this type (read-only).\n\n:type:
> :class:`BMLayerItem`"
> );
> static PyObject *bpy_bmlayercollection_active_get(BPy_BMLayerItem *self,
> void *UNUSED(flag))
> {
> @@ -145,6 +145,17 @@
> }
> }
>
> +
> +PyDoc_STRVAR(bpy_bmlayercollection_is_singleton_doc,
> +"This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`"
> +);
> +static PyObject *bpy_bmlayercollection_is_singleton_get(BPy_BMLayerItem
> *self, void *UNUSED(flag))
> +{
> + BPY_BM_CHECK_OBJ(self);
> +
> + return
> PyBool_FromLong(CustomData_layertype_is_singleton(self->type));
> +}
> +
> PyDoc_STRVAR(bpy_bmlayercollection_name_doc,
> "The layers unique name (read-only).\n\n:type: string"
> );
> @@ -211,7 +222,8 @@
>
> static PyGetSetDef bpy_bmlayercollection_getseters[] = {
> /* BMESH_TODO, make writeable */
> - {(char *)"active", (getter)bpy_bmlayercollection_active_get,
> (setter)NULL, (char *)bpy_bmlayercollection_active_doc, NULL},
> + {(char *)"active", (getter)bpy_bmlayercollection_active_get,
> (setter)NULL, (char *)bpy_bmlayercollection_active_doc, NULL},
> + {(char *)"is_singleton",
> (getter)bpy_bmlayercollection_is_singleton_get, (setter)NULL, (char
> *)bpy_bmlayercollection_is_singleton_doc, NULL},
>
> {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
> };
> @@ -230,7 +242,88 @@
> /* BMLayerCollection
> * ----------------- */
>
> +PyDoc_STRVAR(bpy_bmlayeritem_copy_from_doc,
> +".. method:: copy_from(other)\n"
> +"\n"
> +" Return a copy of the layer\n"
> +"\n"
> +" :arg other: Another layer to copy from.\n"
> +" :arg other: :class:`BMLayerItem`\n"
> +);
> +static PyObject *bpy_bmlayeritem_copy_from(BPy_BMLayerItem *self,
> BPy_BMLayerItem *value)
> +{
> + CustomData *data;
>
> + if (!BPy_BMLayerItem_Check(value)) {
> + PyErr_Format(PyExc_TypeError,
> + "layer.copy_from(x): expected BMLayerItem,
> not '%.200s'",
> + Py_TYPE(value)->tp_name);
> + return NULL;
> + }
> +
> + BPY_BM_CHECK_OBJ(self);
> + BPY_BM_CHECK_OBJ(value);
> +
> + if (self->bm != value->bm) {
> + PyErr_SetString(PyExc_ValueError,
> + "layer.copy_from(): layer is from another
> mesh");
> + return NULL;
> + }
> +
> + else if ((self->htype != value->htype) ||
> + (self->type != value->type) ||
> + (self->index != value->index))
> + {
> + PyErr_SetString(PyExc_ValueError,
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list