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:
authorJoseph Eagar <joeedh@gmail.com>2009-09-06 10:47:59 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-09-06 10:47:59 +0400
commit287cc0fad81913540644c2fc608a9cd9a2f0e670 (patch)
treed28aa89a086538713ef4bca529e0af2ccf098fc6 /source/blender
parent67c64cf82b8b8f8def26a3412437f8d63e13adf6 (diff)
miscelleneous bug fixes and mem leak fixes
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_cdderivedmesh.h3
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c5
-rw-r--r--source/blender/blenkernel/intern/mesh.c2
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c16
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c18
-rw-r--r--source/blender/bmesh/operators/mesh_conv.c16
6 files changed, 48 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h
index 36db9553c59..7bd9f6b7b9b 100644
--- a/source/blender/blenkernel/BKE_cdderivedmesh.h
+++ b/source/blender/blenkernel/BKE_cdderivedmesh.h
@@ -47,6 +47,9 @@ struct Object;
struct DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces,
int numLoops, int numPolys);
+/*tests if a given DerivedMesh is a CDDM*/
+int CDDM_Check(struct DerivedMesh *dm);
+
/* creates a CDDerivedMesh from the given Mesh, this will reference the
original data in Mesh, but it is safe to apply vertex coordinates or
calculate normals as those functions will automtically create new
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 14f03522017..6709868e64d 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -837,6 +837,11 @@ static void cdDM_release(DerivedMesh *dm)
MEM_freeN(cddm);
}
+int CDDM_Check(DerivedMesh *dm)
+{
+ return dm && dm->getMinMax == cdDM_getMinMax;
+}
+
/**************** CDDM interface functions ****************/
static CDDerivedMesh *cdDM_create(const char *desc)
{
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3e4e85a2500..4448b690af9 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -84,6 +84,8 @@ void BKE_mesh_end_editmesh(Mesh *me, EditMesh *em)
BM_Free_Mesh(me->edit_btmesh->bm);
me->edit_btmesh->bm = editmesh_to_bmesh(em);
BMEdit_RecalcTesselation(me->edit_btmesh);
+ free_editMesh(em);
+ MEM_freeN(em);
}
static void mesh_ensure_tesselation_customdata(Mesh *me)
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3cdc296fe2f..e93066aafac 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3270,7 +3270,21 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
int useRenderParams, float (*vertCos)[3],
int isFinalCalc, int editMode)
{
- return subsurf_make_derived_from_derived_with_multires(dm, smd, NULL, useRenderParams, vertCos, isFinalCalc, editMode);
+ DerivedMesh *cddm = NULL, *result;
+
+ if (!CDDM_Check(dm)) {
+ cddm = CDDM_copy(dm);
+ dm = cddm;
+ }
+
+ result = subsurf_make_derived_from_derived_with_multires(dm, smd, NULL, useRenderParams, vertCos, isFinalCalc, editMode);
+
+ if (cddm) {
+ cddm->needsFree = 1;
+ cddm->release(cddm);
+ }
+
+ return result;
}
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 414beb3d19a..6a9b97f9380 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -170,16 +170,18 @@ int BLI_ghash_size(GHash *gh) {
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp) {
int i;
- for (i=0; i<gh->nbuckets; i++) {
- Entry *e;
-
- for (e= gh->buckets[i]; e; ) {
- Entry *n= e->next;
+ if (keyfreefp || valfreefp) {
+ for (i=0; i<gh->nbuckets; i++) {
+ Entry *e;
- if (keyfreefp) keyfreefp(e->key);
- if (valfreefp) valfreefp(e->val);
+ for (e= gh->buckets[i]; e; ) {
+ Entry *n= e->next;
+
+ if (keyfreefp) keyfreefp(e->key);
+ if (valfreefp) valfreefp(e->val);
- e= n;
+ e= n;
+ }
}
}
diff --git a/source/blender/bmesh/operators/mesh_conv.c b/source/blender/bmesh/operators/mesh_conv.c
index ac92beb1327..58e8be9f176 100644
--- a/source/blender/bmesh/operators/mesh_conv.c
+++ b/source/blender/bmesh/operators/mesh_conv.c
@@ -45,7 +45,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
MLoop *ml;
MPoly *mpoly;
BMVert *v, **vt=NULL;
- BMEdge *e, **fedges=NULL, **et;
+ BMEdge *e, **fedges=NULL, **et = NULL;
V_DECLARE(fedges);
BMFace *f;
int i, j, li, allocsize[4] = {512, 512, 2048, 512};
@@ -85,7 +85,10 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
CustomData_to_bmesh_block(&me->vdata, &bm->vdata, i, &v->head.data);
}
- if (!me->totedge) return;
+ if (!me->totedge) {
+ MEM_freeN(vt);
+ return;
+ }
et = MEM_mallocN(sizeof(void**)*me->totedge, "mesh to bmesh etable");
@@ -107,7 +110,11 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
if (e->head.flag & BM_SELECT) BM_Select(bm, e, 1);
}
- if (!me->totpoly) return;
+ if (!me->totpoly) {
+ MEM_freeN(vt);
+ MEM_freeN(et);
+ return;
+ }
mpoly = me->mpoly;
li = 0;
@@ -158,6 +165,9 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
}
V_FREE(fedges);
+
+ MEM_freeN(vt);
+ MEM_freeN(et);
}