diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-08-30 03:55:35 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-08-30 03:55:35 +0400 |
commit | 8408a72d16c2010b88242bbbbe410f0fae7aaca0 (patch) | |
tree | cfa8ee475831d1c816bb709f462e35f5a3a213ad | |
parent | 89f02849823badb44993e59347afcbdece394a94 (diff) |
cddm's recalc tesselation function works, and some memory leak fixes
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 30 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 12 | ||||
-rw-r--r-- | source/blender/bmesh/operators/utils.c | 4 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmeshutils.c | 7 |
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 */ |