Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h1
-rw-r--r--source/blender/blenkernel/BKE_displist.h2
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c14
-rw-r--r--source/blender/blenkernel/intern/displist.c5
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c18
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;