[Bf-blender-cvs] [03b57d39731] blender-v3.1-release: Fix T94476: Threading/performance issue with curve to points node

Hans Goudey noreply at git.blender.org
Sat Jan 29 00:47:23 CET 2022


Commit: 03b57d39731a3902ac99d2e8e23aa309ac21c131
Author: Hans Goudey
Date:   Fri Jan 28 17:47:14 2022 -0600
Branches: blender-v3.1-release
https://developer.blender.org/rB03b57d39731a3902ac99d2e8e23aa309ac21c131

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.

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc
index 19efd4b7508..c0c1244f031 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc
@@ -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);
         }
       }
     }



More information about the Bf-blender-cvs mailing list