1
1

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.
This commit is contained in:
2021-11-09 16:58:45 +11:00
parent b3597f310d
commit 2eb94f3036
3 changed files with 28 additions and 0 deletions

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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, &params);