forked from bartvdbraak/blender
- 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:
parent
6dd382f966
commit
d2fb9ae533
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user