bmesh optimization: use BM_face_create() rather then BM_face_create_ngon() in BM_mesh_copy(), gives ~30% overall speedup in my tests.
This commit is contained in:
@@ -816,6 +816,8 @@ void BM_elem_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, const void *sour
|
|||||||
|
|
||||||
BMesh *BM_mesh_copy(BMesh *bm_old)
|
BMesh *BM_mesh_copy(BMesh *bm_old)
|
||||||
{
|
{
|
||||||
|
#define USE_FAST_FACE_COPY
|
||||||
|
|
||||||
BMesh *bm_new;
|
BMesh *bm_new;
|
||||||
BMVert *v, *v2, **vtable = NULL;
|
BMVert *v, *v2, **vtable = NULL;
|
||||||
BMEdge *e, *e2, **edges = NULL, **etable = NULL;
|
BMEdge *e, *e2, **edges = NULL, **etable = NULL;
|
||||||
@@ -823,6 +825,10 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
|
|||||||
BLI_array_declare(edges);
|
BLI_array_declare(edges);
|
||||||
BMLoop *l, /* *l2, */ **loops = NULL;
|
BMLoop *l, /* *l2, */ **loops = NULL;
|
||||||
BLI_array_declare(loops);
|
BLI_array_declare(loops);
|
||||||
|
#ifdef USE_FAST_FACE_COPY
|
||||||
|
BMVert **verts = NULL;
|
||||||
|
BLI_array_declare(verts);
|
||||||
|
#endif
|
||||||
BMFace *f, *f2, **ftable = NULL;
|
BMFace *f, *f2, **ftable = NULL;
|
||||||
BMEditSelection *ese;
|
BMEditSelection *ese;
|
||||||
BMIter iter, liter;
|
BMIter iter, liter;
|
||||||
@@ -890,12 +896,24 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
|
|||||||
BLI_array_grow_items(loops, f->len);
|
BLI_array_grow_items(loops, f->len);
|
||||||
BLI_array_grow_items(edges, f->len);
|
BLI_array_grow_items(edges, f->len);
|
||||||
|
|
||||||
|
#ifdef USE_FAST_FACE_COPY
|
||||||
|
BLI_array_empty(verts);
|
||||||
|
BLI_array_grow_items(verts, f->len);
|
||||||
|
#endif
|
||||||
|
|
||||||
l = BM_iter_new(&liter, bm_old, BM_LOOPS_OF_FACE, f);
|
l = BM_iter_new(&liter, bm_old, BM_LOOPS_OF_FACE, f);
|
||||||
for (j = 0; j < f->len; j++, l = BM_iter_step(&liter)) {
|
for (j = 0; j < f->len; j++, l = BM_iter_step(&liter)) {
|
||||||
loops[j] = l;
|
loops[j] = l;
|
||||||
edges[j] = etable[BM_elem_index_get(l->e)];
|
edges[j] = etable[BM_elem_index_get(l->e)];
|
||||||
|
|
||||||
|
#ifdef USE_FAST_FACE_COPY
|
||||||
|
verts[j] = vtable[BM_elem_index_get(l->v)];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_FAST_FACE_COPY
|
||||||
|
f2 = BM_face_create(bm_new, verts, edges, f->len, BM_CREATE_SKIP_CD);
|
||||||
|
#else
|
||||||
v = vtable[BM_elem_index_get(loops[0]->v)];
|
v = vtable[BM_elem_index_get(loops[0]->v)];
|
||||||
v2 = vtable[BM_elem_index_get(loops[1]->v)];
|
v2 = vtable[BM_elem_index_get(loops[1]->v)];
|
||||||
|
|
||||||
@@ -905,6 +923,8 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
|
|||||||
}
|
}
|
||||||
|
|
||||||
f2 = BM_face_create_ngon(bm_new, v, v2, edges, f->len, BM_CREATE_SKIP_CD);
|
f2 = BM_face_create_ngon(bm_new, v, v2, edges, f->len, BM_CREATE_SKIP_CD);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (UNLIKELY(f2 == NULL)) {
|
if (UNLIKELY(f2 == NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -986,7 +986,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
|
|||||||
Icon *icon = NULL;
|
Icon *icon = NULL;
|
||||||
DrawInfo *di = NULL;
|
DrawInfo *di = NULL;
|
||||||
IconImage *iimg;
|
IconImage *iimg;
|
||||||
float fdraw_size = draw_size;
|
const float fdraw_size = (float)draw_size;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
icon = BKE_icon_get(icon_id);
|
icon = BKE_icon_get(icon_id);
|
||||||
|
Reference in New Issue
Block a user