Subdiv: Simplify final vertex counting
The initial subdivision context counting ended up using unnecessarily complicated logic to count the number of final vertices. In a first pass it added vertices for every coarse edge. Then it added the same number of vertices for every loose edge. That adds up to the same number of vertices for the edges, so the separation is redundant and can be replaced with a single multiplication. The bitmap doesn't need to be cleared then, since it isn't used now. In a test of a mesh with 2 million faces and 3 million vertices, this saved 2.8ms (though the whole subdivision process takes around 700ms). Pull Request #105159
This commit is contained in:
@@ -167,15 +167,6 @@ static void subdiv_foreach_ctx_count(SubdivForeachTaskContext *ctx)
|
||||
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
|
||||
const MPoly *coarse_poly = &ctx->coarse_polys[poly_index];
|
||||
const int num_ptex_faces_per_poly = num_ptex_faces_per_poly_get(coarse_poly);
|
||||
for (int corner = 0; corner < coarse_poly->totloop; corner++) {
|
||||
const MLoop *loop = &ctx->coarse_loops[coarse_poly->loopstart + corner];
|
||||
const bool is_edge_used = BLI_BITMAP_TEST_BOOL(ctx->coarse_edges_used_map, loop->e);
|
||||
/* Edges which aren't counted yet. */
|
||||
if (!is_edge_used) {
|
||||
BLI_BITMAP_ENABLE(ctx->coarse_edges_used_map, loop->e);
|
||||
ctx->num_subdiv_vertices += num_subdiv_vertices_per_coarse_edge;
|
||||
}
|
||||
}
|
||||
/* Inner vertices of polygon. */
|
||||
if (num_ptex_faces_per_poly == 1) {
|
||||
ctx->num_subdiv_vertices += num_inner_vertices_per_quad;
|
||||
@@ -197,12 +188,10 @@ static void subdiv_foreach_ctx_count(SubdivForeachTaskContext *ctx)
|
||||
num_polys_per_ptex_get(no_quad_patch_resolution);
|
||||
}
|
||||
}
|
||||
/* Calculate extra vertices created by loose edges. */
|
||||
for (int edge_index = 0; edge_index < coarse_mesh->totedge; edge_index++) {
|
||||
if (!BLI_BITMAP_TEST_BOOL(ctx->coarse_edges_used_map, edge_index)) {
|
||||
ctx->num_subdiv_vertices += num_subdiv_vertices_per_coarse_edge;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add vertices used by outer edges on subdvided faces and loose edges. */
|
||||
ctx->num_subdiv_vertices += num_subdiv_vertices_per_coarse_edge * coarse_mesh->totedge;
|
||||
|
||||
ctx->num_subdiv_loops = ctx->num_subdiv_polygons * 4;
|
||||
}
|
||||
|
||||
@@ -270,8 +259,6 @@ static void subdiv_foreach_ctx_init(Subdiv *subdiv, SubdivForeachTaskContext *ct
|
||||
subdiv_foreach_ctx_init_offsets(ctx);
|
||||
/* Calculate number of geometry in the result subdivision mesh. */
|
||||
subdiv_foreach_ctx_count(ctx);
|
||||
/* Re-set maps which were used at this step. */
|
||||
BLI_bitmap_set_all(ctx->coarse_edges_used_map, false, coarse_mesh->totedge);
|
||||
ctx->face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user