[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