Remove MLoop use in mesh primitive nodes
This commit is contained in:
parent
cfb1705ce1
commit
4a52e2b3e0
|
@ -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());
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue