diff options
author | Joseph Eagar <joeedh@gmail.com> | 2011-03-20 00:33:33 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2011-03-20 00:33:33 +0300 |
commit | 7ccc17b98ce8e06428cdadffee10f7ba68fafa42 (patch) | |
tree | 0be941f363a9d12f31ebc436a1a8806b6041e3e3 /source/blender | |
parent | 18494f8d33d09140c6e57e39dafb397fbba324bd (diff) |
=bmesh= fixed bunches of modifier stack bugs
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 20 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 12 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_armature.c | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_curve.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_hook.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_lattice.c | 4 |
8 files changed, 48 insertions, 35 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 05c06e86cd0..015574f4e68 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -881,7 +881,7 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm) unsigned char *wtcol; unsigned char(*wlcol)[4] = NULL; BLI_array_declare(wlcol); - int i, totface=dm->getNumTessFaces(dm), totpoly=dm->getNumFaces, totloop; + int i, totface=dm->getNumTessFaces(dm), totloop; int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX); wtcol = MEM_callocN (sizeof (unsigned char) * totface*4*4, "weightmap"); @@ -889,11 +889,12 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm) /*first add colors to the tesselation faces*/ memset(wtcol, 0x55, sizeof (unsigned char) * totface*4*4); for (i=0; i<totface; i++, mf++) { - calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4]); - calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4]); - calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4]); + /*origindex being NULL means we're operating on original mesh data*/ + calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v1] : mf->v1, &wtcol[(i*4 + 0)*4]); + calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v2] : mf->v2, &wtcol[(i*4 + 1)*4]); + calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v3] : mf->v3, &wtcol[(i*4 + 2)*4]); if (mf->v4) - calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4]); + calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v4] : mf->v4, &wtcol[(i*4 + 3)*4]); } CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, totface); @@ -904,9 +905,12 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm) for (; !dfiter->done; dfiter->step(dfiter)) { dliter = dfiter->getLoopsIter(dfiter); for (; !dliter->done; dliter->step(dliter), totloop++) { + int *oi = (int*)dliter->getVertCDData(dliter, CD_ORIGINDEX, -1); + BLI_array_growone(wlcol); - calc_weightpaint_vert_color(ob, coba, dliter->vindex, (unsigned -char *)&wlcol[totloop]); + + calc_weightpaint_vert_color(ob, coba, oi ? *oi : dliter->vindex, + (unsigned char *)&wlcol[totloop]); } } @@ -1108,9 +1112,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos CDDM_calc_normals(dm); } - if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) - add_weight_mcol_dm(ob, dm); - /* Constructive modifiers need to have an origindex * otherwise they wont have anywhere to copy the data from. * @@ -1133,6 +1134,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos orig = DM_get_face_data_layer(dm, CD_ORIGINDEX); for(i=0; i<dm->numPolyData; i++) *orig++= i; } + + if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) + add_weight_mcol_dm(ob, dm); + } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 9617218f37c..aa1d3907907 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1634,7 +1634,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob)) return dm; } -DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me)) +DerivedMesh *disabled__CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me)) { DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts), BLI_countlist(&em->edges), @@ -2025,10 +2025,10 @@ void *cddm_loopiter_getvertcddata(void *self, int type, int layer) CDDM_LoopIter *iter = self; if (layer == -1) return CustomData_get(&iter->cddm->dm.vertData, - iter->cddm->mloop[iter->head.vindex].v, + iter->cddm->mloop[iter->head.index].v, type); else return CustomData_get_n(&iter->cddm->dm.vertData, type, - iter->cddm->mloop[iter->head.vindex].v, layer); + iter->cddm->mloop[iter->head.index].v, layer); } DMLoopIter *cddmiter_get_loopiter(void *self) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 86e901345c4..c1689474c7b 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -896,7 +896,7 @@ static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, #endif } -static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, +static int ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, float (*vertexCos)[3], int useFlatSubdiv) { float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss); @@ -976,7 +976,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, hasGivenError = 1; } - return; + return 0; } ((int*)ccgSubSurf_getFaceUserData(ss, f))[1] = (index)? *index++: i; @@ -986,6 +986,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, ccgSubSurf_processSync(ss); BLI_array_free(fVerts); + return 1; } /***/ @@ -3106,7 +3107,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, ccgdm->useSubsurfUv = useSubsurfUv; totvert = ccgSubSurf_getNumVerts(ss); - ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap"); + ccgdm->vertMap = MEM_callocN(totvert * sizeof(*ccgdm->vertMap), "vertMap"); vi = ccgSubSurf_getVertIterator(ss); for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) { CCGVert *v = ccgVertIterator_getCurrent(vi); @@ -3116,7 +3117,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, ccgVertIterator_free(vi); totedge = ccgSubSurf_getNumEdges(ss); - ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap"); + ccgdm->edgeMap = MEM_callocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap"); ei = ccgSubSurf_getEdgeIterator(ss); for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { CCGEdge *e = ccgEdgeIterator_getCurrent(ei); @@ -3125,7 +3126,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, } totface = ccgSubSurf_getNumFaces(ss); - ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), "faceMap"); + ccgdm->faceMap = MEM_callocN(totface * sizeof(*ccgdm->faceMap), "faceMap"); fi = ccgSubSurf_getFaceIterator(ss); for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) { CCGFace *f = ccgFaceIterator_getCurrent(fi); @@ -3458,7 +3459,14 @@ struct DerivedMesh *subsurf_make_derived_from_derived( smd->mCache = ss = _getSubSurf(smd->mCache, levels, useAging, 0, useSimple); - ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple); + if (!ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple)) { + //ccgSubSurf_free(smd->mCache); + smd->mCache = ss = _getSubSurf(NULL, levels, + useAging, 0, useSimple); + + ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple); + + } result = getCCGDerivedMesh(smd->mCache, drawInteriorEdges, diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index b568edad636..62bd4bfd184 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -292,12 +292,12 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from) for(i=0; i<dvert_tot; i++, dvf++, dv++) { if((*dv)->dw) - MEM_freeN((*dv)->dw); + BLI_cellalloc_free((*dv)->dw); *(*dv)= *(*dvf); if((*dv)->dw) - (*dv)->dw= MEM_dupallocN((*dv)->dw); + (*dv)->dw= BLI_cellalloc_dupalloc((*dv)->dw); } MEM_freeN(dvert_array); @@ -365,7 +365,7 @@ static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) * left then just remove the deform weight */ else { - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); dvert->dw = NULL; break; } @@ -1186,7 +1186,7 @@ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGr if(dvert->dw){ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i); memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); } dvert->dw=newdw; } @@ -1280,7 +1280,7 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg) else if(ob->type==OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); if(lt->dvert) { - MEM_freeN(lt->dvert); + BLI_cellalloc_free(lt->dvert); lt->dvert= NULL; } } @@ -1320,7 +1320,7 @@ static void vgroup_delete_all(Object *ob) else if(ob->type==OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); if(lt->dvert) { - MEM_freeN(lt->dvert); + BLI_cellalloc_free(lt->dvert); lt->dvert= NULL; } } diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index fa39c197c7b..08d22f12448 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -137,13 +137,13 @@ static void deformVerts(ModifierData *md, Object *ob, } static void deformVertsEM( - ModifierData *md, Object *ob, struct EditMesh *editData, + ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData*) md; DerivedMesh *dm = derivedData; - if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts, amd->deformflag, NULL, amd->defgrp_name); @@ -152,14 +152,14 @@ static void deformVertsEM( } static void deformMatricesEM( - ModifierData *md, Object *ob, struct EditMesh *editData, + ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) { ArmatureModifierData *amd = (ArmatureModifierData*) md; DerivedMesh *dm = derivedData; - if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts, amd->deformflag, NULL, amd->defgrp_name); diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c index 84fee7b5102..3a707818d3d 100644 --- a/source/blender/modifiers/intern/MOD_curve.c +++ b/source/blender/modifiers/intern/MOD_curve.c @@ -125,12 +125,12 @@ static void deformVerts(ModifierData *md, Object *ob, } static void deformVertsEM( - ModifierData *md, Object *ob, struct EditMesh *editData, + ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = derivedData; - if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c index 2a85378f987..3f74d97c332 100644 --- a/source/blender/modifiers/intern/MOD_hook.c +++ b/source/blender/modifiers/intern/MOD_hook.c @@ -267,12 +267,12 @@ static void deformVerts(ModifierData *md, Object *ob, } static void deformVertsEM( - ModifierData *md, Object *ob, struct EditMesh *editData, + ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = derivedData; - if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c index 22427d04338..9057dfe592b 100644 --- a/source/blender/modifiers/intern/MOD_lattice.c +++ b/source/blender/modifiers/intern/MOD_lattice.c @@ -120,12 +120,12 @@ static void deformVerts(ModifierData *md, Object *ob, } static void deformVertsEM( - ModifierData *md, Object *ob, struct EditMesh *editData, + ModifierData *md, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = derivedData; - if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); |