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



More information about the Bf-blender-cvs mailing list