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
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-01-18 13:44:08 +0300
committerCampbell Barton <campbell@blender.org>2022-01-19 06:30:10 +0300
commit71879d665d69bd1e96dab0dc089785a43d1d42fd (patch)
treed136a9ea5154d00744a36e5163073c711c7958c8 /source/blender/modifiers
parentee6507f2b1d776099e199a31a3af0f09d2fbba74 (diff)
BMesh: improve handling of custom-data flag (Mesh.cd_flag)
Code that handled merging & initializing custom-data from other meshes sometimes missed checks for this flag, causing bevel weights to lost when the mesh was converted to a BMesh. The following changes are a more general fix for T94197. - Add BM_mesh_copy_init_customdata_from_mesh_array which initializes custom-data from multiple meshes at once. As well as initializing custom-data layers from Mesh.cd_flag. This isn't essential for boolean, however it avoids the overhead of resizing custom-data layers. - Loading mesh data into a BMesh now respects Mesh.cd_flag instead of only checking if the BMesh custom-data-layer exists. Without this, the order of meshes passed to BM_mesh_bm_from_me could give different (incorrect) results. - Copying mesh data now copies `cd_flag` too. This is a precaution as in my tests evaluating modifiers these values always matched. Nevertheless it's correct to copy this value as custom-data it's self is being copied.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.cc15
1 files changed, 8 insertions, 7 deletions
diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc
index 2a303c7741c..bb05ae3e1b3 100644
--- a/source/blender/modifiers/intern/MOD_boolean.cc
+++ b/source/blender/modifiers/intern/MOD_boolean.cc
@@ -248,13 +248,14 @@ static BMesh *BMD_mesh_bm_create(
BMeshCreateParams bmesh_create_params{};
BMesh *bm = BM_mesh_create(&allocsize, &bmesh_create_params);
- /* 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);
-
- /* NOTE(@campbellbarton): Handle in #BM_mesh_bm_from_me, this is a local fix for T94197. */
- BM_mesh_cd_flag_apply(bm,
- mesh->cd_flag | mesh_operand_ob->cd_flag | BM_mesh_cd_flag_from_bmesh(bm));
+ /* Keep `mesh` first, needed so active layers are set based on `mesh` not `mesh_operand_ob`,
+ * otherwise the wrong active render layer is used, see T92384.
+ *
+ * NOTE: while initializing customer data layers the is not essential,
+ * it avoids the overhead of having to re-allocate #BMHeader.data when the 2nd mesh is added
+ * (if it contains additional custom-data layers). */
+ const Mesh *mesh_array[2] = {mesh, mesh_operand_ob};
+ BM_mesh_copy_init_customdata_from_mesh_array(bm, mesh_array, ARRAY_SIZE(mesh_array), &allocsize);
BMeshFromMeshParams bmesh_from_mesh_params{};
bmesh_from_mesh_params.calc_face_normal = true;