[Bf-blender-cvs] [4e3b1ef8617] refactor-mesh-sharp-edge-generic: Mesh: Move sharp edges to generic attribute

Hans Goudey noreply at git.blender.org
Tue Jan 3 23:22:36 CET 2023


Commit: 4e3b1ef8617dbac8ea9b2302c1c0e8a332246680
Author: Hans Goudey
Date:   Tue Jan 3 17:22:19 2023 -0500
Branches: refactor-mesh-sharp-edge-generic
https://developer.blender.org/rB4e3b1ef8617dbac8ea9b2302c1c0e8a332246680

Mesh: Move sharp edges to generic attribute

Initial compiling version, many tests don't pass yet.

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/BKE_mesh_legacy_convert.h
M	source/blender/blenkernel/BKE_mesh_mapping.h
M	source/blender/blenkernel/intern/curve_to_mesh_convert.cc
M	source/blender/blenkernel/intern/data_transfer.cc
M	source/blender/blenkernel/intern/key.cc
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_legacy_convert.cc
M	source/blender/blenkernel/intern/mesh_mapping.cc
M	source/blender/blenkernel/intern/mesh_mirror.cc
M	source/blender/blenkernel/intern/mesh_normals.cc
M	source/blender/blenkernel/intern/mesh_remap.cc
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/blenloader/intern/versioning_400.cc
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
M	source/blender/editors/mesh/mesh_data.cc
M	source/blender/editors/sculpt_paint/sculpt_face_set.cc
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
M	source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
M	source/blender/makesdna/DNA_meshdata_types.h
M	source/blender/makesrna/intern/rna_mesh.c
M	source/blender/makesrna/intern/rna_mesh_api.c
M	source/blender/modifiers/intern/MOD_normal_edit.cc
M	source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
M	source/blender/modifiers/intern/MOD_weighted_normal.cc

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 066d302fdd1..998fca10f80 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -476,14 +476,14 @@ void BKE_mesh_ensure_normals_for_display(struct Mesh *mesh);
  * Used when defining an empty custom loop normals data layer,
  * to keep same shading as with auto-smooth!
  */
-void BKE_edges_sharp_from_angle_set(struct MEdge *medges,
-                                    int numEdges,
+void BKE_edges_sharp_from_angle_set(int numEdges,
                                     const struct MLoop *mloops,
                                     int numLoops,
                                     const struct MPoly *mpolys,
                                     const float (*poly_normals)[3],
                                     int numPolys,
-                                    float split_angle);
+                                    float split_angle,
+                                    bool *sharp_edges);
 
 /**
  * References a contiguous loop-fan with normal offset vars.
@@ -596,6 +596,8 @@ void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space,
  * (splitting edges).
  *
  * \param loop_to_poly_map: Optional pre-created map from loops to their polygon.
+ * \param sharp_edges: Optional array of sharp edge tags, used to split the evaluated normals on
+ * each side of the edge.
  */
 void BKE_mesh_normals_loop_split(const struct MVert *mverts,
                                  const float (*vert_normals)[3],
@@ -610,6 +612,7 @@ void BKE_mesh_normals_loop_split(const struct MVert *mverts,
                                  int numPolys,
                                  bool use_split_normals,
                                  float split_angle,
+                                 const bool *sharp_edges,
                                  const int *loop_to_poly_map,
                                  MLoopNorSpaceArray *r_lnors_spacearr,
                                  short (*clnors_data)[2]);
@@ -617,7 +620,7 @@ void BKE_mesh_normals_loop_split(const struct MVert *mverts,
 void BKE_mesh_normals_loop_custom_set(const struct MVert *mverts,
                                       const float (*vert_normals)[3],
                                       int numVerts,
-                                      struct MEdge *medges,
+                                      const struct MEdge *medges,
                                       int numEdges,
                                       const struct MLoop *mloops,
                                       float (*r_custom_loop_normals)[3],
@@ -625,18 +628,20 @@ void BKE_mesh_normals_loop_custom_set(const struct MVert *mverts,
                                       const struct MPoly *mpolys,
                                       const float (*poly_normals)[3],
                                       int numPolys,
+                                      bool *sharp_edges,
                                       short (*r_clnors_data)[2]);
 void BKE_mesh_normals_loop_custom_from_verts_set(const struct MVert *mverts,
                                                  const float (*vert_normals)[3],
                                                  float (*r_custom_vert_normals)[3],
                                                  int numVerts,
-                                                 struct MEdge *medges,
+                                                 const struct MEdge *medges,
                                                  int numEdges,
                                                  const struct MLoop *mloops,
                                                  int numLoops,
                                                  const struct MPoly *mpolys,
                                                  const float (*poly_normals)[3],
                                                  int numPolys,
+                                                 bool *sharp_edges,
                                                  short (*r_clnors_data)[2]);
 
 /**
diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 65804e9ac24..3fa45959d2c 100644
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@ -88,6 +88,9 @@ void BKE_mesh_legacy_convert_loose_edges_to_flag(struct Mesh *mesh);
 void BKE_mesh_legacy_attribute_flags_to_strings(struct Mesh *mesh);
 void BKE_mesh_legacy_attribute_strings_to_flags(struct Mesh *mesh);
 
+void BKE_mesh_sharp_edges_to_flags(struct Mesh *mesh);
+void BKE_mesh_sharp_edges_from_flags(struct Mesh *mesh);
+
 #endif
 
 /**
diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h
index b49d61ac0a8..6586eb395b7 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -325,6 +325,7 @@ int *BKE_mesh_calc_smoothgroups(const struct MEdge *medge,
                                 int totpoly,
                                 const struct MLoop *mloop,
                                 int totloop,
+                                const bool *sharp_edges,
                                 int *r_totgroup,
                                 bool use_bitflags);
 
diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
index e5cafd405df..2d804da96d8 100644
--- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
+++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
@@ -18,13 +18,6 @@
 
 namespace blender::bke {
 
-static void mark_edges_sharp(MutableSpan<MEdge> edges)
-{
-  for (MEdge &edge : edges) {
-    edge.flag |= ME_SHARP;
-  }
-}
-
 static void fill_mesh_topology(const int vert_offset,
                                const int edge_offset,
                                const int poly_offset,
@@ -156,9 +149,6 @@ static void fill_mesh_topology(const int vert_offset,
       loop_end.v = last_ring_vert_offset + i;
       loop_end.e = last_ring_edge_offset + i;
     }
-
-    mark_edges_sharp(edges.slice(profile_edges_start, profile_segment_num));
-    mark_edges_sharp(edges.slice(last_ring_edge_offset, profile_segment_num));
   }
 }
 
@@ -167,17 +157,17 @@ static void mark_bezier_vector_edges_sharp(const int profile_point_num,
                                            const Span<int> control_point_offsets,
                                            const Span<int8_t> handle_types_left,
                                            const Span<int8_t> handle_types_right,
-                                           MutableSpan<MEdge> edges)
+                                           MutableSpan<bool> sharp_edges)
 {
   const int main_edges_start = 0;
   if (curves::bezier::point_is_sharp(handle_types_left, handle_types_right, 0)) {
-    mark_edges_sharp(edges.slice(main_edges_start, main_segment_num));
+    sharp_edges.slice(main_edges_start, main_segment_num).fill(true);
   }
 
   for (const int i : IndexRange(profile_point_num).drop_front(1)) {
     if (curves::bezier::point_is_sharp(handle_types_left, handle_types_right, i)) {
-      mark_edges_sharp(edges.slice(
-          main_edges_start + main_segment_num * control_point_offsets[i - 1], main_segment_num));
+      const int offset = main_edges_start + main_segment_num * control_point_offsets[i - 1];
+      sharp_edges.slice(offset, main_segment_num).fill(true);
     }
   }
 }
@@ -627,6 +617,35 @@ static void copy_curve_domain_attribute_to_mesh(const ResultOffsets &mesh_offset
   });
 }
 
+static void write_sharp_bezier_edges(const CurvesInfo &curves_info,
+                                     const ResultOffsets &offsets,
+                                     MutableSpan<bool> sharp_edges)
+{
+  const CurvesGeometry &profile = curves_info.profile;
+  if (!profile.has_curve_with_type(CURVE_TYPE_BEZIER)) {
+    return;
+  }
+  const VArraySpan<int8_t> handle_types_left{profile.handle_types_left()};
+  const VArraySpan<int8_t> handle_types_right{profile.handle_types_right()};
+  if (!handle_types_left.contains(BEZIER_HANDLE_VECTOR) ||
+      handle_types_right.contains(BEZIER_HANDLE_VECTOR)) {
+    return;
+  }
+  const VArray<int8_t> curve_types = profile.curve_types();
+
+  foreach_curve_combination(curves_info, offsets, [&](const CombinationInfo &info) {
+    if (curve_types[info.i_profile] == CURVE_TYPE_BEZIER) {
+      const IndexRange points = profile.points_for_curve(info.i_profile);
+      mark_bezier_vector_edges_sharp(points.size(),
+                                     info.main_segment_num,
+                                     profile.bezier_evaluated_offsets_for_curve(info.i_profile),
+                                     handle_types_left.slice(points),
+                                     handle_types_right.slice(points),
+                                     sharp_edges.slice(info.edge_range));
+    }
+  });
+}
+
 Mesh *curve_to_mesh_sweep(const CurvesGeometry &main,
                           const CurvesGeometry &profile,
                           const bool fill_caps)
@@ -693,24 +712,6 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main,
                         verts.slice(info.vert_range));
   });
 
-  if (profile.curve_type_counts()[CURVE_TYPE_BEZIER] > 0) {
-    const VArray<int8_t> curve_types = profile.curve_types();
-    const VArraySpan<int8_t> handle_types_left{profile.handle_types_left()};
-    const VArraySpan<int8_t> handle_types_right{profile.handle_types_right()};
-
-    foreach_curve_combination(curves_info, offsets, [&](const CombinationInfo &info) {
-      if (curve_types[info.i_profile] == CURVE_TYPE_BEZIER) {
-        const IndexRange points = profile.points_for_curve(info.i_profile);
-        mark_bezier_vector_edges_sharp(points.size(),
-                                       info.main_segment_num,
-                                       profile.bezier_evaluated_offsets_for_curve(info.i_profile),
-                                       handle_types_left.slice(points),
-                                       handle_types_right.slice(point

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list