[Bf-blender-cvs] [a34caff0b92] temp-geometry-nodes-extrude-mesh: Implement attribute interpolation for vertex mode new edges

Hans Goudey noreply at git.blender.org
Tue Jan 4 21:21:46 CET 2022


Commit: a34caff0b927cededb5fe26216aec3d64d97be3f
Author: Hans Goudey
Date:   Tue Jan 4 14:21:35 2022 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rBa34caff0b927cededb5fe26216aec3d64d97be3f

Implement attribute interpolation for vertex mode new edges

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 1346ca92a31..694ce075ffc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -128,6 +128,16 @@ static void expand_mesh_size(Mesh &mesh,
   }
 }
 
+static Array<Vector<int>> create_vert_to_edge_map(const int vert_size, Span<MEdge> edges)
+{
+  Array<Vector<int>> vert_to_edge_map(vert_size);
+  for (const int i : edges.index_range()) {
+    vert_to_edge_map[edges[i].v1].append(i);
+    vert_to_edge_map[edges[i].v2].append(i);
+  }
+  return vert_to_edge_map;
+}
+
 static void extrude_mesh_vertices(MeshComponent &component,
                                   const Field<bool> &selection_field,
                                   const Field<float3> &offset_field,
@@ -160,6 +170,9 @@ static void extrude_mesh_vertices(MeshComponent &component,
     edge.flag = ME_LOOSEEDGE;
   }
 
+  Array<Vector<int>> vert_to_edge_map = create_vert_to_edge_map(
+      orig_vert_size, bke::mesh_edges(mesh).take_front(orig_edge_size));
+
   component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
     if (!ELEM(meta_data.domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE)) {
       return true;
@@ -172,14 +185,31 @@ static void extrude_mesh_vertices(MeshComponent &component,
       switch (attribute.domain()) {
         case ATTR_DOMAIN_POINT: {
           MutableSpan<T> new_data = data.slice(new_vert_range);
-          for (const int i : selection.index_range()) {
-            new_data[i] = data[selection[i]];
-          }
+          threading::parallel_for(selection.index_range(), 512, [&](const IndexRange range) {
+            for (const int i : range) {
+              new_data[i] = data[selection[i]];
+            }
+          });
           break;
         }
         case ATTR_DOMAIN_EDGE: {
-          MutableSpan<T> new_edges = data.slice(new_edge_range);
-          new_edges.fill(T());
+          MutableSpan<T> new_data = data.slice(new_edge_range);
+          threading::parallel_for(selection.index_range(), 512, [&](const IndexRange range) {
+            for (const int i : range) {
+              /* Create a separate mixer for every point to avoid allocating temporary buffers
+               * in the mixer the size of the result point cloud and to allow multi-threading. */
+              attribute_math::DefaultMixer<T> mixer{new_data.slice(i, 1)};
+
+              const int i_src_vert = selection[i];
+              Span<int> connected_edges = vert_to_edge_map[i_src_vert];
+
+              for (const int i_connected_edge : connected_edges) {
+                mixer.mix_in(0, data[i_connected_edge]);
+              }
+
+              mixer.finalize();
+            }
+          });
           break;
         }
         default:



More information about the Bf-blender-cvs mailing list