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-07-17 04:32:19 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-07-17 04:32:19 +0400
commit928258936fa6cd47d6fcf45f66be9087a35eaaa5 (patch)
treea62df37cdbbd4527a4bb5801184bbc4c5295cf89 /source/blender/blenkernel/intern/modifiers_bmesh.c
parent479c970375baacc23912f63fa6b9e1cf20332ca5 (diff)
mirror modifier is now feature-complete, though not all features can be tested at the moment. also cleaned up some of the memory leaks.
Diffstat (limited to 'source/blender/blenkernel/intern/modifiers_bmesh.c')
-rw-r--r--source/blender/blenkernel/intern/modifiers_bmesh.c77
1 files changed, 61 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index b3ce91855b2..0abb2c4f35c 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -113,8 +113,8 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
int allocsize[4] = {512, 512, 2048, 512};
BMesh *bm, bmold; /*bmold is for storing old customdata layout*/
BMEditMesh *em = existing;
- MVert *mv;
- MEdge *me;
+ MVert *mv, *mvert;
+ MEdge *me, *medge;
DMFaceIter *dfiter;
DMLoopIter *dliter;
BMVert *v, **vtable, **verts=NULL;
@@ -150,7 +150,7 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
etable = MEM_callocN(sizeof(void**)*totedge, "edge table in BMDM_Copy");
/*do verts*/
- mv = dm->dupVertArray(dm);
+ mv = mvert = dm->dupVertArray(dm);
for (i=0; i<totvert; i++, mv++) {
v = BM_Make_Vert(bm, mv->co, NULL);
@@ -161,9 +161,10 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
CustomData_to_bmesh_block(&dm->vertData, &bm->vdata, i, &v->head.data);
vtable[i] = v;
}
+ MEM_freeN(mvert);
/*do edges*/
- me = dm->dupEdgeArray(dm);
+ me = medge = dm->dupEdgeArray(dm);
for (i=0; i<totedge; i++, me++) {
e = BM_Make_Edge(bm, vtable[me->v1], vtable[me->v2], NULL, 0);
@@ -174,6 +175,7 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
CustomData_to_bmesh_block(&dm->edgeData, &bm->edata, i, &e->head.data);
etable[i] = e;
}
+ MEM_freeN(medge);
k = 0;
dfiter = dm->newFaceIter(dm);
@@ -208,10 +210,15 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
CustomData_to_bmesh_block(&dm->polyData, &bm->pdata,
dfiter->index, &f->head.data);
}
+
+ dfiter->free(dfiter);
MEM_freeN(vtable);
MEM_freeN(etable);
+ V_FREE(verts);
+ V_FREE(edges);
+
if (!em) em = BMEdit_Create(bm);
else BMEdit_RecalcTesselation(em);
@@ -500,6 +507,7 @@ DerivedMesh *arrayModifier_applyModifierEM(ModifierData *md, Object *ob,
}
/* Mirror */
+#define VERT_NEW 1
DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
Object *ob,
@@ -507,20 +515,18 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
int initFlags,
int axis)
{
- int i;
float tolerance = mmd->tolerance;
DerivedMesh *result, *cddm;
BMEditMesh *em;
BMesh *bm;
- int numVerts, numEdges, numFaces;
- int maxVerts = dm->getNumVerts(dm);
- int maxEdges = dm->getNumEdges(dm);
- int maxFaces = dm->getNumTessFaces(dm);
- int vector_size=0, j, a, b;
+ BMOIter siter1, siter2;
+ BMOperator op;
+ BMVert *v1, *v2;
+ int vector_size=0, a, b;
bDeformGroup *def, *defb;
bDeformGroup **vector_def = NULL;
- int (*indexMap)[2];
float mtx[4][4], imtx[4][4];
+ int i, j;
cddm = CDDM_copy(dm);
em = CDDM_To_BMesh(dm, NULL);
@@ -531,10 +537,6 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
/*convienence variable*/
bm = em->bm;
- numVerts = numEdges = numFaces = 0;
- indexMap = MEM_mallocN(sizeof(*indexMap) * maxVerts, "indexmap");
- result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2, 0, 0);
-
if (mmd->flag & MOD_MIR_VGROUP) {
/* calculate the number of deformedGroups */
for(vector_size = 0, def = ob->defbase.first; def;
@@ -555,14 +557,57 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
Mat4Invert(obinv, mmd->mirror_ob->obmat);
Mat4MulMat4(mtx, ob->obmat, obinv);
Mat4Invert(imtx, mtx);
+ } else {
+ Mat4One(mtx);
+ mtx[axis][axis] = -1;
+ Mat4Invert(imtx, mtx);
}
-
+ BMO_InitOpf(bm, &op, "mirror geom=%avef mat=%m4 mergedist=%f axis=%d",
+ mtx, mmd->tolerance, axis);
+
+ BMO_Exec_Op(bm, &op);
+
+ /*handle vgroup stuff*/
+ if (mmd->flag & MOD_MIR_VGROUP) {
+ BMO_ITER(v1, &siter1, bm, &op, "newout", BM_VERT) {
+ MDeformVert *dvert = CustomData_bmesh_get(&bm->vdata, v1->head.data, CD_MDEFORMVERT);
+
+ if (dvert) {
+ for(j = 0; j < dvert[0].totweight; ++j) {
+ char tmpname[32];
+
+ if(dvert->dw[j].def_nr < 0 ||
+ dvert->dw[j].def_nr >= vector_size)
+ continue;
+
+ def = vector_def[dvert->dw[j].def_nr];
+ strcpy(tmpname, def->name);
+ vertgroup_flip_name(tmpname,0);
+
+ for(b = 0, defb = ob->defbase.first; defb;
+ defb = defb->next, b++)
+ {
+ if(!strcmp(defb->name, tmpname))
+ {
+ dvert->dw[j].def_nr = b;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ BMO_Finish_Op(bm, &op);
BMEdit_RecalcTesselation(em);
result = CDDM_from_BMEditMesh(em, NULL);
BMEdit_Free(em);
+ MEM_freeN(em);
+
+ if (vector_def) MEM_freeN(vector_def);
return result;
}