diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-11-09 08:58:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-11-09 09:07:23 +0300 |
commit | 2eb94f30368bef17c6d0b4e2d16cd3e6d9290184 (patch) | |
tree | c00748c2ccb3b356aa0f24eece0e2cf3017b3413 | |
parent | b3597f310d0e34b021b83fe6c94bdf258ced24ed (diff) |
Fix T92384: Wrong UV layers used with Boolean Modifier (Fast Solver)
Ensure the layers from the source mesh are used instead of the
object referenced by the boolean modifier.
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 20 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.h | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean.cc | 4 |
3 files changed, 28 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 6f7b2cbc79f..a10a911b06c 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -31,6 +31,7 @@ #include "BKE_customdata.h" +#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "bmesh.h" @@ -589,6 +590,25 @@ static BMFace *bm_mesh_copy_new_face( return f_new; } +void BM_mesh_copy_init_customdata_from_mesh(BMesh *bm_dst, + const Mesh *me_src, + const BMAllocTemplate *allocsize) +{ + if (allocsize == NULL) { + allocsize = &bm_mesh_allocsize_default; + } + + CustomData_copy(&me_src->vdata, &bm_dst->vdata, CD_MASK_BMESH.vmask, CD_CALLOC, 0); + CustomData_copy(&me_src->edata, &bm_dst->edata, CD_MASK_BMESH.emask, CD_CALLOC, 0); + CustomData_copy(&me_src->ldata, &bm_dst->ldata, CD_MASK_BMESH.lmask, CD_CALLOC, 0); + CustomData_copy(&me_src->pdata, &bm_dst->pdata, CD_MASK_BMESH.pmask, CD_CALLOC, 0); + + CustomData_bmesh_init_pool(&bm_dst->vdata, allocsize->totvert, BM_VERT); + CustomData_bmesh_init_pool(&bm_dst->edata, allocsize->totedge, BM_EDGE); + CustomData_bmesh_init_pool(&bm_dst->ldata, allocsize->totloop, BM_LOOP); + CustomData_bmesh_init_pool(&bm_dst->pdata, allocsize->totface, BM_FACE); +} + void BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const BMAllocTemplate *allocsize) { if (allocsize == NULL) { diff --git a/source/blender/bmesh/intern/bmesh_construct.h b/source/blender/bmesh/intern/bmesh_construct.h index f5102283ede..f2b5e2b4daa 100644 --- a/source/blender/bmesh/intern/bmesh_construct.h +++ b/source/blender/bmesh/intern/bmesh_construct.h @@ -23,6 +23,7 @@ #include "bmesh_core.h" struct BMAllocTemplate; +struct Mesh; bool BM_verts_from_edges(BMVert **vert_arr, BMEdge **edge_arr, const int len); @@ -66,6 +67,9 @@ 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); void BM_elem_select_copy(BMesh *bm_dst, void *ele_dst_v, const void *ele_src_v); +void BM_mesh_copy_init_customdata_from_mesh(BMesh *bm_dst, + const struct Mesh *me_src, + const struct BMAllocTemplate *allocsize); void BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const struct BMAllocTemplate *allocsize); diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc index 95167b5c82e..1121e30b0ff 100644 --- a/source/blender/modifiers/intern/MOD_boolean.cc +++ b/source/blender/modifiers/intern/MOD_boolean.cc @@ -248,6 +248,10 @@ static BMesh *BMD_mesh_bm_create( BMeshCreateParams bmcp = {false}; BMesh *bm = BM_mesh_create(&allocsize, &bmcp); + /* Needed so active layers are set based on `mesh` not `mesh_operand_ob`, + * otherwise the wrong active render layer is used, see T92384. */ + BM_mesh_copy_init_customdata_from_mesh(bm, mesh, &allocsize); + BMeshFromMeshParams params{}; params.calc_face_normal = true; BM_mesh_bm_from_me(bm, mesh_operand_ob, ¶ms); |