[Bf-blender-cvs] [ff324ab7161] master: Cleanup: Make mesh primitive topology building more parallel

Hans Goudey noreply at git.blender.org
Tue Dec 6 21:25:56 CET 2022


Commit: ff324ab7161a5021c3a8e233900e110ade521834
Author: Hans Goudey
Date:   Tue Dec 6 14:22:19 2022 -0600
Branches: master
https://developer.blender.org/rBff324ab7161a5021c3a8e233900e110ade521834

Cleanup: Make mesh primitive topology building more parallel

Avoid using an incremented "loop index" variable which makes the whole
data-filling necessarily sequential. No functional changes expected,
this just simplifies some refactors to face corner storage.

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

M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
index 206be90fcbf..c0ca92bb4b9 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
@@ -372,45 +372,51 @@ static void calculate_cone_faces(const ConeConfig &config,
                                  MutableSpan<MLoop> loops,
                                  MutableSpan<MPoly> polys)
 {
-  int loop_index = 0;
-  int poly_index = 0;
-
+  int rings_poly_start;
+  int rings_loop_start;
   if (config.top_has_center_vert) {
+    rings_poly_start = config.circle_segments;
+    rings_loop_start = config.circle_segments * 3;
+
     /* Top cone tip or center triangle fan in the fill. */
     const int top_center_vert = 0;
     const int top_fan_edges_start = 0;
 
     for (const int i : IndexRange(config.circle_segments)) {
-      MPoly &poly = polys[poly_index++];
-      poly.loopstart = loop_index;
+      const int loop_start = i * 3;
+      MPoly &poly = polys[i];
+      poly.loopstart = loop_start;
       poly.totloop = 3;
 
-      MLoop &loop_a = loops[loop_index++];
-      loop_a.v = config.first_ring_verts_start + i;
-      loop_a.e = config.first_ring_edges_start + i;
-      MLoop &loop_b = loops[loop_index++];
-      loop_b.v = config.first_ring_verts_start + ((i + 1) % config.circle_segments);
-      loop_b.e = top_fan_edges_start + ((i + 1) % config.circle_segments);
-      MLoop &loop_c = loops[loop_index++];
-      loop_c.v = top_center_vert;
-      loop_c.e = top_fan_edges_start + i;
+      loops[loop_start + 0].v = config.first_ring_verts_start + i;
+      loops[loop_start + 0].e = config.first_ring_edges_start + i;
+
+      loops[loop_start + 1].v = config.first_ring_verts_start + ((i + 1) % config.circle_segments);
+      loops[loop_start + 1].e = top_fan_edges_start + ((i + 1) % config.circle_segments);
+
+      loops[loop_start + 2].v = top_center_vert;
+      loops[loop_start + 2].e = top_fan_edges_start + i;
     }
   }
   else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
+    rings_poly_start = 1;
+    rings_loop_start = config.circle_segments;
+
     /* Center n-gon in the fill. */
-    MPoly &poly = polys[poly_index++];
-    poly.loopstart = loop_index;
+    MPoly &poly = polys[0];
+    poly.loopstart = 0;
     poly.totloop = config.circle_segments;
     for (const int i : IndexRange(config.circle_segments)) {
-      MLoop &loop = loops[loop_index++];
-      loop.v = i;
-      loop.e = i;
+      loops[i].v = i;
+      loops[i].e = i;
     }
   }
 
   /* Quads connect one edge ring to the next one. */
   if (config.tot_quad_rings > 0) {
     for (const int i : IndexRange(config.tot_quad_rings)) {
+      const int this_ring_poly_start = rings_poly_start + i * config.circle_segments;
+      const int this_ring_loop_start = rings_loop_start + i * config.circle_segments * 4;
       const int this_ring_vert_start = config.first_ring_verts_start +
                                        (i * config.circle_segments);
       const int next_ring_vert_start = this_ring_vert_start + config.circle_segments;
@@ -421,55 +427,58 @@ static void calculate_cone_faces(const ConeConfig &config,
       const int ring_connections_start = this_ring_edges_start + config.circle_segments;
 
       for (const int j : IndexRange(config.circle_segments)) {
-        MPoly &poly = polys[poly_index++];
-        poly.loopstart = loop_index;
+        const int loop_start = this_ring_loop_start + j * 4;
+        MPoly &poly = polys[this_ring_poly_start + j];
+        poly.loopstart = loop_start;
         poly.totloop = 4;
 
-        MLoop &loop_a = loops[loop_index++];
-        loop_a.v = this_ring_vert_start + j;
-        loop_a.e = ring_connections_start + j;
-        MLoop &loop_b = loops[loop_index++];
-        loop_b.v = next_ring_vert_start + j;
-        loop_b.e = next_ring_edges_start + j;
-        MLoop &loop_c = loops[loop_index++];
-        loop_c.v = next_ring_vert_start + ((j + 1) % config.circle_segments);
-        loop_c.e = ring_connections_start + ((j + 1) % config.circle_segments);
-        MLoop &loop_d = loops[loop_index++];
-        loop_d.v = this_ring_vert_start + ((j + 1) % config.circle_segments);
-        loop_d.e = this_ring_edges_start + j;
+        loops[loop_start + 0].v = this_ring_vert_start + j;
+        loops[loop_start + 0].e = ring_connections_start + j;
+
+        loops[loop_start + 1].v = next_ring_vert_start + j;
+        loops[loop_start + 1].e = next_ring_edges_start + j;
+
+        loops[loop_start + 2].v = next_ring_vert_start + ((j + 1) % config.circle_segments);
+        loops[loop_start + 2].e = ring_connections_start + ((j + 1) % config.circle_segments);
+
+        loops[loop_start + 3].v = this_ring_vert_start + ((j + 1) % config.circle_segments);
+        loops[loop_start + 3].e = this_ring_edges_start + j;
       }
     }
   }
 
+  const int bottom_poly_start = rings_poly_start + config.tot_quad_rings * config.circle_segments;
+  const int bottom_loop_start = rings_loop_start +
+                                config.tot_quad_rings * config.circle_segments * 4;
+
   if (config.bottom_has_center_vert) {
     /* Bottom cone tip or center triangle fan in the fill. */
     for (const int i : IndexRange(config.circle_segments)) {
-      MPoly &poly = polys[poly_index++];
-      poly.loopstart = loop_index;
+      const int loop_start = bottom_loop_start + i * 3;
+      MPoly &poly = polys[bottom_poly_start + i];
+      poly.loopstart = loop_start;
       poly.totloop = 3;
 
-      MLoop &loop_a = loops[loop_index++];
-      loop_a.v = config.last_ring_verts_start + i;
-      loop_a.e = config.last_fan_edges_start + i;
-      MLoop &loop_b = loops[loop_index++];
-      loop_b.v = config.last_vert;
-      loop_b.e = config.last_fan_edges_start + (i + 1) % config.circle_segments;
-      MLoop &loop_c = loops[loop_index++];
-      loop_c.v = config.last_ring_verts_start + (i + 1) % config.circle_segments;
-      loop_c.e = config.last_ring_edges_start + i;
+      loops[loop_start + 0].v = config.last_ring_verts_start + i;
+      loops[loop_start + 0].e = config.last_fan_edges_start + i;
+
+      loops[loop_start + 1].v = config.last_vert;
+      loops[loop_start + 1].e = config.last_fan_edges_start + (i + 1) % config.circle_segments;
+
+      loops[loop_start + 2].v = config.last_ring_verts_start + (i + 1) % config.circle_segments;
+      loops[loop_start + 2].e = config.last_ring_edges_start + i;
     }
   }
   else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
     /* Center n-gon in the fill. */
-    MPoly &poly = polys[poly_index++];
-    poly.loopstart = loop_index;
+    MPoly &poly = polys[bottom_poly_start];
+    poly.loopstart = bottom_loop_start;
     poly.totloop = config.circle_segments;
 
     for (const int i : IndexRange(config.circle_segments)) {
       /* Go backwards to reverse surface normal. */
-      MLoop &loop = loops[loop_index++];
-      loop.v = config.last_vert - i;
-      loop.e = config.last_edge - ((i + 1) % config.circle_segments);
+      loops[bottom_loop_start + i].v = config.last_vert - i;
+      loops[bottom_loop_start + i].e = config.last_edge - ((i + 1) % config.circle_segments);
     }
   }
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
index 0f693aff876..539c4107270 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
@@ -184,7 +184,6 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<MLoop> loops,
                                                   const int segments,
                                                   const int rings)
 {
-  int loop_index = 0;
   auto segment_next_or_first = [&](const int segment) {
     return segment == segments - 1 ? 0 : segment + 1;
   };
@@ -192,63 +191,67 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<MLoop> loops,
   /* Add the triangles connected to the top vertex. */
   const int first_vert_ring_index_start = 1;
   for (const int segment : IndexRange(segments)) {
+    const int loop_start = segment * 3;
     const int segment_next = segment_next_or_first(segment);
 
-    MLoop &loop_a = loops[loop_index++];
-    loop_a.v = 0;
-    loop_a.e = segment;
-    MLoop &loop_b = loops[loop_index++];
-    loop_b.v = first_vert_ring_index_start + segment;
-    loop_b.e = segments + segment;
-    MLoop &loop_c = loops[loop_index++];
-    loop_c.v = first_vert_ring_index_start + segment_next;
-    loop_c.e = segment_next;
+    loops[loop_start + 0].v = 0;
+    loops[loop_start + 0].e = segment;
+
+    loops[loop_start + 1].v = first_vert_ring_index_start + segment;
+    loops[loop_start + 1].e = segments + segment;
+
+    loops[loop_start + 2].v = first_vert_ring_index_start + segment_next;
+    loops[loop_start + 2].e = segment_next;
   }
 
-  int ring_vert_index_start = 1;
-  int ring_edge_index_start = segments;
-  for ([[maybe_unused]] const int ring : IndexRange(1, rings - 2)) {
+  const int rings_vert_index_start = 1;
+  const int rings_edge_index_start = segments;
+  const int rings_loop_index_start = segments * 3;
+  for (const int ring : IndexRange(1, rings - 2)) {
+    const int ring_vert_index_start = rings_vert_index_start + (ring - 1) * segments;
+    const int ring_edge_index_start = rings_edge_index_start + (ring - 1) * segments * 2;
+    const int ring_loop_index_start = rings_loop_index_start + (ring - 1) * segments * 4;
+
     const int next_ring_vert_index_start = ring_vert_index_start + segments;
     const int next_ring_edge_index_start = ring_edge_index_start + segments * 2;
     const int ring_vertical_edge_index_start = ring_edge_index_start + segments;
 
     for (const int segment : IndexRange(segments)) {
+      const int loop_start = ring_loop_index_start + segment * 4;
       const int segment_next = segment_next_or_first(segment);
 
-      MLoop &loop_a = loops[loop_index++];
-      loop_a.v = ring_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list