[Bf-blender-cvs] [62734ea67cd] refactor-mesh-uv-map-generic: When syncing BMesh to mesh, skip all-empty bool layers by marking them as NOCOPY.
Martijn Versteegh
noreply at git.blender.org
Tue Dec 6 12:56:38 CET 2022
Commit: 62734ea67cd4da6f03aeab179dc4ece951e2cf82
Author: Martijn Versteegh
Date: Tue Dec 6 11:32:26 2022 +0100
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB62734ea67cd4da6f03aeab179dc4ece951e2cf82
When syncing BMesh to mesh, skip all-empty bool layers by marking them as NOCOPY.
===================================================================
M source/blender/bmesh/intern/bmesh_mesh_convert.cc
===================================================================
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index 854445572ea..d7a2dc1c16d 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -984,6 +984,53 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
me->totface = 0;
me->act_face = -1;
+ /* Mark uv selection layers which are all false as 'nocopy'
+ */
+
+
+ for (const int l : IndexRange(CustomData_number_of_layers(&bm->ldata, CD_PROP_FLOAT2))) {
+ char const *layer_name = CustomData_get_layer_name(&bm->ldata, CD_PROP_FLOAT2, l);
+ char sub_layer_name[MAX_CUSTOMDATA_LAYER_NAME];
+ int vertsel_layer_index = CustomData_get_named_layer_index(&bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_vert_selection_name(layer_name, sub_layer_name));
+ int edgesel_layer_index = CustomData_get_named_layer_index(&bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_edge_selection_name(layer_name, sub_layer_name));
+ int pin_layer_index = CustomData_get_named_layer_index(&bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_pin_name(layer_name, sub_layer_name));
+ int vertsel_offset = bm->ldata.layers[vertsel_layer_index].offset;
+ int edgesel_offset = bm->ldata.layers[edgesel_layer_index].offset;
+ int pin_offset = bm->ldata.layers[pin_layer_index].offset;
+ bool need_vertsel = false;
+ bool need_edgesel = false;
+ bool need_pin = false;
+
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BMIter liter;
+ BMLoop *l;
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ need_vertsel |= BM_ELEM_CD_GET_BOOL(l, vertsel_offset);
+ need_edgesel |= BM_ELEM_CD_GET_BOOL(l, edgesel_offset);
+ need_pin |= BM_ELEM_CD_GET_BOOL(l, pin_offset);
+ }
+ }
+
+ if (need_vertsel) {
+ bm->ldata.layers[vertsel_layer_index].flag &= ~CD_FLAG_NOCOPY;
+ } else {
+ bm->ldata.layers[vertsel_layer_index].flag |= CD_FLAG_NOCOPY;
+ }
+ if (need_edgesel) {
+ bm->ldata.layers[edgesel_layer_index].flag &= ~CD_FLAG_NOCOPY;
+ } else {
+ bm->ldata.layers[edgesel_layer_index].flag |= CD_FLAG_NOCOPY;
+ }
+ if (need_pin) {
+ bm->ldata.layers[pin_layer_index].flag &= ~CD_FLAG_NOCOPY;
+ } else {
+ bm->ldata.layers[pin_layer_index].flag |= CD_FLAG_NOCOPY;
+ }
+
+
+ }
+
+
{
CustomData_MeshMasks mask = CD_MASK_MESH;
CustomData_MeshMasks_update(&mask, ¶ms->cd_mask_extra);
More information about the Bf-blender-cvs
mailing list