[Bf-blender-cvs] [c998d56b1e5] refactor-mesh-sharp-edge-generic: Add missing sharp edge handling when converting to and from BMesh

Hans Goudey noreply at git.blender.org
Wed Jan 4 04:34:35 CET 2023


Commit: c998d56b1e5c50cd7266dfb062efc00866f0829c
Author: Hans Goudey
Date:   Tue Jan 3 22:34:26 2023 -0500
Branches: refactor-mesh-sharp-edge-generic
https://developer.blender.org/rBc998d56b1e5c50cd7266dfb062efc00866f0829c

Add missing sharp edge handling when converting to and from BMesh

===================================================================

M	source/blender/blenkernel/intern/customdata.cc
M	source/blender/bmesh/intern/bmesh_mesh_convert.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index cb22f4a650c..b1007b33891 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -2378,7 +2378,8 @@ static bool attribute_stored_in_bmesh_flag(const StringRef name)
               ".select_vert",
               ".select_edge",
               ".select_poly",
-              "material_index");
+              "material_index",
+              ".sharp_edge");
 }
 
 CustomData CustomData_shallow_copy_remove_non_bmesh_attributes(const CustomData *src,
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index 0ee1d546ddc..09ef3303bee 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -302,6 +302,8 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
       &me->pdata, CD_PROP_BOOL, ".hide_poly");
   const int *material_indices = (const int *)CustomData_get_layer_named(
       &me->pdata, CD_PROP_INT32, "material_index");
+  const bool *sharp_edges = (const bool *)CustomData_get_layer_named(
+      &me->edata, CD_PROP_BOOL, ".sharp_edge");
 
   Span<MVert> mvert = me->verts();
   Array<BMVert *> vtable(me->totvert);
@@ -356,6 +358,9 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
     if (select_edge && select_edge[i]) {
       BM_edge_select_set(bm, e, true);
     }
+    if (!sharp_edges || !sharp_edges[i]) {
+      BM_elem_flag_enable(e, BM_ELEM_SMOOTH);
+    }
 
     /* Copy Custom Data */
     CustomData_to_bmesh_block(&mesh_edata, &bm->edata, i, &e->head.data, true);
@@ -978,6 +983,7 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
   bool need_hide_edge = false;
   bool need_hide_poly = false;
   bool need_material_index = false;
+  bool need_sharp_edge = false;
 
   i = 0;
   BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
@@ -1013,6 +1019,9 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
     if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
       need_select_edge = true;
     }
+    if (!BM_elem_flag_test(e, BM_ELEM_SMOOTH)) {
+      need_sharp_edge = true;
+    }
 
     BM_elem_index_set(e, i); /* set_inline */
 
@@ -1073,6 +1082,13 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
                                ATTR_DOMAIN_FACE,
                                [&](const int i) { return int(BM_face_at_index(bm, i)->mat_nr); });
   }
+  if (need_sharp_edge) {
+    BM_mesh_elem_table_ensure(bm, BM_EDGE);
+    write_fn_to_attribute<bool>(
+        me->attributes_for_write(), ".sharp_edge", ATTR_DOMAIN_EDGE, [&](const int i) {
+          return !BM_elem_flag_test(BM_edge_at_index(bm, i), BM_ELEM_SELECT);
+        });
+  }
 
   /* Patch hook indices and vertex parents. */
   if (params->calc_object_remap && (ototvert > 0)) {
@@ -1266,6 +1282,7 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *
 
   bke::SpanAttributeWriter<bool> hide_edge_attribute;
   bke::SpanAttributeWriter<bool> select_edge_attribute;
+  bke::SpanAttributeWriter<bool> sharp_edge_attribute;
   BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
     MEdge *med = &medge[i];
 
@@ -1289,6 +1306,13 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *
       }
       select_edge_attribute.span[i] = true;
     }
+    if (!BM_elem_flag_test(eve, BM_ELEM_SMOOTH)) {
+      if (!sharp_edge_attribute) {
+        sharp_edge_attribute = mesh_attributes.lookup_or_add_for_write_span<bool>(
+            ".sharp_edge", ATTR_DOMAIN_EDGE);
+      }
+      sharp_edge_attribute.span[i] = true;
+    }
 
     CustomData_from_bmesh_block(&bm->edata, &me->edata, eed->head.data, i);
   }
@@ -1356,4 +1380,5 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks *
   select_vert_attribute.finish();
   select_edge_attribute.finish();
   select_poly_attribute.finish();
+  sharp_edge_attribute.finish();
 }



More information about the Bf-blender-cvs mailing list