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:
parent
bf8909eb5d
commit
215a6f1c10
Notes:
blender-bot
2023-02-14 06:17:14 +01:00
Referenced by issue #88449: Blender LTS: Maintenance Task 2.93 Referenced by issue #88449, Blender LTS: Maintenance Task 2.93 Referenced by issue #92384, UV Maps are broken with Boolean Modifier (Fast Solver)
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue