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-08-30 03:55:35 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-08-30 03:55:35 +0400
commit8408a72d16c2010b88242bbbbe410f0fae7aaca0 (patch)
treecfa8ee475831d1c816bb709f462e35f5a3a213ad /source/blender
parent89f02849823badb44993e59347afcbdece394a94 (diff)
cddm's recalc tesselation function works, and some memory leak fixes
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c30
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c12
-rw-r--r--source/blender/bmesh/operators/utils.c4
-rw-r--r--source/blender/editors/mesh/bmeshutils.c7
4 files changed, 36 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index b284bb80184..707b350111d 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -887,11 +887,11 @@ static void cdDM_recalcTesselation(DerivedMesh *dm)
for (j=0; j<mp->totloop; j++, ml++) {
v = BLI_addfillvert(cddm->mvert[ml->v].co);
if (polyorigIndex)
- v->f1 = polyorigIndex[i];
+ v->tmp.l = polyorigIndex[i];
else
- v->f1 = i;
+ v->tmp.l = i;
- v->f2 = mp->loopstart + j;
+ v->keyindex = mp->loopstart + j;
if (lastv)
BLI_addfilledge(lastv, v);
@@ -900,7 +900,7 @@ static void cdDM_recalcTesselation(DerivedMesh *dm)
firstv = v;
lastv = v;
}
- BLI_addfilledge(firstv, v);
+ BLI_addfilledge(lastv, firstv);
BLI_edgefill(0, 0);
for (f=fillfacebase.first; f; f=f->next) {
@@ -909,10 +909,10 @@ static void cdDM_recalcTesselation(DerivedMesh *dm)
/*these are loop indices, they'll be transformed
into vert indices later.*/
- mf[k].v1 = f->v1->f2;
- mf[k].v2 = f->v2->f2;
- mf[k].v3 = f->v3->f2;
- origIndex[k] = f->v1->f1;
+ mf[k].v1 = f->v1->keyindex;
+ mf[k].v2 = f->v2->keyindex;
+ mf[k].v3 = f->v3->keyindex;
+ origIndex[k] = f->v1->tmp.l;
k++;
}
@@ -935,6 +935,17 @@ static void cdDM_recalcTesselation(DerivedMesh *dm)
lindex[1] = mf->v2;
lindex[2] = mf->v3;
+ /*ensure winding is correct*/
+ if (mf->v1 > mf->v2) {
+ SWAP(int, mf->v1, mf->v2);
+ }
+ if (mf->v2 > mf->v3) {
+ SWAP(int, mf->v2, mf->v3);
+ }
+ if (mf->v1 > mf->v2) {
+ SWAP(int, mf->v1, mf->v2);
+ }
+
/*transform loop indices to vert indices*/
mf->v1 = cddm->mloop[mf->v1].v;
mf->v2 = cddm->mloop[mf->v2].v;
@@ -1067,6 +1078,8 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
mesh->totvert);
CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
mesh->totedge);
+ //CustomData_merge(&mesh->fdata, &dm->faceData, mask, alloctype,
+ // mesh->totface);
CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
mesh->totloop);
CustomData_merge(&mesh->pdata, &dm->polyData, mask, alloctype,
@@ -1076,6 +1089,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+ //cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX);
for(i = 0; i < mesh->totvert; ++i, ++index)
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 628d55d8439..e182fe4bc51 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1029,8 +1029,11 @@ static void ss_sync_from_derivedmesh(CSubSurf *ss, DerivedMesh *dm,
((int*)CCS_getFaceUserData(ss, f))[1] = *index;
}
+ fiter->free(fiter);
CCS_processSync(ss);
+
+ V_FREE(fVerts);
}
/***/
@@ -2612,12 +2615,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
int gridInternalEdges;
float *w = NULL, one = 1.0f;
WeightTable wtable = {0};
- V_DECLARE(w);
/* MVert *mvert = NULL; - as yet unused */
MCol *mcol;
MEdge *medge = NULL;
MFace *mface = NULL;
- FaceVertWeight *qweight, *tweight;
DM_from_template(&cgdm->dm, dm, CCS_getNumFinalVerts(ss),
CCS_getNumFinalEdges(ss),
@@ -2724,8 +2725,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
- calc_ss_weights(gridFaces, &qweight, &tweight);
-
vertNum = 0;
edgeNum = 0;
faceNum = 0;
@@ -2931,6 +2930,11 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
cgdm->dm.numFaceData = faceNum;
cgdm->dm.numLoopData = loopindex2;
cgdm->dm.numPolyData = faceNum;
+
+ V_FREE(vertidx);
+ V_FREE(loopidx);
+ free_ss_weights(&wtable);
+
#if 0
for(index = 0; index < totface; ++index) {
CCFace *f = cgdm->faceMap[index].face;
diff --git a/source/blender/bmesh/operators/utils.c b/source/blender/bmesh/operators/utils.c
index 8517c4e155e..e56fca962ef 100644
--- a/source/blender/bmesh/operators/utils.c
+++ b/source/blender/bmesh/operators/utils.c
@@ -891,11 +891,11 @@ void bmesh_similarverts_exec(BMesh *bm, BMOperator *op)
switch( type ) {
case SIMVERT_FACE:
/* calling BM_Vert_FaceCount every time is time consumming, so call it only once per vertex */
- v_ext[i].num_faces = BM_Vert_FaceCount(v);
+ v_ext[i].num_faces = BM_Vert_FaceCount(v);
break;
case SIMVERT_VGROUP:
- if( CustomData_has_layer(&(bm->vdata),CD_MDEFORMVERT) ) {
+ if( CustomData_has_layer(&(bm->vdata), CD_MDEFORMVERT) ) {
v_ext[i].dvert = CustomData_bmesh_get(&bm->vdata, v_ext[i].v->head.data, CD_MDEFORMVERT);
} else v_ext[i].dvert = NULL;
break;
diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c
index 13659ea3b77..d4ce279daac 100644
--- a/source/blender/editors/mesh/bmeshutils.c
+++ b/source/blender/editors/mesh/bmeshutils.c
@@ -541,11 +541,11 @@ static void *editbtMesh_to_undoMesh(void *emv)
static void undoMesh_to_editbtMesh(void *umv, void *emv)
{
- BMEditMesh *bm1 = umv, *bm2 = emv;
+ BMEditMesh *em1 = umv, *em2 = emv;
- BMEdit_Free(bm2);
+ BMEdit_Free(em2);
- *bm2 = *BMEdit_Copy(bm1);
+ *em2 = *BMEdit_Copy(em1);
}
@@ -554,6 +554,7 @@ static void free_undo(void *umv)
BMEditMesh *em = umv;
BMEdit_Free(em);
+ MEM_freeN(em);
}
/* and this is all the undo system needs to know */