From df7f22d28e9af84b102b80d4f2047616febcc710 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 28 Aug 2023 21:57:22 -0400 Subject: [PATCH] Cleanup: Simplify mesh primitive grid and cuboid quad creation Fill face offsets in one multithreaded loop with an offset indices utility function instead of keeping track of the index and setting the offset for each face. --- .../geometry/intern/mesh_primitive_cuboid.cc | 46 ++++++------------- .../nodes/node_geo_mesh_primitive_grid.cc | 15 ++---- 2 files changed, 16 insertions(+), 45 deletions(-) diff --git a/source/blender/geometry/intern/mesh_primitive_cuboid.cc b/source/blender/geometry/intern/mesh_primitive_cuboid.cc index 90baf47fd55..2683e94b1bb 100644 --- a/source/blender/geometry/intern/mesh_primitive_cuboid.cc +++ b/source/blender/geometry/intern/mesh_primitive_cuboid.cc @@ -110,29 +110,22 @@ static void calculate_positions(const CuboidConfig &config, MutableSpan * Hence they are passed as 1,4,3,2 when calculating faces clockwise, and 1,2,3,4 for * anti-clockwise. */ -static void define_quad(MutableSpan face_offsets, - MutableSpan corner_verts, - const int face_index, +static void define_quad(MutableSpan corner_verts, const int loop_index, const int vert_1, const int vert_2, const int vert_3, const int vert_4) { - face_offsets[face_index] = loop_index; - corner_verts[loop_index] = vert_1; corner_verts[loop_index + 1] = vert_2; corner_verts[loop_index + 2] = vert_3; corner_verts[loop_index + 3] = vert_4; } -static void calculate_faces(const CuboidConfig &config, - MutableSpan face_offsets, - MutableSpan corner_verts) +static void calculate_corner_verts(const CuboidConfig &config, MutableSpan corner_verts) { int loop_index = 0; - int face_index = 0; /* Number of vertices in an XY cross-section of the cube (barring top and bottom faces). */ const int xy_cross_section_vert_count = config.verts_x * config.verts_y - @@ -148,10 +141,8 @@ static void calculate_faces(const CuboidConfig &config, const int vert_3 = vert_2 + 1; const int vert_4 = vert_1 + 1; - define_quad( - face_offsets, corner_verts, face_index, loop_index, vert_1, vert_2, vert_3, vert_4); + define_quad(corner_verts, loop_index, vert_1, vert_2, vert_3, vert_4); loop_index += 4; - face_index++; } vert_1_start += config.verts_x; } @@ -162,16 +153,14 @@ static void calculate_faces(const CuboidConfig &config, for ([[maybe_unused]] const int z : IndexRange(config.edges_z)) { for (const int x : IndexRange(config.edges_x)) { - define_quad(face_offsets, - corner_verts, - face_index, + define_quad(corner_verts, + loop_index, vert_1_start + x, vert_1_start + x + 1, vert_2_start + x + 1, vert_2_start + x); loop_index += 4; - face_index++; } vert_1_start = vert_2_start; vert_2_start += config.verts_x * config.verts_y - (config.verts_x - 2) * (config.verts_y - 2); @@ -185,16 +174,14 @@ static void calculate_faces(const CuboidConfig &config, for ([[maybe_unused]] const int y : IndexRange(config.edges_y)) { for (const int x : IndexRange(config.edges_x)) { - define_quad(face_offsets, - corner_verts, - face_index, + define_quad(corner_verts, + loop_index, vert_1_start + x, vert_1_start + x + 1, vert_2_start + x + 1, vert_2_start + x); loop_index += 4; - face_index++; } vert_2_start += config.verts_x; vert_1_start += config.verts_x; @@ -209,16 +196,14 @@ static void calculate_faces(const CuboidConfig &config, vert_2_start += (config.verts_x - 2) * (config.verts_y - 2); } for (const int x : IndexRange(config.edges_x)) { - define_quad(face_offsets, - corner_verts, - face_index, + define_quad(corner_verts, + loop_index, vert_1_start + x, vert_2_start + x, vert_2_start + x + 1, vert_1_start + x + 1); loop_index += 4; - face_index++; } vert_2_start += xy_cross_section_vert_count; vert_1_start += xy_cross_section_vert_count; @@ -255,10 +240,8 @@ static void calculate_faces(const CuboidConfig &config, vert_3 = vert_2 + 2; } - define_quad( - face_offsets, corner_verts, face_index, loop_index, vert_1, vert_2, vert_3, vert_4); + define_quad(corner_verts, loop_index, vert_1, vert_2, vert_3, vert_4); loop_index += 4; - face_index++; } if (z == 0) { vert_1_start += config.verts_x * config.verts_y; @@ -303,10 +286,8 @@ static void calculate_faces(const CuboidConfig &config, vert_4 = vert_1 + config.verts_x; } - define_quad( - face_offsets, corner_verts, face_index, loop_index, vert_1, vert_4, vert_3, vert_2); + define_quad(corner_verts, loop_index, vert_1, vert_4, vert_3, vert_2); loop_index += 4; - face_index++; } if (z == 0) { vert_1_start += config.verts_x * config.verts_y; @@ -404,13 +385,12 @@ Mesh *create_cuboid_mesh(const float3 &size, Mesh *mesh = BKE_mesh_new_nomain(config.vertex_count, 0, config.face_count, config.loop_count); MutableSpan positions = mesh->vert_positions_for_write(); - MutableSpan face_offsets = mesh->face_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); BKE_mesh_smooth_flag_set(mesh, false); calculate_positions(config, positions); - - calculate_faces(config, face_offsets, corner_verts); + offset_indices::fill_constant_group_size(4, 0, mesh->face_offsets_for_write()); + calculate_corner_verts(config, corner_verts); BKE_mesh_calc_edges(mesh, false, false); if (uv_id) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc index ad2100b9e16..49a46b91d15 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc @@ -57,16 +57,11 @@ Mesh *create_grid_mesh(const int verts_x, edges_x * edges_y * 4); MutableSpan positions = mesh->vert_positions_for_write(); MutableSpan edges = mesh->edges_for_write(); - MutableSpan face_offsets = mesh->face_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); MutableSpan corner_edges = mesh->corner_edges_for_write(); BKE_mesh_smooth_flag_set(mesh, false); - threading::parallel_for(face_offsets.index_range(), 4096, [face_offsets](IndexRange range) { - for (const int i : range) { - face_offsets[i] = i * 4; - } - }); + offset_indices::fill_constant_group_size(4, 0, mesh->face_offsets_for_write()); { const float dx = edges_x == 0 ? 0.0f : size_x / edges_x; @@ -99,9 +94,7 @@ Mesh *create_grid_mesh(const int verts_x, threading::parallel_for(IndexRange(edges_y), 512, [&](IndexRange y_range) { for (const int y : y_range) { const int vert_index = y_vert_offset + y; - int2 &edge = edges[y_edge_offset + y]; - edge[0] = vert_index; - edge[1] = vert_index + 1; + edges[y_edge_offset + y] = int2(vert_index, vert_index + 1); } }); } @@ -114,9 +107,7 @@ Mesh *create_grid_mesh(const int verts_x, threading::parallel_for(IndexRange(edges_x), 512, [&](IndexRange x_range) { for (const int x : x_range) { const int vert_index = x * verts_y + y; - int2 &edge = edges[x_edge_offset + x]; - edge[0] = vert_index; - edge[1] = vert_index + verts_y; + edges[x_edge_offset + x] = int2(vert_index, vert_index + verts_y); } }); }