[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46127] trunk/blender/source/blender: bmesh - python api
Campbell Barton
ideasman42 at gmail.com
Wed May 2 12:35:14 CEST 2012
This isn't the intention, Brecht said that the default name was used
to denote if a customdata layer have multiple members, probably this
is right but since int/float/string layers are not added by the UI,
nobody ever ran into an issue with them, will look into this when I
get back online properly.
On Tue, May 1, 2012 at 9:14 PM, Andrew Hale <trumanblending at gmail.com> wrote:
> 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
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
--
- Campbell
More information about the Bf-committers
mailing list