[Bf-blender-cvs] [01f509232bb] refactor-mesh-sharp-edge-generic: Merge branch 'master' into refactor-mesh-sharp-edge-generic
Hans Goudey
noreply at git.blender.org
Tue Jan 10 19:12:18 CET 2023
Commit: 01f509232bbc6fff39f0c1de45b79b9efa3fab47
Author: Hans Goudey
Date: Tue Jan 10 13:05:56 2023 -0500
Branches: refactor-mesh-sharp-edge-generic
https://developer.blender.org/rB01f509232bbc6fff39f0c1de45b79b9efa3fab47
Merge branch 'master' into refactor-mesh-sharp-edge-generic
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_mesh.h
index 998fca10f80,ffca4cff347..1cf86e87493
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@@ -596,10 -592,8 +592,10 @@@ void BKE_lnor_space_custom_normal_to_da
* (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,
+ void BKE_mesh_normals_loop_split(const float (*vert_positions)[3],
const float (*vert_normals)[3],
int numVerts,
const struct MEdge *medges,
@@@ -617,10 -610,10 +613,10 @@@
MLoopNorSpaceArray *r_lnors_spacearr,
short (*clnors_data)[2]);
- void BKE_mesh_normals_loop_custom_set(const struct MVert *mverts,
+ void BKE_mesh_normals_loop_custom_set(const float (*vert_positions)[3],
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],
@@@ -628,9 -621,8 +624,9 @@@
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,
+ void BKE_mesh_normals_loop_custom_from_verts_set(const float (*vert_positions)[3],
const float (*vert_normals)[3],
float (*r_custom_vert_normals)[3],
int numVerts,
diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 3fa45959d2c,3b1b94e516a..3a755599da0
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -88,9 -95,13 +95,16 @@@ void BKE_mesh_legacy_convert_loose_edge
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);
+
+ struct MVert *BKE_mesh_legacy_convert_positions_to_verts(
+ Mesh *mesh,
+ blender::ResourceScope &temp_arrays_for_convert,
+ blender::Vector<CustomDataLayer, 16> &vert_layers_to_write);
+
+ void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh);
+
#endif
/**
diff --cc source/blender/blenkernel/intern/curve_to_mesh_convert.cc
index 12da300598b,305a245a036..2a97e98a9fb
--- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
+++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
@@@ -713,34 -688,26 +710,34 @@@ Mesh *curve_to_mesh_sweep(const CurvesG
tangents.slice(info.main_points),
normals.slice(info.main_points),
radii.is_empty() ? radii : radii.slice(info.main_points),
- verts.slice(info.vert_range));
+ positions.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()};
+ MutableAttributeAccessor mesh_attributes = mesh->attributes_for_write();
+ 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 (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),
- edges.slice(info.edge_range));
+ 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 +
+ info.profile_points.size() * info.main_segment_num;
+ const int last_ring_edge_offset = profile_edges_start +
+ info.profile_segment_num * last_ring_index;
+
+ sharp_edges.span.slice(profile_edges_start, info.profile_segment_num).fill(true);
+ sharp_edges.span.slice(last_ring_edge_offset, info.profile_segment_num).fill(true);
});
}
+ sharp_edges.finish();
Set<AttributeIDRef> main_attributes_set;
diff --cc source/blender/blenkernel/intern/data_transfer.cc
index 7e56cd966f5,39837051c0a..430527e43d3
--- a/source/blender/blenkernel/intern/data_transfer.cc
+++ b/source/blender/blenkernel/intern/data_transfer.cc
@@@ -345,12 -341,8 +345,12 @@@ static void data_transfer_dtdata_type_p
ldata_dst, CD_CUSTOMLOOPNORMAL, CD_SET_DEFAULT, nullptr, num_loops_dst));
}
+ bke::MutableAttributeAccessor attributes = me_dst->attributes_for_write();
+ bke::SpanAttributeWriter<bool> sharp_edges = attributes.lookup_or_add_for_write_span<bool>(
+ "sharp_edge", ATTR_DOMAIN_EDGE);
+
/* Note loop_nors_dst contains our custom normals as transferred from source... */
- BKE_mesh_normals_loop_custom_set(verts_dst,
+ BKE_mesh_normals_loop_custom_set(positions_dst,
BKE_mesh_vertex_normals_ensure(me_dst),
num_verts_dst,
edges_dst,
diff --cc source/blender/blenkernel/intern/geometry_component_mesh.cc
index 13f6c2f41d5,c91dc249249..7b694be324a
--- a/source/blender/blenkernel/intern/geometry_component_mesh.cc
+++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc
@@@ -1337,9 -1296,8 +1308,8 @@@ static ComponentAttributeProviders crea
static CustomDataAttributeProvider face_custom_data(ATTR_DOMAIN_FACE, face_access);
return ComponentAttributeProviders(
- {&position, &id, &material_index, &shade_smooth, &normal, &crease},
+ {&position, &id, &material_index, &shade_smooth, &sharp_edge, &normal, &crease},
- {&uvs,
- &corner_custom_data,
+ {&corner_custom_data,
&vertex_groups,
&point_custom_data,
&edge_custom_data,
diff --cc source/blender/blenkernel/intern/mesh_normals.cc
index 5c4d2a94c99,266ef0efa0b..cb5aeac364b
--- a/source/blender/blenkernel/intern/mesh_normals.cc
+++ b/source/blender/blenkernel/intern/mesh_normals.cc
@@@ -1652,10 -1609,10 +1603,10 @@@ void BKE_mesh_normals_loop_split(const
* r_custom_loop_normals is expected to have normalized normals, or zero ones,
* in which case they will be replaced by default loop/vertex normal.
*/
- static void mesh_normals_loop_custom_set(const MVert *mverts,
+ static void mesh_normals_loop_custom_set(const float (*positions)[3],
const float (*vert_normals)[3],
const int numVerts,
- MEdge *medges,
+ const MEdge *medges,
const int numEdges,
const MLoop *mloops,
float (*r_custom_loop_normals)[3],
@@@ -1895,10 -1849,10 +1846,10 @@@
BKE_lnor_spacearr_free(&lnors_spacearr);
}
- void BKE_mesh_normals_loop_custom_set(const MVert *mverts,
+ void BKE_mesh_normals_loop_custom_set(const float (*vert_positions)[3],
const float (*vert_normals)[3],
const int numVerts,
- MEdge *medges,
+ const MEdge *medges,
const int numEdges,
const MLoop *mloops,
float (*r_custom_loop_normals)[3],
@@@ -1906,10 -1860,9 +1857,10 @@@
const MPoly *mpolys,
const float (*poly_normals)[3],
const int numPolys,
+ bool *sharp_edges,
short (*r_clnors_data)[2])
{
- mesh_normals_loop_custom_set(mverts,
+ mesh_normals_loop_custom_set(vert_positions,
vert_normals,
numVerts,
medges,
@@@ -1936,10 -1888,9 +1887,10 @@@ void BKE_mesh_normals_loop_custom_from_
const MPoly *mpolys,
const float (
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list