forked from bartvdbraak/blender
=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:
parent
489eaaa46d
commit
0e9ce1b40d
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user