Fix T94476: Threading/performance issue with curve to points node

For every spline, *all* of the normals and tangents in the output
were normalized. The node is multithreaded, so sometimes a thread
overwrote the normalized result from another thread.

Fixing this problem also made the node orders of magnitude
faster when there are many splines.
This commit is contained in:
Hans Goudey 2022-01-28 17:47:14 -06:00
parent afdc35b636
commit 03b57d3973
Notes: blender-bot 2023-02-13 16:39:01 +01:00
Referenced by issue #95489, Write to Vertex Groups from Geometry Nodes is not working anymore
Referenced by issue #94963, The viewport may update at 0 FPS while navigating, until the mouse is released.
Referenced by issue #94476, Geometry Nodes: Nested realized instances have broken rotation.
1 changed files with 10 additions and 8 deletions

View File

@ -282,18 +282,20 @@ static void copy_uniform_sample_point_attributes(const Span<SplinePtr> splines,
}
if (!data.tangents.is_empty()) {
spline.sample_with_index_factors<float3>(
spline.evaluated_tangents(), uniform_samples, data.tangents.slice(offset, size));
for (float3 &tangent : data.tangents) {
tangent = math::normalize(tangent);
Span<float3> src_tangents = spline.evaluated_tangents();
MutableSpan<float3> sampled_tangents = data.tangents.slice(offset, size);
spline.sample_with_index_factors<float3>(src_tangents, uniform_samples, sampled_tangents);
for (float3 &vector : sampled_tangents) {
vector = math::normalize(vector);
}
}
if (!data.normals.is_empty()) {
spline.sample_with_index_factors<float3>(
spline.evaluated_normals(), uniform_samples, data.normals.slice(offset, size));
for (float3 &normals : data.normals) {
normals = math::normalize(normals);
Span<float3> src_normals = spline.evaluated_normals();
MutableSpan<float3> sampled_normals = data.normals.slice(offset, size);
spline.sample_with_index_factors<float3>(src_normals, uniform_samples, sampled_normals);
for (float3 &vector : sampled_normals) {
vector = math::normalize(vector);
}
}
}