[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