[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10793] branches/bmesh/source/blender: = BMesh Branch=

Joseph Eagar joeedh at gmail.com
Mon May 28 03:34:41 CEST 2007


Revision: 10793
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bforge-svn&revision=10793
Author:   joeedh
Date:     2007-05-28 03:34:22 +0200 (Mon, 28 May 2007)

Log Message:
-----------
=BMesh Branch=

Cleaned up some memory leaks, mostly regarding to freeing
customdata and derivedmeshes in bmesh core.

Unfortunately there's now some rather odd "pointer not in
memlist" errors :/

The guardedalloc modifications I did mean the source file
and line number of which offending MEM_freeN caused the error
is printed, so hopefully fixing them shouldn't be too hard.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/source/blender/bmesh/BME_mesh.c
    branches/bmesh/source/blender/bmesh/BME_structure.c
    branches/bmesh/source/blender/src/editbmesh_interface.c
    branches/bmesh/source/blender/src/editobject.c
    branches/bmesh/source/blender/src/transform_conversions.c
    branches/bmesh/source/blender/src/transform_generics.c

Modified: branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -845,11 +845,14 @@
 {
 	EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
 
-	printf("stupid free!\n");
-	if (emdm->cdraw) {
-		emdm->cdraw->release(emdm->cdraw);
-		MEM_freeN(emdm->cdraw);
-		emdm->cdraw = NULL;
+	if (DM_release(dm)) {
+		printf("stupid free!\n");
+		if (emdm->cdraw) {
+			emdm->cdraw->release(emdm->cdraw);
+			MEM_freeN(emdm->cdraw);
+			emdm->cdraw = NULL;
+		}
+		MEM_freeN(dm);
 	}
 	emdm->recalc_cdraw = 1;
 }
@@ -2126,7 +2129,6 @@
 	em->derivedFinal->needsFree = 0;
 	em->derivedCage->needsFree = 0;	
 	em->lastDataMask = dataMask;
-	return;
 	
 	INIT_MINMAX(min, max);
 

Modified: branches/bmesh/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/mesh.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/blenkernel/intern/mesh.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -185,6 +185,8 @@
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
 	CustomData_free(&me->fdata, me->totface);
+	CustomData_free(&me->ldata, me->totloop);
+	CustomData_free(&me->pdata, me->totpoly);
 
 	if(me->mat) MEM_freeN(me->mat);
 	

Modified: branches/bmesh/source/blender/bmesh/BME_mesh.c
===================================================================
--- branches/bmesh/source/blender/bmesh/BME_mesh.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/bmesh/BME_mesh.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -47,6 +47,7 @@
 #include "BKE_bmesh.h"
 #include "BKE_global.h"
 #include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
@@ -111,10 +112,20 @@
 		BME_free_vert(bm, bv);
 		bv = nextv; 
 	}
-
+	
+	if (bm->derivedFinal) {
+		bm->derivedFinal->needsFree = 1;
+		bm->derivedFinal->release(bm->derivedFinal);
+	}
+	
+	if (bm->derivedCage && bm->derivedCage != bm->derivedFinal) {
+		bm->derivedCage->needsFree = 1;
+		bm->derivedCage->release(bm->derivedCage);
+	}
+	
 	for(loopref=bm->loops.first;loopref;loopref=loopref->next) BME_delete_loop(bm,loopref->data);
 	BLI_freelistN(&(bm->loops));
-	MEM_freeN(bm);
+	MEM_freeN(bm);	
 }
 
 /*	

Modified: branches/bmesh/source/blender/bmesh/BME_structure.c
===================================================================
--- branches/bmesh/source/blender/bmesh/BME_structure.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/bmesh/BME_structure.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -44,6 +44,7 @@
 #include "BLI_linklist.h"
 #include "BLI_ghash.h"
 
+#include "BKE_customdata.h"
 /**
  *	MISC utility functions.
  *
@@ -169,22 +170,22 @@
 */
 void BME_free_vert(BME_Mesh *bm, BME_Vert *v){
 	bm->totvert--;
-	//BME_CustomData_free_block(&bm->vdata, &v->data);
+	CustomData_em_free_block(&bm->vdata, &v->data);
 	MEM_freeN(v);
 }
 void BME_free_edge(BME_Mesh *bm, BME_Edge *e){
 	bm->totedge--;
-	//BME_CustomData_free_block(&bm->edata, &e->data);
+	CustomData_em_free_block(&bm->edata, &e->data);
 	MEM_freeN(e);
 }
 void BME_free_poly(BME_Mesh *bm, BME_Poly *f){
 	bm->totpoly--;
-	//BME_CustomData_free_block(&bm->pdata, &f->data);
+	CustomData_em_free_block(&bm->pdata, &f->data);
 	MEM_freeN(f);
 }
 void BME_delete_loop(BME_Mesh *bm, BME_Loop *l){
 	bm->totloop--;
-	//BME_CustomData_free_block(&bm->ldata, &l->data);
+	CustomData_em_free_block(&bm->ldata, &l->data);
 	MEM_freeN(l);
 }
 void BME_free_loop(BME_Mesh *bm, BME_Loop *l){

Modified: branches/bmesh/source/blender/src/editbmesh_interface.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_interface.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/src/editbmesh_interface.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -323,6 +323,7 @@
 
 void EditBME_makeEditMesh(void)
 {
+	if (G.editMesh) BME_free_mesh(G.editMesh);
 	G.editMesh = BME_FromMesh(G.obedit->data);
 }
 

Modified: branches/bmesh/source/blender/src/editobject.c
===================================================================
--- branches/bmesh/source/blender/src/editobject.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/src/editobject.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -1681,7 +1681,7 @@
 		}
 		EditBME_loadEditMesh(G.obedit->data);
 
-		if(freedata) BME_free_mesh(G.editMesh);
+		if(freedata && G.editMesh) BME_free_mesh(G.editMesh);
 			
 		if(G.f & G_FACESELECT)
 			allqueue(REDRAWIMAGE, 0);

Modified: branches/bmesh/source/blender/src/transform_conversions.c
===================================================================
--- branches/bmesh/source/blender/src/transform_conversions.c	2007-05-27 22:17:21 UTC (rev 10792)
+++ branches/bmesh/source/blender/src/transform_conversions.c	2007-05-28 01:34:22 UTC (rev 10793)
@@ -1319,149 +1319,22 @@
 #define E_VEC(a)	(vectors + (3 * (a)->tmp.l))
 #define E_NEAR(a)	(nears[((a)->tmp.l)])
 #define THRESHOLD	0.0001f
-static void editmesh_set_connectivity_distance(int total, float *vectors, EditVert **nears)
-{
-#if 0 //EDITBMESH this function is horrifically bad anyway, better rewrite it to be topologically based.
-	BME_Mesh *em = G.editMesh;
-	BME_Vert *eve;
-	BME_Edge *eed;
-	int i= 0, done= 1;
 
-	/* f2 flag is used for 'selection' */
-	/* tmp.l is offset on scratch array   */
-	for(eve= em->verts.first; eve; eve= eve->next) {
-		if(eve->h==0) {
-			eve->tmp.l = i++;
-
-			if(eve->f & SELECT) {
-				eve->f2= 2;
-				E_NEAR(eve) = eve;
-				E_VEC(eve)[0] = 0.0f;
-				E_VEC(eve)[1] = 0.0f;
-				E_VEC(eve)[2] = 0.0f;
-			}
-			else {
-				eve->f2 = 0;
-			}
-		}
-	}
-
-
-	/* Floodfill routine */
-	/*
-	At worst this is n*n of complexity where n is number of edges 
-	Best case would be n if the list is ordered perfectly.
-	Estimate is n log n in average (so not too bad)
-	*/
-	while(done) {
-		done= 0;
-		
-		for(eed= em->edges.first; eed; eed= eed->next) {
-			if(eed->h==0) {
-				EditVert *v1= eed->v1, *v2= eed->v2;
-				float *vec2 = E_VEC(v2);
-				float *vec1 = E_VEC(v1);
-
-				if (v1->f2 + v2->f2 == 4)
-					continue;
-
-				if (v1->f2) {
-					if (v2->f2) {
-						float nvec[3];
-						float len1 = VecLength(vec1);
-						float len2 = VecLength(vec2);
-						float lenn;
-						/* for v2 if not selected */
-						if (v2->f2 != 2) {
-							VecSubf(nvec, v2->co, E_NEAR(v1)->co);
-							lenn = VecLength(nvec);
-							/* 1 < n < 2 */
-							if (lenn - len1 > THRESHOLD && len2 - lenn > THRESHOLD) {
-								VECCOPY(vec2, nvec);
-								E_NEAR(v2) = E_NEAR(v1);
-								done = 1;
-							}
-							/* n < 1 < 2 */
-							else if (len2 - len1 > THRESHOLD && len1 - lenn > THRESHOLD) {
-								VECCOPY(vec2, vec1);
-								E_NEAR(v2) = E_NEAR(v1);
-								done = 1;
-							}
-						}
-						/* for v1 if not selected */
-						if (v1->f2 != 2) {
-							VecSubf(nvec, v1->co, E_NEAR(v2)->co);
-							lenn = VecLength(nvec);
-							/* 2 < n < 1 */
-							if (lenn - len2 > THRESHOLD && len1 - lenn > THRESHOLD) {
-								VECCOPY(vec1, nvec);
-								E_NEAR(v1) = E_NEAR(v2);
-								done = 1;
-							}
-							/* n < 2 < 1 */
-							else if (len1 - len2 > THRESHOLD && len2 - lenn > THRESHOLD) {
-								VECCOPY(vec1, vec2);
-								E_NEAR(v1) = E_NEAR(v2);
-								done = 1;
-							}
-						}
-					}
-					else {
-						v2->f2 = 1;
-						VecSubf(vec2, v2->co, E_NEAR(v1)->co);
-						/* 2 < 1 */
-						if (VecLength(vec1) - VecLength(vec2) > THRESHOLD) {
-							VECCOPY(vec2, vec1);
-						}
-						E_NEAR(v2) = E_NEAR(v1);
-						done = 1;
-					}
-				}
-				else if (v2->f2) {
-					v1->f2 = 1;
-					VecSubf(vec1, v1->co, E_NEAR(v2)->co);
-					/* 2 < 1 */
-					if (VecLength(vec2) - VecLength(vec1) > THRESHOLD) {
-						VECCOPY(vec1, vec2);
-					}
-					E_NEAR(v1) = E_NEAR(v2);
-					done = 1;
-				}
-			}
-		}
-	}
-#endif
-}
-
-/* loop-in-a-loop I know, but we need it! (ton) */
-static void get_face_center(float *cent, EditVert *eve)
-{
-#if 0
-	BME_Mesh *em = G.editMesh;
-	BME_Poly *efa;
-	
-	for(efa= em->faces.first; efa; efa= efa->next)
-		if(efa->flag & SELECT)
-			if(efa->v1==eve || efa->v2==eve || efa->v3==eve || efa->v4==eve)
-				break;
-				
-	if(efa) {
-		VECCOPY(cent, efa->cent);
-	}
-#endif
-}
-
 static void VertsToTransData(TransData *td, BME_Vert *eve)
 {
 	td->flag = 0;
 	td->loc = eve->co;
 	
 	VECCOPY(td->center, td->loc);
+	VECCOPY(td->iloc, td->loc);
+
 	//EDITBMESHGREP -- I think we can do this much better too.
 	//if(G.vd->around==V3D_LOCAL && (G.scene->selectmode & SCE_SELECT_FACE))
 	//	get_face_center(td->center, eve);
-	VECCOPY(td->iloc, td->loc);
 
+	//td->loc[0] = 0.0f;
+	//printf("td->loc: %p\n", td->loc);
+
 	// Setting normals
 	VECCOPY(td->axismtx[2], eve->no);
 	td->axismtx[0][0]		=
@@ -1513,136 +1386,11 @@
 		}
 }
 
-
-/* disable subsurf temporal, get mapped cos, and enable it */
-static float *get_crazy_mapped_editverts(void)
-{
-	DerivedMesh *dm;
-	ModifierData *md;
-	float *vertexcos;
-	int i;
-	
-	for( i = 0, md=G.obedit->modifiers.first; md; ++i, md=md->next ) {
-		if(md->type==eModifierType_Subsurf)
-			if(md->mode & eModifierMode_OnCage)
-				break;
-	}
-	if(md) {
-		/* this call disables subsurf and enables the underlying modifier to deform, apparently */
-		modifiers_setOnCage(G.obedit, md);
-		/* make it all over */
-		makeDerivedMesh(G.obedit, CD_MASK_BAREMESH);
-	}
-	
-	/* now get the cage */
-	dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
-
-	vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map");
-	dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
-	
-	dm->release(dm);
-	
-	if(md) {
-		/* set back the flag, no new cage needs to be built, transform does it */
-		modifiers_setOnCage(G.obedit, md);
-	}
-	
-	return vertexcos;
-}
-
-#define TAN_MAKE_VEC(a, b, c)	a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2])
-static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3)
-{
-	float vecu[3], vecv[3];
-	float q1[4], q2[4];
-	
-	TAN_MAKE_VEC(vecu, v1, v2);
-	TAN_MAKE_VEC(vecv, v1, v3);
-	triatoquat(v1, vecu, vecv, q1);
-	
-	TAN_MAKE_VEC(vecu, def1, def2);
-	TAN_MAKE_VEC(vecv, def1, def3);
-	triatoquat(def1, vecu, vecv, q2);
-	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list