[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43909] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_newcore.c: fix for memory leak in bmesh_jekv(); --- dissolve would not free deform weights in some cases.
Campbell Barton
ideasman42 at gmail.com
Sun Feb 5 15:07:36 CET 2012
Revision: 43909
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43909
Author: campbellbarton
Date: 2012-02-05 14:07:25 +0000 (Sun, 05 Feb 2012)
Log Message:
-----------
fix for memory leak in bmesh_jekv(); --- dissolve would not free deform weights in some cases.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c 2012-02-05 13:43:58 UTC (rev 43908)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c 2012-02-05 14:07:25 UTC (rev 43909)
@@ -442,8 +442,54 @@
return err;
}
-static void bmesh_kill_loop(BMesh *bm, BMLoop *l)
+/* low level function, only free's,
+ * does not change adjust surrounding geometry */
+static void bmesh_kill_only_vert(BMesh *bm, BMVert *v)
{
+ bm->totvert--;
+ bm->elem_index_dirty |= BM_VERT;
+
+ BM_remove_selection(bm, v);
+ if (v->head.data)
+ CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
+
+ BLI_mempool_free(bm->toolflagpool, v->head.flags);
+ BLI_mempool_free(bm->vpool, v);
+}
+
+static void bmesh_kill_only_edge(BMesh *bm, BMEdge *e)
+{
+ bm->totedge--;
+ bm->elem_index_dirty |= BM_EDGE;
+
+ BM_remove_selection(bm, e);
+
+ if (e->head.data)
+ CustomData_bmesh_free_block(&bm->edata, &e->head.data);
+
+ BLI_mempool_free(bm->toolflagpool, e->head.flags);
+ BLI_mempool_free(bm->epool, e);
+}
+
+static void bmesh_kill_only_face(BMesh *bm, BMFace *f)
+{
+ if (bm->act_face == f)
+ bm->act_face = NULL;
+
+ bm->totface--;
+ bm->elem_index_dirty |= BM_FACE;
+
+ BM_remove_selection(bm, f);
+
+ if (f->head.data)
+ CustomData_bmesh_free_block(&bm->pdata, &f->head.data);
+
+ BLI_mempool_free(bm->toolflagpool, f->head.flags);
+ BLI_mempool_free(bm->fpool, f);
+}
+
+static void bmesh_kill_only_loop(BMesh *bm, BMLoop *l)
+{
bm->totloop--;
if (l->head.data)
CustomData_bmesh_free_block(&bm->ldata, &l->head.data);
@@ -508,26 +554,15 @@
lnext = l->next;
bmesh_radial_remove_loop(l, l->e);
- bmesh_kill_loop(bm, l);
+ bmesh_kill_only_loop(bm, l);
l = lnext;
} while (l != ls->first);
BLI_mempool_free(bm->looplistpool, ls);
}
-
- if (bm->act_face == f)
- bm->act_face = NULL;
-
- bm->totface--;
- bm->elem_index_dirty |= BM_FACE;
- BM_remove_selection(bm, f);
- if (f->head.data)
- CustomData_bmesh_free_block(&bm->pdata, &f->head.data);
- BLI_mempool_free(bm->toolflagpool, f->head.flags);
-
- BLI_mempool_free(bm->fpool, f);
+ bmesh_kill_only_face(bm, f);
}
void BM_Kill_Edge(BMesh *bm, BMEdge *e)
@@ -554,14 +589,7 @@
} while (l != startl);
}
- bm->totedge--;
- bm->elem_index_dirty |= BM_EDGE;
- BM_remove_selection(bm, e);
- if (e->head.data)
- CustomData_bmesh_free_block(&bm->edata, &e->head.data);
-
- BLI_mempool_free(bm->toolflagpool, e->head.flags);
- BLI_mempool_free(bm->epool, e);
+ bmesh_kill_only_edge(bm, e);
}
void BM_Kill_Vert(BMesh *bm, BMVert *v)
@@ -571,20 +599,13 @@
e = v->e;
while (v->e) {
- nexte=bmesh_disk_nextedge(e, v);
+ nexte = bmesh_disk_nextedge(e, v);
BM_Kill_Edge(bm, e);
e = nexte;
}
}
- bm->totvert--;
- bm->elem_index_dirty |= BM_VERT;
- BM_remove_selection(bm, v);
- if (v->head.data)
- CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
-
- BLI_mempool_free(bm->toolflagpool, v->head.flags);
- BLI_mempool_free(bm->vpool, v);
+ bmesh_kill_only_vert(bm, v);
}
/********** private disk and radial cycle functions ************/
@@ -1412,17 +1433,10 @@
}
/*deallocate edge*/
- BM_remove_selection(bm, ke);
- BLI_mempool_free(bm->toolflagpool, ke->head.flags);
- BLI_mempool_free(bm->epool, ke);
- bm->totedge--;
+ bmesh_kill_only_edge(bm, ke);
+
/*deallocate vertex*/
- BM_remove_selection(bm, kv);
- BLI_mempool_free(bm->toolflagpool, kv->head.flags);
- BLI_mempool_free(bm->vpool, kv);
- bm->totvert--;
- /* account for both above */
- bm->elem_index_dirty |= BM_VERT | BM_EDGE;
+ bmesh_kill_only_vert(bm, kv);
/*Validate disk cycle lengths of ov,tv are unchanged*/
edok = bmesh_disk_validate(valence1, ov->e, ov);
More information about the Bf-blender-cvs
mailing list