- added dontFreeNors flag to DispListMesh as well

- changed mesh_get_derived_render to always return a DerivedMesh (even if
   no subsurf)
 - changed init_render_mesh to always get the mesh data through a
   DerivedMesh
This commit is contained in:
Daniel Dunbar 2005-07-16 21:16:05 +00:00
parent 6dd382f966
commit d2fb9ae533
5 changed files with 18 additions and 22 deletions

@ -133,6 +133,7 @@ struct DerivedMesh {
DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm);
DerivedMesh *mesh_get_derived(struct Object *ob);
DerivedMesh *mesh_get_derived_final(struct Object *ob);
DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r);
/* IMPORTANT: The functions below do not return "true" DerivedMesh

@ -99,7 +99,7 @@ struct DispListMesh {
struct TFace *tface;
float *nors; // facenormals
int dontFreeVerts, dontFreeOther;
int dontFreeVerts, dontFreeNors, dontFreeOther;
};
void displistmesh_free(DispListMesh *dlm);

@ -82,7 +82,7 @@ static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm)
dlm->tface = me->tface;
dlm->mcol = me->mcol;
dlm->nors = mdm->nors;
dlm->dontFreeVerts = dlm->dontFreeOther = 1;
dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 1;
if (mdm->extverts) {
int i;
@ -96,6 +96,8 @@ static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm)
}
displistmesh_calc_normals(dlm);
dlm->dontFreeVerts = 0;
}
return dlm;
@ -957,9 +959,15 @@ DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree)
} else {
return subsurf_make_derived_from_mesh(me, me->subdivr);
}
}
} else {
DispList *dl;
DispList *meDL;
return NULL;
*needsFree = 1;
dl = find_displist(&ob->disp, DL_VERTS);
meDL = me->disp.first;
return getMeshDerivedMesh(ob, dl?dl->verts:NULL, meDL?meDL->nors:NULL);
}
}
DerivedMesh *mesh_get_base_derived(Object *ob)

@ -112,12 +112,12 @@ void displistmesh_free(DispListMesh *dlm)
{
// also check on mvert and mface, can be NULL after decimator (ton)
if (!dlm->dontFreeVerts && dlm->mvert) MEM_freeN(dlm->mvert);
if (!dlm->dontFreeNors && dlm->nors) MEM_freeN(dlm->nors);
if (!dlm->dontFreeOther) {
if (dlm->medge) MEM_freeN(dlm->medge);
if (dlm->mface) MEM_freeN(dlm->mface);
if (dlm->mcol) MEM_freeN(dlm->mcol);
if (dlm->tface) MEM_freeN(dlm->tface);
if (dlm->nors) MEM_freeN(dlm->nors);
}
MEM_freeN(dlm);
}
@ -142,11 +142,12 @@ void displistmesh_calc_normals(DispListMesh *dlm)
float (*tnorms)[3]= MEM_callocN(dlm->totvert*sizeof(*tnorms), "tnorms");
int i;
if (dlm->nors) {
if (!dlm->dontFreeNors && dlm->nors) {
MEM_freeN(dlm->nors);
}
dlm->nors= MEM_mallocN(sizeof(*dlm->nors)*3*dlm->totface, "meshnormals");
dlm->dontFreeNors= 0;
for (i=0; i<dlm->totface; i++) {
MFace *mf= &mfaces[i];

@ -1344,7 +1344,7 @@ static void init_render_mesh(Object *ob)
make_orco_mesh(me);
}
if ((me->flag&ME_SUBSURF) && me->subdivr) {
{
int needsFree;
DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
dlm = dm->convertToDispListMesh(dm);
@ -1355,21 +1355,7 @@ static void init_render_mesh(Object *ob)
mvert= dlm->mvert;
totvert= dlm->totvert;
ms= NULL; // no stick in displistmesh
} else {
DispList *dl;
dlm= NULL;
mvert= me->mvert;
totvert= me->totvert;
dl= find_displist(&ob->disp, DL_VERTS);
if(dl) {
extverts= dl->verts;
do_puno= 1;
}
ms= me->msticky;
ms = (totvert==me->totvert)?me->msticky:NULL;
}
orco= me->orco;