Fixed bug #7981, Crash with multires

Caused by incorrect handling of multires with orco mapping
This commit is contained in:
Nicholas Bishop 2007-12-23 03:03:54 +00:00
parent 6f730601af
commit 9efe5e5b23
2 changed files with 13 additions and 18 deletions

@ -2598,7 +2598,8 @@ float *multires_render_pin(Object *ob, Mesh *me, int *orig_lvl)
}
/* Propagate the changes to render level - fails if mesh topology changed */
void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_copy, const int orig_lvl)
void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_copy,
const int orig_lvl, CustomDataMask dataMask)
{
if(me->mr) {
if((*dm)->getNumVerts(*dm) == me->totvert &&
@ -2619,6 +2620,9 @@ void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_c
(*dm)= CDDM_copy(old);
old->release(old);
if(dataMask & CD_MASK_ORCO)
add_orco_dm(ob, *dm, NULL);
/* Restore the original verts */
me->mr->newlvl= BLI_countlist(&me->mr->levels);
multires_set_level(ob, me, 1);
@ -2646,7 +2650,7 @@ DerivedMesh *mesh_create_derived_render(Object *ob, CustomDataMask dataMask)
vert_copy= multires_render_pin(ob, me, &orig_lvl);
mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask);
multires_render_final(ob, me, &final, vert_copy, orig_lvl);
multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
return final;
}
@ -2681,7 +2685,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Object *ob,
vert_copy= multires_render_pin(ob, me, &orig_lvl);
mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0, dataMask);
multires_render_final(ob, me, &final, vert_copy, orig_lvl);
multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
return final;
}

@ -489,21 +489,12 @@ float *get_mesh_orco_verts(Object *ob)
vcos= mesh_getRefKeyCos(me, &totvert);
}
else {
MultiresLevel *lvl = NULL;
MVert *mvert = NULL;
if(me->mr) {
lvl = multires_level_n(me->mr, me->mr->pinlvl);
vcos = MEM_callocN(sizeof(*vcos)*lvl->totvert, "orco mr mesh");
mvert = me->mr->verts;
totvert = lvl->totvert;
}
else {
Mesh *tme = me->texcomesh?me->texcomesh:me;
vcos = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
mvert = tme->mvert;
totvert = MIN2(tme->totvert, me->totvert);
}
MVert *mvert = NULL;
Mesh *tme = me->texcomesh?me->texcomesh:me;
vcos = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
mvert = tme->mvert;
totvert = MIN2(tme->totvert, me->totvert);
for(a=0; a<totvert; a++, mvert++) {
vcos[a][0]= mvert->co[0];