diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-02 02:17:04 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-02 02:17:04 +0400 |
commit | 921a7556fbc4c66267137b767ce93c85d9b4cbd8 (patch) | |
tree | 7d816ba9696338c219d18ac4d6f7e3b1f536ebf6 /source/blender/bmesh/intern/bmesh_interp.c | |
parent | 2942eab57c9677e87d0830fe5e5da35abb869417 (diff) |
bmesh - changes to mempool allocations
* double default edge allocation size (double the number of verts/faces).
* CustomData_bmesh_init_pool was using allocsize & chunksize as the same variable. Now use type specific chunk size.
* bmesh copy and editmode conversion now allocate the BMesh mempool size needed for the entire vert/edge/loop/face arrays since its known already.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_interp.c')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index 669426b73a6..d2af98a5e9f 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -720,11 +720,11 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data) BLI_mempool *oldpool = olddata->pool; void *block; - CustomData_bmesh_init_pool(data, data == &bm->ldata ? 2048 : 512); - if (data == &bm->vdata) { BMVert *eve; - + + CustomData_bmesh_init_pool(data, bm->totvert, BM_VERT); + BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) { block = NULL; CustomData_bmesh_set_default(data, &block); @@ -736,6 +736,8 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data) else if (data == &bm->edata) { BMEdge *eed; + CustomData_bmesh_init_pool(data, bm->totedge, BM_EDGE); + BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) { block = NULL; CustomData_bmesh_set_default(data, &block); @@ -744,31 +746,39 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data) eed->head.data = block; } } - else if (data == &bm->pdata || data == &bm->ldata) { + else if (data == &bm->ldata) { BMIter liter; BMFace *efa; BMLoop *l; + CustomData_bmesh_init_pool(data, bm->totloop, BM_LOOP); BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) { - if (data == &bm->pdata) { + BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) { block = NULL; CustomData_bmesh_set_default(data, &block); - CustomData_bmesh_copy_data(olddata, data, efa->head.data, &block); - CustomData_bmesh_free_block(olddata, &efa->head.data); - efa->head.data = block; + CustomData_bmesh_copy_data(olddata, data, l->head.data, &block); + CustomData_bmesh_free_block(olddata, &l->head.data); + l->head.data = block; } + } + } + else if (data == &bm->pdata) { + BMFace *efa; - if (data == &bm->ldata) { - BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) { - block = NULL; - CustomData_bmesh_set_default(data, &block); - CustomData_bmesh_copy_data(olddata, data, l->head.data, &block); - CustomData_bmesh_free_block(olddata, &l->head.data); - l->head.data = block; - } - } + CustomData_bmesh_init_pool(data, bm->totface, BM_FACE); + + BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) { + block = NULL; + CustomData_bmesh_set_default(data, &block); + CustomData_bmesh_copy_data(olddata, data, efa->head.data, &block); + CustomData_bmesh_free_block(olddata, &efa->head.data); + efa->head.data = block; } } + else { + /* should never reach this! */ + BLI_assert(0); + } if (oldpool) { /* this should never happen but can when dissolve fails - [#28960] */ |