[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