Remove MLoop use in mesh primitive nodes

This commit is contained in:
Hans Goudey 2022-12-06 14:30:56 -06:00
parent cfb1705ce1
commit 4a52e2b3e0
2 changed files with 54 additions and 49 deletions

View File

@ -369,7 +369,8 @@ static void calculate_cone_edges(const ConeConfig &config, MutableSpan<MEdge> ed
}
static void calculate_cone_faces(const ConeConfig &config,
MutableSpan<MLoop> loops,
MutableSpan<int> corner_verts,
MutableSpan<int> corner_edges,
MutableSpan<MPoly> polys)
{
int rings_poly_start;
@ -388,14 +389,15 @@ static void calculate_cone_faces(const ConeConfig &config,
poly.loopstart = loop_start;
poly.totloop = 3;
loops[loop_start + 0].v = config.first_ring_verts_start + i;
loops[loop_start + 0].e = config.first_ring_edges_start + i;
corner_verts[loop_start + 0] = config.first_ring_verts_start + i;
corner_edges[loop_start + 0] = 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);
corner_verts[loop_start + 1] = config.first_ring_verts_start +
((i + 1) % config.circle_segments);
corner_edges[loop_start + 1] = 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;
corner_verts[loop_start + 2] = top_center_vert;
corner_edges[loop_start + 2] = top_fan_edges_start + i;
}
}
else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
@ -407,8 +409,8 @@ static void calculate_cone_faces(const ConeConfig &config,
poly.loopstart = 0;
poly.totloop = config.circle_segments;
for (const int i : IndexRange(config.circle_segments)) {
loops[i].v = i;
loops[i].e = i;
corner_verts[i] = i;
corner_edges[i] = i;
}
}
@ -430,17 +432,17 @@ static void calculate_cone_faces(const ConeConfig &config,
poly.loopstart = loop_start;
poly.totloop = 4;
loops[loop_start + 0].v = this_ring_vert_start + j;
loops[loop_start + 0].e = ring_connections_start + j;
corner_verts[loop_start + 0] = this_ring_vert_start + j;
corner_edges[loop_start + 0] = ring_connections_start + j;
loops[loop_start + 1].v = next_ring_vert_start + j;
loops[loop_start + 1].e = next_ring_edges_start + j;
corner_verts[loop_start + 1] = next_ring_vert_start + j;
corner_edges[loop_start + 1] = 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);
corner_verts[loop_start + 2] = next_ring_vert_start + ((j + 1) % config.circle_segments);
corner_edges[loop_start + 2] = 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;
corner_verts[loop_start + 3] = this_ring_vert_start + ((j + 1) % config.circle_segments);
corner_edges[loop_start + 3] = this_ring_edges_start + j;
}
}
@ -456,14 +458,16 @@ static void calculate_cone_faces(const ConeConfig &config,
poly.loopstart = loop_start;
poly.totloop = 3;
loops[loop_start + 0].v = config.last_ring_verts_start + i;
loops[loop_start + 0].e = config.last_fan_edges_start + i;
corner_verts[loop_start + 0] = config.last_ring_verts_start + i;
corner_edges[loop_start + 0] = 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;
corner_verts[loop_start + 1] = config.last_vert;
corner_edges[loop_start + 1] = 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;
corner_verts[loop_start + 2] = config.last_ring_verts_start +
(i + 1) % config.circle_segments;
corner_edges[loop_start + 2] = config.last_ring_edges_start + i;
}
}
else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
@ -474,8 +478,8 @@ static void calculate_cone_faces(const ConeConfig &config,
for (const int i : IndexRange(config.circle_segments)) {
/* Go backwards to reverse surface normal. */
loops[bottom_loop_start + i].v = config.last_vert - i;
loops[bottom_loop_start + i].e = config.last_edge - ((i + 1) % config.circle_segments);
corner_verts[bottom_loop_start + i] = config.last_vert - i;
corner_edges[bottom_loop_start + i] = config.last_edge - ((i + 1) % config.circle_segments);
}
}
}
@ -693,11 +697,11 @@ Mesh *create_cylinder_or_cone_mesh(const float radius_top,
MutableSpan<float3> positions = mesh->positions_for_write();
MutableSpan<MEdge> edges = mesh->edges_for_write();
MutableSpan<MPoly> polys = mesh->polys_for_write();
MutableSpan<MLoop> loops = mesh->loops_for_write();
calculate_cone_verts(config, positions);
calculate_cone_edges(config, edges);
calculate_cone_faces(config, loops, polys);
calculate_cone_faces(
config, mesh->corner_verts_for_write(), mesh->corner_edges_for_write(), polys);
calculate_cone_uvs(mesh, config);
calculate_selection_outputs(config, attribute_outputs, mesh->attributes_for_write());

View File

@ -195,14 +195,14 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<int> corner_verts,
const int loop_start = segment * 3;
const int segment_next = segment_next_or_first(segment);
loops[loop_start + 0].v = 0;
loops[loop_start + 0].e = segment;
corner_verts[loop_start + 0] = 0;
corner_edges[loop_start + 0] = segment;
loops[loop_start + 1].v = first_vert_ring_start + segment;
loops[loop_start + 1].e = segments + segment;
corner_verts[loop_start + 1] = first_vert_ring_start + segment;
corner_edges[loop_start + 1] = segments + segment;
loops[loop_start + 2].v = first_vert_ring_start + segment_next;
loops[loop_start + 2].e = segment_next;
corner_verts[loop_start + 2] = first_vert_ring_start + segment_next;
corner_edges[loop_start + 2] = segment_next;
}
const int rings_vert_start = 1;
@ -221,17 +221,17 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<int> corner_verts,
const int loop_start = ring_loop_start + segment * 4;
const int segment_next = segment_next_or_first(segment);
loops[loop_start + 0].v = ring_vert_start + segment;
loops[loop_start + 0].e = ring_vertical_edge_start + segment;
corner_verts[loop_start + 0] = ring_vert_start + segment;
corner_edges[loop_start + 0] = ring_vertical_edge_start + segment;
loops[loop_start + 1].v = next_ring_vert_start + segment;
loops[loop_start + 1].e = next_ring_edge_start + segment;
corner_verts[loop_start + 1] = next_ring_vert_start + segment;
corner_edges[loop_start + 1] = next_ring_edge_start + segment;
loops[loop_start + 2].v = next_ring_vert_start + segment_next;
loops[loop_start + 2].e = ring_vertical_edge_start + segment_next;
corner_verts[loop_start + 2] = next_ring_vert_start + segment_next;
corner_edges[loop_start + 2] = ring_vertical_edge_start + segment_next;
loops[loop_start + 3].v = ring_vert_start + segment_next;
loops[loop_start + 3].e = ring_edge_start + segment;
corner_verts[loop_start + 3] = ring_vert_start + segment_next;
corner_edges[loop_start + 3] = ring_edge_start + segment;
}
}
@ -245,14 +245,14 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<int> corner_verts,
const int loop_start = bottom_loop_start + segment * 3;
const int segment_next = segment_next_or_first(segment);
loops[loop_start + 0].v = last_vert_index;
loops[loop_start + 0].e = bottom_edge_fan_start + segment_next;
corner_verts[loop_start + 0] = last_vert_index;
corner_edges[loop_start + 0] = bottom_edge_fan_start + segment_next;
loops[loop_start + 1].v = last_vert_ring_start + segment_next;
loops[loop_start + 1].e = last_edge_ring_start + segment;
corner_verts[loop_start + 1] = last_vert_ring_start + segment_next;
corner_edges[loop_start + 1] = last_edge_ring_start + segment;
loops[loop_start + 2].v = last_vert_ring_start + segment;
loops[loop_start + 2].e = bottom_edge_fan_start + segment;
corner_verts[loop_start + 2] = last_vert_ring_start + segment;
corner_edges[loop_start + 2] = bottom_edge_fan_start + segment;
}
}
@ -313,7 +313,8 @@ static Mesh *create_uv_sphere_mesh(const float radius, const int segments, const
MutableSpan<float3> positions = mesh->positions_for_write();
MutableSpan<MEdge> edges = mesh->edges_for_write();
MutableSpan<MPoly> polys = mesh->polys_for_write();
MutableSpan<MLoop> loops = mesh->loops_for_write();
MutableSpan<int> corner_verts = mesh->corner_verts_for_write();
MutableSpan<int> corner_edges = mesh->corner_edges_for_write();
threading::parallel_invoke(
1024 < segments * rings,
@ -325,7 +326,7 @@ static Mesh *create_uv_sphere_mesh(const float radius, const int segments, const
},
[&]() { calculate_sphere_edge_indices(edges, segments, rings); },
[&]() { calculate_sphere_faces(polys, segments); },
[&]() { calculate_sphere_corners(loops, segments, rings); },
[&]() { calculate_sphere_corners(corner_verts, corner_edges, segments, rings); },
[&]() { calculate_sphere_uvs(mesh, segments, rings); });
mesh->loose_edges_tag_none();