use BM_face_create() over BM_face_create_ngon() in bevel and extrude individual faces to get some speedup.
This commit is contained in:
@@ -980,9 +980,12 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
|
||||
MEM_freeN(vtable);
|
||||
MEM_freeN(ftable);
|
||||
|
||||
#ifdef USE_FAST_FACE_COPY
|
||||
BLI_array_free(verts);
|
||||
#endif
|
||||
|
||||
BLI_array_free(loops);
|
||||
BLI_array_free(edges);
|
||||
|
||||
return bm_new;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,28 +51,35 @@ enum {
|
||||
|
||||
void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op)
|
||||
{
|
||||
BMVert **verts = NULL;
|
||||
BLI_array_declare(verts);
|
||||
BMEdge **edges = NULL;
|
||||
BLI_array_declare(edges);
|
||||
|
||||
BMOIter siter;
|
||||
BMIter liter, liter2;
|
||||
BMFace *f, *f2, *f3;
|
||||
BMLoop *l, *l2, *l3, *l4, *l_tmp;
|
||||
BMEdge **edges = NULL, *e, *laste;
|
||||
BMEdge *e, *laste;
|
||||
BMVert *v, *lastv, *firstv;
|
||||
BLI_array_declare(edges);
|
||||
int i;
|
||||
|
||||
BMO_ITER (f, &siter, op->slots_in, "faces", BM_FACE) {
|
||||
BLI_array_empty(verts);
|
||||
BLI_array_empty(edges);
|
||||
BLI_array_grow_items(verts, f->len);
|
||||
BLI_array_grow_items(edges, f->len);
|
||||
|
||||
i = 0;
|
||||
firstv = lastv = NULL;
|
||||
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
|
||||
v = BM_vert_create(bm, l->v->co, l->v, 0);
|
||||
|
||||
/* skip on the first iteration */
|
||||
if (lastv) {
|
||||
e = BM_edge_create(bm, lastv, v, l->e, 0);
|
||||
edges[i++] = e;
|
||||
edges[i] = e;
|
||||
verts[i] = lastv;
|
||||
i++;
|
||||
}
|
||||
|
||||
lastv = v;
|
||||
@@ -82,11 +89,13 @@ void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
/* this fits in the array because we skip one in the loop above */
|
||||
e = BM_edge_create(bm, v, firstv, laste, 0);
|
||||
edges[i++] = e;
|
||||
edges[i] = e;
|
||||
verts[i] = lastv;
|
||||
i++;
|
||||
|
||||
BMO_elem_flag_enable(bm, f, EXT_DEL);
|
||||
|
||||
f2 = BM_face_create_ngon(bm, firstv, BM_edge_other_vert(edges[0], firstv), edges, f->len, 0);
|
||||
f2 = BM_face_create(bm, verts, edges, f->len, 0);
|
||||
if (UNLIKELY(f2 == NULL)) {
|
||||
BMO_error_raise(bm, op, BMERR_MESH_ERROR, "Extrude failed: could not create face");
|
||||
BLI_array_free(edges);
|
||||
@@ -117,6 +126,7 @@ void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op)
|
||||
}
|
||||
}
|
||||
|
||||
BLI_array_free(verts);
|
||||
BLI_array_free(edges);
|
||||
|
||||
BMO_op_callf(bm, op->flag,
|
||||
|
||||
@@ -269,7 +269,11 @@ static BMFace *bev_create_ngon(BMesh *bm, BMVert **vert_arr, const int totv, BMF
|
||||
for (i = 0; i < totv; i++) {
|
||||
ee[i] = BM_edge_create(bm, vert_arr[i], vert_arr[(i + 1) % totv], NULL, BM_CREATE_NO_DOUBLE);
|
||||
}
|
||||
#if 0
|
||||
f = BM_face_create_ngon(bm, vert_arr[0], vert_arr[1], ee, totv, 0);
|
||||
#else
|
||||
f = BM_face_create(bm, vert_arr, ee, totv, 0);
|
||||
#endif
|
||||
}
|
||||
if (facerep && f) {
|
||||
int has_mdisps = CustomData_has_layer(&bm->ldata, CD_MDISPS);
|
||||
|
||||
Reference in New Issue
Block a user