Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-11-09 08:58:45 +0300
committerPhilipp Oeser <info@graphics-engineer.com>2021-11-23 10:48:59 +0300
commit215a6f1c10ce0b52e84153547fcc4d4073c16524 (patch)
tree803dc60eb7dfa9bd2e0e76c8b1bf4553633adbe5 /source
parentbf8909eb5d27b5670b50a3715fe6348dcea449a5 (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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/bmesh/intern/bmesh_construct.c20
-rw-r--r--source/blender/bmesh/intern/bmesh_construct.h4
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.cc4
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 3eab252df7a..fc5ee0d86f7 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 846be9bc1df..2677ffe2477 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, &params);