From aafd71a8a160bdf44ab3ccea37e88bb90b87a2ac Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Sat, 10 Oct 2020 11:13:01 -0300 Subject: Fix T81060: CustomData Correction sometimes breaks UVs and Vertex Colors `CustomData_bmesh_interp` use the same CustomData decryptor (in this case, `bm->ldata`) in both blocks. So make sure that all CustomData layers match. This commit also removes redundant `BM_elem_attrs_copy_ex` calls. Maniphest Tasks: T81060 Differential Revision: https://developer.blender.org/D9159 --- source/blender/bmesh/intern/bmesh_construct.c | 41 +++++++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_construct.h | 4 +++ 2 files changed, 45 insertions(+) (limited to 'source/blender/bmesh') diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 81494b03558..757ab735134 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -606,6 +606,47 @@ void BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const BMAllocTem CustomData_bmesh_init_pool(&bm_dst->pdata, allocsize->totface, BM_FACE); } +/** + * Similar to #BM_mesh_copy_init_customdata but copies all layers ignoring + * flags like #CD_FLAG_NOCOPY. + * + * \param bm_dst: BMesh whose custom-data layers will be added. + * \param bm_src: BMesh whose custom-data layers will be copied. + * \param htype: Specifies which custom-datas will be initiated. + * \param allocsize: Estimated number of elements to init the mempool. + */ +void BM_mesh_copy_init_customdata_all_layers(BMesh *bm_dst, + BMesh *bm_src, + const char htype, + const BMAllocTemplate *allocsize) +{ + if (allocsize == NULL) { + allocsize = &bm_mesh_allocsize_default; + } + + const char htypes[4] = {BM_VERT, BM_EDGE, BM_LOOP, BM_FACE}; + BLI_assert(((&bm_dst->vdata + 1) == &bm_dst->edata) && + ((&bm_dst->vdata + 2) == &bm_dst->ldata) && ((&bm_dst->vdata + 3) == &bm_dst->pdata)); + + BLI_assert(((&allocsize->totvert + 1) == &allocsize->totedge) && + ((&allocsize->totvert + 2) == &allocsize->totloop) && + ((&allocsize->totvert + 3) == &allocsize->totface)); + + for (int i = 0; i < 4; i++) { + if (!(htypes[i] & htype)) { + continue; + } + CustomData *dst = &bm_dst->vdata + i; + CustomData *src = &bm_src->vdata + i; + const int size = *(&allocsize->totvert + i); + + for (int l = 0; l < src->totlayer; l++) { + CustomData_add_layer(dst, src->layers[l].type, CD_CALLOC, NULL, 0); + } + CustomData_bmesh_init_pool(dst, size, htypes[i]); + } +} + BMesh *BM_mesh_copy(BMesh *bm_old) { BMesh *bm_new; diff --git a/source/blender/bmesh/intern/bmesh_construct.h b/source/blender/bmesh/intern/bmesh_construct.h index 3523c4aec1a..f5102283ede 100644 --- a/source/blender/bmesh/intern/bmesh_construct.h +++ b/source/blender/bmesh/intern/bmesh_construct.h @@ -69,6 +69,10 @@ void BM_elem_select_copy(BMesh *bm_dst, void *ele_dst_v, const void *ele_src_v); void BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const struct BMAllocTemplate *allocsize); +void BM_mesh_copy_init_customdata_all_layers(BMesh *bm_dst, + BMesh *bm_src, + const char htype, + const struct BMAllocTemplate *allocsize); BMesh *BM_mesh_copy(BMesh *bm_old); char BM_face_flag_from_mflag(const char mflag); -- cgit v1.2.3