diff --git a/source/blender/blenkernel/BKE_customdata.hh b/source/blender/blenkernel/BKE_customdata.hh index 291032a7c88..03341b89a3a 100644 --- a/source/blender/blenkernel/BKE_customdata.hh +++ b/source/blender/blenkernel/BKE_customdata.hh @@ -347,6 +347,11 @@ void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest, void *src_block, void **dest_block); +/** + * Copy all layers from the sourde to the destination block. Allocate the result block if + * necessary, otherwise free its existing layer data. + */ +void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block); void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source, CustomData *dest, void *src_block, diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index b7e7c7c77b2..f71cc507f06 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -3899,6 +3899,35 @@ void CustomData_bmesh_copy_data(const CustomData *source, CustomData_bmesh_copy_data_exclude_by_type(source, dest, src_block, dest_block, 0); } +void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block) +{ + if (*dst_block) { + for (const CustomDataLayer &layer : Span(data.layers, data.totlayer)) { + const LayerTypeInfo &info = *layerType_getInfo(eCustomDataType(layer.type)); + if (info.free) { + info.free(POINTER_OFFSET(*dst_block, layer.offset), 1); + } + } + } + else { + if (data.totsize == 0) { + return; + } + *dst_block = BLI_mempool_alloc(data.pool); + } + + for (const CustomDataLayer &layer : Span(data.layers, data.totlayer)) { + const int offset = layer.offset; + const LayerTypeInfo &info = *layerType_getInfo(eCustomDataType(layer.type)); + if (info.copy) { + info.copy(POINTER_OFFSET(src_block, offset), POINTER_OFFSET(*dst_block, offset), 1); + } + else { + memcpy(POINTER_OFFSET(*dst_block, offset), POINTER_OFFSET(src_block, offset), info.size); + } + } +} + void *CustomData_bmesh_get(const CustomData *data, void *block, const eCustomDataType type) { int layer_index = CustomData_get_active_layer_index(data, type); diff --git a/source/blender/bmesh/intern/bmesh_construct.cc b/source/blender/bmesh/intern/bmesh_construct.cc index 982aa2c5316..0c5eb94e233 100644 --- a/source/blender/bmesh/intern/bmesh_construct.cc +++ b/source/blender/bmesh/intern/bmesh_construct.cc @@ -443,9 +443,32 @@ void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void BM_elem_attrs_copy_ex(bm_src, bm_dst, ele_src, ele_dst, BM_ELEM_SELECT, 0x0); } -void BM_elem_attrs_copy(BMesh &bm, const void *ele_src, void *ele_dst) +void BM_elem_attrs_copy(BMesh &bm, const BMVert *src, BMVert *dst) { - BM_elem_attrs_copy_ex(&bm, &bm, ele_src, ele_dst, BM_ELEM_SELECT, 0x0); + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm.vdata, src->head.data, &dst->head.data); + dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; + copy_v3_v3(dst->no, src->no); +} +void BM_elem_attrs_copy(BMesh &bm, const BMEdge *src, BMEdge *dst) +{ + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm.edata, src->head.data, &dst->head.data); + dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; +} +void BM_elem_attrs_copy(BMesh &bm, const BMFace *src, BMFace *dst) +{ + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm.pdata, src->head.data, &dst->head.data); + dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; + copy_v3_v3(dst->no, src->no); + dst->mat_nr = src->mat_nr; +} +void BM_elem_attrs_copy(BMesh &bm, const BMLoop *src, BMLoop *dst) +{ + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm.ldata, src->head.data, &dst->head.data); + dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; } void BM_elem_select_copy(BMesh *bm_dst, void *ele_dst_v, const void *ele_src_v) diff --git a/source/blender/bmesh/intern/bmesh_construct.hh b/source/blender/bmesh/intern/bmesh_construct.hh index 6587f3765ea..c70f2b13591 100644 --- a/source/blender/bmesh/intern/bmesh_construct.hh +++ b/source/blender/bmesh/intern/bmesh_construct.hh @@ -134,7 +134,10 @@ void BM_elem_attrs_copy_ex(BMesh *bm_src, void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v); /** Copy attributes between elements in the same BMesh. */ -void BM_elem_attrs_copy(BMesh &bm, const void *ele_src, void *ele_dst); +void BM_elem_attrs_copy(BMesh &bm, const BMVert *src, BMVert *dst); +void BM_elem_attrs_copy(BMesh &bm, const BMEdge *src, BMEdge *dst); +void BM_elem_attrs_copy(BMesh &bm, const BMFace *src, BMFace *dst); +void BM_elem_attrs_copy(BMesh &bm, const BMLoop *src, BMLoop *dst); void BM_elem_select_copy(BMesh *bm_dst, void *ele_dst_v, const void *ele_src_v);