[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44593] trunk/blender/source/blender: bmesh - changes to mempool allocations
Campbell Barton
ideasman42 at gmail.com
Thu Mar 1 23:17:11 CET 2012
Revision: 44593
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44593
Author: campbellbarton
Date: 2012-03-01 22:17:04 +0000 (Thu, 01 Mar 2012)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_customdata.h
trunk/blender/source/blender/blenkernel/intern/customdata.c
trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
trunk/blender/source/blender/bmesh/intern/bmesh_construct.h
trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
trunk/blender/source/blender/bmesh/operators/bmo_mesh_conv.c
trunk/blender/source/blender/editors/mesh/bmesh_tools.c
Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h 2012-03-01 20:41:13 UTC (rev 44592)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h 2012-03-01 22:17:04 UTC (rev 44593)
@@ -110,7 +110,7 @@
then goes through the mesh and makes sure all the customdata blocks are
consistent with the new layout.*/
void CustomData_bmesh_merge(struct CustomData *source, struct CustomData *dest,
- int mask, int alloctype, struct BMesh *bm, int type);
+ int mask, int alloctype, struct BMesh *bm, const char htype);
/* frees data associated with a CustomData object (doesn't free the object
* itself, though)
@@ -319,7 +319,7 @@
struct CustomData *ldata, int totloop, int totpoly);
void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata, int total);
void CustomData_bmesh_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
-void CustomData_bmesh_init_pool(struct CustomData *data, int allocsize);
+void CustomData_bmesh_init_pool(struct CustomData *data, int totelem, const char htype);
/* External file storage */
Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-03-01 20:41:13 UTC (rev 44592)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-03-01 22:17:04 UTC (rev 44593)
@@ -2111,19 +2111,33 @@
}
}
-void CustomData_bmesh_init_pool(CustomData *data, int allocsize)
+void CustomData_bmesh_init_pool(CustomData *data, int totelem, const char htype)
{
+ int chunksize;
+
/* Dispose old pools before calling here to avoid leaks */
BLI_assert(data->pool == NULL);
+ switch (htype) {
+ case BM_VERT: chunksize = 512; break;
+ case BM_EDGE: chunksize = 1024; break;
+ case BM_LOOP: chunksize = 2048; break;
+ case BM_FACE: chunksize = 512; break;
+ case BM_ALL: chunksize = 512; break; /* use this when its undefined */
+ default:
+ BLI_assert(0);
+ chunksize = 512;
+ break;
+ }
+
/* If there are no layers, no pool is needed just yet */
if (data->totlayer) {
- data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, TRUE, FALSE);
+ data->pool = BLI_mempool_create(data->totsize, totelem, chunksize, TRUE, FALSE);
}
}
void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
- int mask, int alloctype, BMesh *bm, int type)
+ int mask, int alloctype, BMesh *bm, const char htype)
{
BMHeader *h;
BMIter iter;
@@ -2132,9 +2146,9 @@
int t;
CustomData_merge(source, dest, mask, alloctype, 0);
- CustomData_bmesh_init_pool(dest, 512);
+ CustomData_bmesh_init_pool(dest, 512, htype);
- switch (type) {
+ switch (htype) {
case BM_VERT:
t = BM_VERTS_OF_MESH; break;
case BM_EDGE:
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-03-01 20:41:13 UTC (rev 44592)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-03-01 22:17:04 UTC (rev 44593)
@@ -575,9 +575,9 @@
}
}
-BMesh *BM_mesh_copy(BMesh *bmold)
+BMesh *BM_mesh_copy(BMesh *bm_old)
{
- BMesh *bm;
+ BMesh *bm_new;
BMVert *v, *v2, **vtable = NULL;
BMEdge *e, *e2, **edges = NULL, **etable = NULL;
BLI_array_declare(edges);
@@ -587,57 +587,61 @@
BMEditSelection *ese;
BMIter iter, liter;
int i, j;
+ BMAllocTemplate allocsize = {bm_old->totvert,
+ bm_old->totedge,
+ bm_old->totloop,
+ bm_old->totface};
/* allocate a bmesh */
- bm = BM_mesh_create(bmold->ob, &bm_mesh_allocsize_default);
+ bm_new = BM_mesh_create(bm_old->ob, &allocsize);
- CustomData_copy(&bmold->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&bmold->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&bmold->ldata, &bm->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&bmold->pdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
+ CustomData_copy(&bm_old->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
+ CustomData_copy(&bm_old->edata, &bm_new->edata, CD_MASK_BMESH, CD_CALLOC, 0);
+ CustomData_copy(&bm_old->ldata, &bm_new->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
+ CustomData_copy(&bm_old->pdata, &bm_new->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_bmesh_init_pool(&bm->vdata, bm_mesh_allocsize_default.totvert);
- CustomData_bmesh_init_pool(&bm->edata, bm_mesh_allocsize_default.totedge);
- CustomData_bmesh_init_pool(&bm->ldata, bm_mesh_allocsize_default.totloop);
- CustomData_bmesh_init_pool(&bm->pdata, bm_mesh_allocsize_default.totface);
+ CustomData_bmesh_init_pool(&bm_new->vdata, allocsize.totvert, BM_VERT);
+ CustomData_bmesh_init_pool(&bm_new->edata, allocsize.totedge, BM_EDGE);
+ CustomData_bmesh_init_pool(&bm_new->ldata, allocsize.totloop, BM_LOOP);
+ CustomData_bmesh_init_pool(&bm_new->pdata, allocsize.totface, BM_FACE);
- vtable = MEM_mallocN(sizeof(BMVert *) * bmold->totvert, "BM_mesh_copy vtable");
- etable = MEM_mallocN(sizeof(BMEdge *) * bmold->totedge, "BM_mesh_copy etable");
- ftable = MEM_mallocN(sizeof(BMFace *) * bmold->totface, "BM_mesh_copy ftable");
+ vtable = MEM_mallocN(sizeof(BMVert *) * bm_old->totvert, "BM_mesh_copy vtable");
+ etable = MEM_mallocN(sizeof(BMEdge *) * bm_old->totedge, "BM_mesh_copy etable");
+ ftable = MEM_mallocN(sizeof(BMFace *) * bm_old->totface, "BM_mesh_copy ftable");
- v = BM_iter_new(&iter, bmold, BM_VERTS_OF_MESH, NULL);
+ v = BM_iter_new(&iter, bm_old, BM_VERTS_OF_MESH, NULL);
for (i = 0; v; v = BM_iter_step(&iter), i++) {
- v2 = BM_vert_create(bm, v->co, NULL); /* copy between meshes so cant use 'example' argument */
- BM_elem_attrs_copy(bmold, bm, v, v2);
+ v2 = BM_vert_create(bm_new, v->co, NULL); /* copy between meshes so cant use 'example' argument */
+ BM_elem_attrs_copy(bm_old, bm_new, v, v2);
vtable[i] = v2;
BM_elem_index_set(v, i); /* set_inline */
BM_elem_index_set(v2, i); /* set_inline */
}
- bmold->elem_index_dirty &= ~BM_VERT;
- bm->elem_index_dirty &= ~BM_VERT;
+ bm_old->elem_index_dirty &= ~BM_VERT;
+ bm_new->elem_index_dirty &= ~BM_VERT;
/* safety check */
- BLI_assert(i == bmold->totvert);
+ BLI_assert(i == bm_old->totvert);
- e = BM_iter_new(&iter, bmold, BM_EDGES_OF_MESH, NULL);
+ e = BM_iter_new(&iter, bm_old, BM_EDGES_OF_MESH, NULL);
for (i = 0; e; e = BM_iter_step(&iter), i++) {
- e2 = BM_edge_create(bm,
+ e2 = BM_edge_create(bm_new,
vtable[BM_elem_index_get(e->v1)],
vtable[BM_elem_index_get(e->v2)],
e, FALSE);
- BM_elem_attrs_copy(bmold, bm, e, e2);
+ BM_elem_attrs_copy(bm_old, bm_new, e, e2);
etable[i] = e2;
BM_elem_index_set(e, i); /* set_inline */
BM_elem_index_set(e2, i); /* set_inline */
}
- bmold->elem_index_dirty &= ~BM_EDGE;
- bm->elem_index_dirty &= ~BM_EDGE;
+ bm_old->elem_index_dirty &= ~BM_EDGE;
+ bm_new->elem_index_dirty &= ~BM_EDGE;
/* safety check */
- BLI_assert(i == bmold->totedge);
+ BLI_assert(i == bm_old->totedge);
- f = BM_iter_new(&iter, bmold, BM_FACES_OF_MESH, NULL);
+ f = BM_iter_new(&iter, bm_old, BM_FACES_OF_MESH, NULL);
for (i = 0; f; f = BM_iter_step(&iter), i++) {
BM_elem_index_set(f, i); /* set_inline */
@@ -646,7 +650,7 @@
BLI_array_growitems(loops, f->len);
BLI_array_growitems(edges, f->len);
- l = BM_iter_new(&liter, bmold, 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)) {
loops[j] = l;
edges[j] = etable[BM_elem_index_get(l->e)];
@@ -660,32 +664,32 @@
v2 = vtable[BM_elem_index_get(loops[0]->v)];
}
- f2 = BM_face_create_ngon(bm, v, v2, edges, f->len, FALSE);
+ f2 = BM_face_create_ngon(bm_new, v, v2, edges, f->len, FALSE);
if (!f2)
continue;
/* use totface incase adding some faces fails */
- BM_elem_index_set(f2, (bm->totface - 1)); /* set_inline */
+ BM_elem_index_set(f2, (bm_new->totface - 1)); /* set_inline */
ftable[i] = f2;
- BM_elem_attrs_copy(bmold, bm, f, f2);
+ BM_elem_attrs_copy(bm_old, bm_new, f, f2);
copy_v3_v3(f2->no, f->no);
- l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f2);
+ l = BM_iter_new(&liter, bm_new, BM_LOOPS_OF_FACE, f2);
for (j = 0; j < f->len; j++, l = BM_iter_step(&liter)) {
- BM_elem_attrs_copy(bmold, bm, loops[j], l);
+ BM_elem_attrs_copy(bm_old, bm_new, loops[j], l);
}
- if (f == bmold->act_face) bm->act_face = f2;
+ if (f == bm_old->act_face) bm_new->act_face = f2;
}
- bmold->elem_index_dirty &= ~BM_FACE;
- bm->elem_index_dirty &= ~BM_FACE;
+ bm_old->elem_index_dirty &= ~BM_FACE;
+ bm_new->elem_index_dirty &= ~BM_FACE;
/* safety check */
- BLI_assert(i == bmold->totface);
+ BLI_assert(i == bm_old->totface);
/* copy over edit selection history */
- for (ese = bmold->selected.first; ese; ese = ese->next) {
+ for (ese = bm_old->selected.first; ese; ese = ese->next) {
void *ele = NULL;
if (ese->htype == BM_VERT)
@@ -700,7 +704,7 @@
}
if (ele)
- BM_select_history_store(bm, ele);
+ BM_select_history_store(bm_new, ele);
}
MEM_freeN(etable);
@@ -710,7 +714,7 @@
BLI_array_free(loops);
BLI_array_free(edges);
- return bm;
+ return bm_new;
}
/* ME -> BM */
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.h 2012-03-01 20:41:13 UTC (rev 44592)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.h 2012-03-01 22:17:04 UTC (rev 44593)
@@ -46,7 +46,7 @@
void BM_elem_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, const void *source, void *target);
-BMesh *BM_mesh_copy(BMesh *bmold);
+BMesh *BM_mesh_copy(BMesh *bm_old);
char BM_face_flag_from_mflag(const char mflag);
char BM_edge_flag_from_mflag(const short mflag);
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list