[Bf-blender-cvs] [2e87364e3c2] refactor-mesh-sharp-edge-generic: Fix sharp tagging in Curve to Mesh conversion

Hans Goudey noreply at git.blender.org
Thu Jan 5 04:18:25 CET 2023


Commit: 2e87364e3c255cc134289b8af8764e0b64eee09a
Author: Hans Goudey
Date:   Wed Jan 4 22:18:18 2023 -0500
Branches: refactor-mesh-sharp-edge-generic
https://developer.blender.org/rB2e87364e3c255cc134289b8af8764e0b64eee09a

Fix sharp tagging in Curve to Mesh conversion

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

M	source/blender/blenkernel/intern/curve_to_mesh_convert.cc

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

diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
index 15b6af2ba39..9a14ab26ce2 100644
--- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
+++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
@@ -619,7 +619,8 @@ 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)
+                                     MutableAttributeAccessor mesh_attributes,
+                                     SpanAttributeWriter<bool> &sharp_edges)
 {
   const CurvesGeometry &profile = curves_info.profile;
   if (!profile.has_curve_with_type(CURVE_TYPE_BEZIER)) {
@@ -627,10 +628,14 @@ static void write_sharp_bezier_edges(const CurvesInfo &curves_info,
   }
   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)) {
+  if (!handle_types_left.contains(BEZIER_HANDLE_VECTOR) &&
+      !handle_types_right.contains(BEZIER_HANDLE_VECTOR)) {
     return;
   }
+
+  sharp_edges = mesh_attributes.lookup_or_add_for_write_span<bool>(".sharp_edge",
+                                                                   ATTR_DOMAIN_EDGE);
+
   const VArray<int8_t> types = profile.curve_types();
   foreach_curve_combination(curves_info, offsets, [&](const CombinationInfo &info) {
     if (types[info.i_profile] == CURVE_TYPE_BEZIER) {
@@ -640,7 +645,7 @@ static void write_sharp_bezier_edges(const CurvesInfo &curves_info,
                                      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));
+                                     sharp_edges.span.slice(info.edge_range));
     }
   });
 }
@@ -784,11 +789,17 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main,
     return true;
   });
 
-  SpanAttributeWriter<bool> sharp_edges = mesh_attributes.lookup_or_add_for_write_span<bool>(
-      ".sharp_edge", ATTR_DOMAIN_EDGE);
-  write_sharp_bezier_edges(curves_info, offsets, sharp_edges.span);
+  SpanAttributeWriter<bool> sharp_edges;
+  write_sharp_bezier_edges(curves_info, offsets, mesh_attributes, sharp_edges);
   if (fill_caps) {
+    if (!sharp_edges) {
+      sharp_edges = mesh_attributes.lookup_or_add_for_write_span<bool>(".sharp_edge",
+                                                                       ATTR_DOMAIN_EDGE);
+    }
     foreach_curve_combination(curves_info, offsets, [&](const CombinationInfo &info) {
+      if (info.main_cyclic || !info.profile_cyclic) {
+        return;
+      }
       const int main_edges_start = info.edge_range.start();
       const int last_ring_index = info.main_points.size() - 1;
       const int profile_edges_start = main_edges_start +



More information about the Bf-blender-cvs mailing list