From 616594fcb1f6ffcc256f87a6833767e1855faf6e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 5 Nov 2021 09:52:25 -0500 Subject: [PATCH] Fix T92850: Curve to mesh incorrect for single point profiles For single point splines that weren't at the origin, the results were incorrect. Now take into account the tilt, radius, etc. just like the general case. --- .../intern/curve_to_mesh_convert.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc index ed4af2bbb08..1ef205c6903 100644 --- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc +++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc @@ -58,9 +58,8 @@ static void vert_extrude_to_mesh_data(const Spline &spline, const int vert_offset, const int edge_offset) { - Span positions = spline.evaluated_positions(); - - for (const int i : IndexRange(positions.size() - 1)) { + const int eval_size = spline.evaluated_points_size(); + for (const int i : IndexRange(eval_size - 1)) { MEdge &edge = r_edges[edge_offset + i]; edge.v1 = vert_offset + i; edge.v2 = vert_offset + i + 1; @@ -70,13 +69,21 @@ static void vert_extrude_to_mesh_data(const Spline &spline, if (spline.is_cyclic() && spline.evaluated_edges_size() > 1) { MEdge &edge = r_edges[edge_offset + spline.evaluated_edges_size() - 1]; edge.v1 = vert_offset; - edge.v2 = vert_offset + positions.size() - 1; + edge.v2 = vert_offset + eval_size - 1; edge.flag = ME_LOOSEEDGE; } - for (const int i : positions.index_range()) { + Span positions = spline.evaluated_positions(); + Span tangents = spline.evaluated_tangents(); + Span normals = spline.evaluated_normals(); + GVArray_Typed radii = spline.interpolate_to_evaluated(spline.radii()); + for (const int i : IndexRange(eval_size)) { + float4x4 point_matrix = float4x4::from_normalized_axis_data( + positions[i], normals[i], tangents[i]); + point_matrix.apply_scale(radii[i]); + MVert &vert = r_verts[vert_offset + i]; - copy_v3_v3(vert.co, positions[i] + profile_vert); + copy_v3_v3(vert.co, point_matrix * profile_vert); } }