diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 5 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 18 |
5 files changed, 18 insertions, 22 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 9f5e1e795d7..389d987918d 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -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 diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 061fa6d13fa..05bf911474b 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -99,7 +99,7 @@ struct DispListMesh { struct TFace *tface; float *nors; // facenormals - int dontFreeVerts, dontFreeOther; + int dontFreeVerts, dontFreeNors, dontFreeOther; }; void displistmesh_free(DispListMesh *dlm); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 9c5a18c4d86..a341fe88d67 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -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) diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 36f559afdc9..3cc3a31af3e 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -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]; diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 3d962656690..144b54817fb 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -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; |