Fix for bug #5778:

Crash entering faceselect mode in shaded mode.

The cause here is the new system that only preserves data through the
modifier stack as needed. The DerivedMesh and shaded colors could get
freed while still being used elsewhere.
This commit is contained in:
2007-01-22 03:57:41 +00:00
parent 9692614bd8
commit 9ba6bd556f
2 changed files with 16 additions and 11 deletions

View File

@@ -1955,7 +1955,7 @@ static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmoot
return 1;
}
static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, int dt, int flag)
static void draw_mesh_fancy(Base *base, int dt, int flag)
{
Object *ob= base->object;
Mesh *me = ob->data;
@@ -1964,6 +1964,10 @@ static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, in
int draw_wire = ob->dtx&OB_DRAWWIRE;
int totvert, totedge, totface;
DispList *dl;
DerivedMesh *dm= mesh_get_derived_final(ob, get_viewedit_datamask());
if(!dm)
return;
#ifdef WITH_VERSE
if(me->vnode) {
@@ -2068,8 +2072,12 @@ static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, in
if(do_draw) {
dl = ob->disp.first;
if (!dl || !dl->col1) {
/* release and reload derivedmesh because it might be freed in
shadeDispList due to a different datamask */
dm->release(dm);
shadeDispList(base);
dl = find_displist(&ob->disp, DL_VERTCOL);
dm= mesh_get_derived_final(ob, get_viewedit_datamask());
}
if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire) {
@@ -2132,6 +2140,8 @@ static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, in
bglPolygonOffset(0.0);
}
}
dm->release(dm);
}
/* returns 1 if nothing was drawn, for detecting to draw an object center */
@@ -2170,18 +2180,10 @@ static int draw_mesh_object(Base *base, int dt, int flag)
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) {
DerivedMesh *baseDM
= mesh_get_derived_deform(ob, get_viewedit_datamask());
DerivedMesh *realDM
= mesh_get_derived_final(ob, get_viewedit_datamask());
if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0);
if(baseDM && realDM) draw_mesh_fancy(base, baseDM, realDM, dt, flag);
draw_mesh_fancy(base, dt, flag);
if(me->totvert==0) retval= 1;
baseDM->release(baseDM);
realDM->release(realDM);
}
}