Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-11-05 17:52:25 +0300
committerHans Goudey <h.goudey@me.com>2021-11-05 17:52:25 +0300
commit616594fcb1f6ffcc256f87a6833767e1855faf6e (patch)
tree68b32f32e9ed58adf91f2ef994a993e841add112 /source/blender/blenkernel/intern/curve_to_mesh_convert.cc
parente65230f0c03c60f4e7b6561dcec8928992861a59 (diff)
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.
Diffstat (limited to 'source/blender/blenkernel/intern/curve_to_mesh_convert.cc')
-rw-r--r--source/blender/blenkernel/intern/curve_to_mesh_convert.cc19
1 files 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<float3> 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<float3> positions = spline.evaluated_positions();
+ Span<float3> tangents = spline.evaluated_tangents();
+ Span<float3> normals = spline.evaluated_normals();
+ GVArray_Typed<float> 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);
}
}