=bmesh= odd bug, sometimes edge slide would result in invalid derivedmesh. I had to put a recalcData() call into edge slide's free function. not sure why edge slide but not other transform tools are acting up.

This commit is contained in:
Joseph Eagar 2011-04-17 04:12:53 +00:00
parent 489eaaa46d
commit 0e9ce1b40d
6 changed files with 20 additions and 18 deletions

@ -360,12 +360,12 @@ void EDBM_free_index_arrays(BMEditMesh *tm)
BMVert *EDBM_get_vert_for_index(BMEditMesh *tm, int index)
{
return tm->vert_index?tm->vert_index[index]:NULL;
return tm->vert_index && index < tm->bm->totvert ?tm->vert_index[index]:NULL;
}
BMEdge *EDBM_get_edge_for_index(BMEditMesh *tm, int index)
{
return tm->edge_index?tm->edge_index[index]:NULL;
return tm->edge_index && index < tm->bm->totedge ?tm->edge_index[index]:NULL;
}
BMFace *EDBM_get_face_for_index(BMEditMesh *tm, int index)

@ -2104,7 +2104,7 @@ static int draw_dm_creases__setDrawOptions(void *userData, int index)
{
BMEditMesh *em = userData;
BMEdge *eed = EDBM_get_edge_for_index(userData, index);
float *crease = bm_get_cd_float(&em->bm->edata, eed->head.data, CD_CREASE);
float *crease = eed ? bm_get_cd_float(&em->bm->edata, eed->head.data, CD_CREASE) : NULL;
if (!crease)
return 0;

@ -4773,6 +4773,8 @@ void freeSlideVerts(TransInfo *t)
MEM_freeN(sld);
t->customData = NULL;
recalcData(t);
}
void initEdgeSlide(TransInfo *t)

@ -201,7 +201,7 @@ static const short add_faces[24] = {
static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
{
MFace *df = CDDM_get_tessface(split, cur);
DM_copy_face_data(dm, split, i, cur, 1);
DM_copy_tessface_data(dm, split, i, cur, 1);
*df = *mf;
return df;
}
@ -925,7 +925,7 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
if(source.v4)
source.v4 = edgecut_get(vertpahash, source.v4, mindex);
DM_copy_face_data(dm,explode,i,i,1);
DM_copy_tessface_data(dm,explode,i,i,1);
*mf = source;
@ -949,6 +949,7 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
/* finalization */
CDDM_calc_edges(explode);
CDDM_tessfaces_to_faces(explode);
CDDM_calc_normals(explode);
if(psmd->psys->lattice){
@ -956,10 +957,6 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
psmd->psys->lattice= NULL;
}
dm = CDDM_copy(explode, 1); /*builds ngon faces from tess (mface) faces*/
explode->needsFree = 1;
explode->release(explode);
return explode;
}

@ -100,7 +100,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
dm = copy = CDDM_copy(dm, 0);
}
CDDM_recalc_tesselation(dm, 0);
CDDM_recalc_tesselation(dm, 1);
mf = dm->getTessFaceArray(dm);
of = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);

@ -198,7 +198,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int UNUSED(isFinalCalc))
{
int i;
DerivedMesh *result, *copy;
DerivedMesh *result, *copy, *odm = dm;
const SolidifyModifierData *smd = (SolidifyModifierData*) md;
MVert *mv, *mvert, *orig_mvert;
@ -241,8 +241,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (!CDDM_Check(dm)) {
DerivedMesh *dm2 = CDDM_copy(dm, 0);
dm->needsFree = 1;
dm->release(dm);
dm = dm2;
}
@ -679,8 +677,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
MEM_freeN(edge_vert_nos);
#endif
MEM_freeN(new_vert_arr);
MEM_freeN(new_edge_arr);
BLI_array_free(new_vert_arr);
BLI_array_free(new_edge_arr);
MEM_freeN(edge_users);
MEM_freeN(edge_order);
}
@ -688,13 +686,18 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (old_vert_arr)
MEM_freeN(old_vert_arr);
CDDM_recalc_tesselation(result, 1);
/* must recalculate normals with vgroups since they can displace unevenly [#26888] */
if(dvert) {
CDDM_calc_normals(result);
} else {
CDDM_recalc_tesselation(result, 1);
}
if (dm != odm) {
dm->needsFree = 1;
dm->release(dm);
}
return result;
}