Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-05-08 16:59:56 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-08 16:59:56 +0400
commitf554c264da7d0f53a2519079a2e670ecb4e8629d (patch)
tree8158335342913fc59dd1be69e35a3d65a0491bbe /source/blender/bmesh
parentc6702a3b917894bf150e19526e1eedd8d5f2e91b (diff)
speedup for freeing bmeshes, skip calling free on every
vert/edge/face/loop if there are no free functions for the customdata layers.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index c98c4f372f1..f3da337f653 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -164,21 +164,37 @@ void BM_mesh_data_free(BMesh *bm)
BMEdge *e;
BMLoop *l;
BMFace *f;
-
BMIter iter;
BMIter itersub;
-
- BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
- CustomData_bmesh_free_block(&(bm->vdata), &(v->head.data));
+
+ bool is_ldata_free;
+ bool is_pdata_free;
+
+
+ /* Check if we have to call free, if not we can avoid a lot of looping */
+ if (CustomData_bmesh_has_free(&(bm->vdata))) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+ CustomData_bmesh_free_block(&(bm->vdata), &(v->head.data));
+ }
}
- BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
- CustomData_bmesh_free_block(&(bm->edata), &(e->head.data));
+ if (CustomData_bmesh_has_free(&(bm->edata))) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+ CustomData_bmesh_free_block(&(bm->edata), &(e->head.data));
+ }
}
- BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
- CustomData_bmesh_free_block(&(bm->pdata), &(f->head.data));
- BM_ITER_ELEM (l, &itersub, f, BM_LOOPS_OF_FACE) {
- CustomData_bmesh_free_block(&(bm->ldata), &(l->head.data));
+
+ if ((is_ldata_free = CustomData_bmesh_has_free(&(bm->ldata))) ||
+ (is_pdata_free = CustomData_bmesh_has_free(&(bm->pdata))))
+ {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ if (is_pdata_free)
+ CustomData_bmesh_free_block(&(bm->pdata), &(f->head.data));
+ if (is_ldata_free) {
+ BM_ITER_ELEM (l, &itersub, f, BM_LOOPS_OF_FACE) {
+ CustomData_bmesh_free_block(&(bm->ldata), &(l->head.data));
+ }
+ }
}
}