[Bf-blender-cvs] [0efb79fb749] master: Geometry Nodes: Multithread transforming instances and point clouds

Hans Goudey noreply at git.blender.org
Mon Jan 2 17:16:54 CET 2023


Commit: 0efb79fb749ec1967a46b9fcec755aad9ee2d403
Author: Hans Goudey
Date:   Mon Jan 2 11:16:37 2023 -0500
Branches: master
https://developer.blender.org/rB0efb79fb749ec1967a46b9fcec755aad9ee2d403

Geometry Nodes: Multithread transforming instances and point clouds

Add multithreading when transforming and translating instances
and point clouds in the Transform Geometry node.

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc
index 0f2c9a02be4..aa674e760c9 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc
@@ -34,6 +34,24 @@ static bool use_translate(const float3 rotation, const float3 scale)
   return true;
 }
 
+static void translate_positions(MutableSpan<float3> positions, const float3 &translation)
+{
+  threading::parallel_for(positions.index_range(), 2048, [&](const IndexRange range) {
+    for (float3 &position : positions.slice(range)) {
+      position += translation;
+    }
+  });
+}
+
+static void transform_positions(MutableSpan<float3> positions, const float4x4 &matrix)
+{
+  threading::parallel_for(positions.index_range(), 1024, [&](const IndexRange range) {
+    for (float3 &position : positions.slice(range)) {
+      position = matrix * position;
+    }
+  });
+}
+
 static void translate_mesh(Mesh &mesh, const float3 translation)
 {
   if (!math::is_zero(translation)) {
@@ -51,9 +69,7 @@ static void translate_pointcloud(PointCloud &pointcloud, const float3 translatio
   MutableAttributeAccessor attributes = pointcloud.attributes_for_write();
   SpanAttributeWriter position = attributes.lookup_or_add_for_write_span<float3>(
       "position", ATTR_DOMAIN_POINT);
-  for (const int i : position.span.index_range()) {
-    position.span[i] += translation;
-  }
+  translate_positions(position.span, translation);
   position.finish();
 }
 
@@ -62,26 +78,28 @@ static void transform_pointcloud(PointCloud &pointcloud, const float4x4 &transfo
   MutableAttributeAccessor attributes = pointcloud.attributes_for_write();
   SpanAttributeWriter position = attributes.lookup_or_add_for_write_span<float3>(
       "position", ATTR_DOMAIN_POINT);
-  for (const int i : position.span.index_range()) {
-    position.span[i] = transform * position.span[i];
-  }
+  transform_positions(position.span, transform);
   position.finish();
 }
 
 static void translate_instances(bke::Instances &instances, const float3 translation)
 {
   MutableSpan<float4x4> transforms = instances.transforms();
-  for (float4x4 &transform : transforms) {
-    add_v3_v3(transform.ptr()[3], translation);
-  }
+  threading::parallel_for(transforms.index_range(), 1024, [&](const IndexRange range) {
+    for (float4x4 &instance_transform : transforms.slice(range)) {
+      add_v3_v3(instance_transform.ptr()[3], translation);
+    }
+  });
 }
 
 static void transform_instances(bke::Instances &instances, const float4x4 &transform)
 {
   MutableSpan<float4x4> transforms = instances.transforms();
-  for (float4x4 &instance_transform : transforms) {
-    instance_transform = transform * instance_transform;
-  }
+  threading::parallel_for(transforms.index_range(), 1024, [&](const IndexRange range) {
+    for (float4x4 &instance_transform : transforms.slice(range)) {
+      instance_transform = transform * instance_transform;
+    }
+  });
 }
 
 static void transform_volume(GeoNodeExecParams &params,



More information about the Bf-blender-cvs mailing list