diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 21 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_subsurf.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 259 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 103 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 20 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_mesh_types.h | 1 | ||||
-rw-r--r-- | source/blender/python/api2_2x/NMesh.c | 1 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 20 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 5 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 18 | ||||
-rw-r--r-- | source/blender/src/editmesh_mods.c | 2 | ||||
-rw-r--r-- | source/blender/src/transform_manipulator.c | 2 |
15 files changed, 185 insertions, 288 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 8b038ed8a5d..55bb92ce8a2 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -146,30 +146,19 @@ struct DerivedMesh { void (*release)(DerivedMesh *dm); }; - /* Internal functions, just temporarily exposed */ + /* Internal function, just temporarily exposed */ DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm); -DerivedMesh *derivedmesh_from_mesh(struct Object *ob, struct MVert *deformedVerts); -DerivedMesh *mesh_get_derived(struct Object *ob); DerivedMesh *mesh_get_derived_final(struct Object *ob, int *needsFree_r); -DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r); DerivedMesh *mesh_get_derived_deform(struct Object *ob, int *needsFree_r); +DerivedMesh *mesh_create_derived_render(struct Object *ob); DerivedMesh *mesh_create_derived_no_deform(struct Mesh *me, float (*vertCos)[3]); DerivedMesh *mesh_create_derived_no_deform_render(struct Mesh *me, float (*vertCos)[3]); - /* IMPORTANT: The functions below do not return "true" DerivedMesh - * objects, rather they are just proxies for the mesh or editmesh - * objects and are used to keep the drawing code consistent. They - * should not be used as general purpose objects (access the Mesh - * or EditMesh directly). - */ - - /* Utility function, just chooses appropriate DerivedMesh based - * on mesh flags. Release result if *needsFree_r is true. - */ -DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r); -DerivedMesh *mesh_get_base_derived(struct Object *ob); +DerivedMesh *editmesh_get_derived(void); +DerivedMesh *editmesh_get_derived_proxy(void); +DerivedMesh *editmesh_get_derived_cage(int *needsFree_r); #endif diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 44584ec4053..eb66397fb37 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -42,7 +42,6 @@ #define DL_INDEX3 4 #define DL_INDEX4 5 #define DL_VERTCOL 6 -#define DL_NORS 8 /* dl->flag */ #define DL_CYCL_U 1 diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 4ec8c88bbf4..3ae15d346bb 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -37,7 +37,7 @@ struct DerivedMesh; struct EditMesh; struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, short type, struct DerivedMesh *oldDerived); -struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, struct Object *deformedVertsOb, float (*vertCos)[3]); +struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, float (*vertCos)[3]); void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index b72b0933813..03171b1019c 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -42,6 +42,7 @@ #include "DNA_object_types.h" #include "DNA_object_force.h" +#include "BLI_arithb.h" #include "BLI_blenlib.h" #include "BLI_editVert.h" @@ -54,6 +55,7 @@ #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_subsurf.h" +#include "BKE_deform.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -448,7 +450,31 @@ static void meshDM_release(DerivedMesh *dm) MEM_freeN(mdm); } -static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVerts, float *nors, float (*vertCos)[3]) +static float *mesh_build_faceNormals(Object *meshOb) +{ + Mesh *me = meshOb->data; + float *nors = MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals"); + float *n1 = nors; + int i; + + for (i=0; i<me->totface; i++,n1+=3) { + MFace *mf = &me->mface[i]; + + if (mf->v3) { + MVert *ve1= &me->mvert[mf->v1]; + MVert *ve2= &me->mvert[mf->v2]; + MVert *ve3= &me->mvert[mf->v3]; + MVert *ve4= &me->mvert[mf->v4]; + + if(mf->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1); + else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1); + } + } + + return nors; +} + +static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]) { MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "mdm"); @@ -476,26 +502,24 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVert mdm->ob = ob; mdm->me = me; - mdm->nors = nors; + mdm->verts = me->mvert; + mdm->nors = NULL; mdm->freeNors = 0; if (vertCos) { int i; - deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedVerts"); + mdm->verts = MEM_mallocN(sizeof(*mdm->verts)*me->totvert, "deformedVerts"); for (i=0; i<me->totvert; i++) { - deformedVerts[i].co[0] = vertCos[i][0]; - deformedVerts[i].co[1] = vertCos[i][1]; - deformedVerts[i].co[2] = vertCos[i][2]; + mdm->verts[i].co[0] = vertCos[i][0]; + mdm->verts[i].co[1] = vertCos[i][1]; + mdm->verts[i].co[2] = vertCos[i][2]; } - } - - if (deformedVerts) { - mdm->verts = deformedVerts; mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors); mdm->freeNors = 1; } else { - mdm->verts = me->mvert; + mdm->nors = mesh_build_faceNormals(ob); + mdm->freeNors = 1; } return (DerivedMesh*) mdm; @@ -984,160 +1008,179 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm) return (DerivedMesh*) ssdm; } -/// +/***/ -static void build_mesh_data(Object *ob, int inEditMode) +static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3], DerivedMesh **deform_r, DerivedMesh **final_r, int useRenderParms, int useDeform) { - Mesh *me = ob->data; + float (*deformedVerts)[3]; - if ((me->flag&ME_SUBSURF) && me->subdiv) { - if(inEditMode && !G.editMesh->derived) { - makeDispListMesh(ob); - } else if (!inEditMode && !me->derived) { - makeDispListMesh(ob); + if (deform_r) *deform_r = NULL; + *final_r = NULL; + + if (useDeform && ob) { + MVert *deformedMVerts; + + mesh_modifier(ob, &deformedMVerts); + if (deformedMVerts) { + int i; + + deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedverts"); + + for (i=0; i<me->totvert; i++) { + VECCOPY(deformedVerts[i], deformedMVerts[i].co); + } + + MEM_freeN(deformedMVerts); + } else { + deformedVerts = NULL; } + + if (deform_r) *deform_r = getMeshDerivedMesh(me, ob, deformedVerts); + } else { + deformedVerts = inputVertexCos; + } + + if ((me->flag&ME_SUBSURF) && me->subdiv) { + *final_r = subsurf_make_derived_from_mesh(me, useRenderParms?me->subdivr:me->subdiv, deformedVerts); + } else { + *final_r = getMeshDerivedMesh(me, ob, deformedVerts); } - if(!me->disp.first || !((DispList*) me->disp.first)->nors) { - addnormalsDispList(ob, &me->disp); + if (deformedVerts && deformedVerts!=inputVertexCos) { + MEM_freeN(deformedVerts); } } -DerivedMesh *mesh_get_derived(Object *ob) +/***/ + +DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r) { - Mesh *me= ob->data; + Mesh *me = ob->data; - if ((me->flag&ME_SUBSURF) && me->subdiv) { - build_mesh_data(ob, G.obedit && me==G.obedit->data); + if (!me->derived) { + makeDispListMesh(ob); + } - if(G.obedit && me==G.obedit->data) { - return G.editMesh->derived; - } else { - return me->derived; - } + *needsFree_r = 0; + return me->derived; +} + +DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r) +{ + if (!ob->derivedDeform) { + makeDispListMesh(ob); } - return NULL; + *needsFree_r = 0; + return ob->derivedDeform; } -DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r) +DerivedMesh *mesh_create_derived_render(Object *ob) { - Mesh *me= ob->data; + DerivedMesh *final; - build_mesh_data(ob, G.obedit && me==G.obedit->data); + mesh_calc_modifiers(ob->data, ob, NULL, NULL, &final, 1, 1); - if ((me->flag&ME_SUBSURF) && me->subdiv) { - *needsFree_r = 0; - - if(G.obedit && me==G.obedit->data) { - return G.editMesh->derived; - } else { - return me->derived; - } - } else { - return mesh_get_derived_deform(ob, needsFree_r); - } + return final; } -DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r) +DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3]) { - if (ob->derivedDeform) { - *needsFree_r = 0; - return ob->derivedDeform; - } else { - Mesh *me = ob->data; - DispList *meDL; - - build_mesh_data(ob, G.obedit && me==G.obedit->data); + DerivedMesh *final; - *needsFree_r = 1; - meDL = me->disp.first; + mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 0, 0); - return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL); - } + return final; } -DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree_r) +DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3]) { - Mesh *me= ob->data; + DerivedMesh *final; - if ((me->flag&ME_SUBSURF) && me->subdivr) { - if (me->subdiv==me->subdivr) { - *needsFree_r = 0; + mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 1, 0); - // Don't reuse cache in editmode, we need to guarantee - // index order of result and the incremental syncing messes - // with this (could be fixed). - zr - if(!(G.obedit && me==G.obedit->data)) { - return me->derived; - } - } + return final; +} - *needsFree_r = 1; - if(G.obedit && me==G.obedit->data) { - return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->subsurftype, NULL); - } else { - return subsurf_make_derived_from_mesh(ob->data, me->subdivr, ob, NULL); - } - } else { - return mesh_get_derived_deform(ob, needsFree_r); - } +/***/ + +DerivedMesh *editmesh_get_derived_proxy(void) +{ + return getEditMeshDerivedMesh(G.editMesh); } -DerivedMesh *mesh_get_base_derived(Object *ob) +DerivedMesh *editmesh_get_derived(void) { - Mesh *me= ob->data; + Mesh *me= G.obedit->data; - build_mesh_data(ob, G.obedit && me==G.obedit->data); + if ((me->flag&ME_SUBSURF) && me->subdiv) { + if (!G.editMesh->derived) { + makeDispListMesh(G.obedit); + } - if (G.obedit && me==G.obedit->data) { - return getEditMeshDerivedMesh(G.editMesh); - } else { - DispList *meDL = me->disp.first; + return G.editMesh->derived; + } - return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL); - } + return NULL; } -DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r) +DerivedMesh *editmesh_get_derived_cage(int *needsFree_r) { - Mesh *me= ob->data; + Mesh *me= G.obedit->data; DerivedMesh *dm = NULL; *needsFree_r = 0; if (me->flag&ME_OPT_EDGES) { - dm = mesh_get_derived(ob); + dm = editmesh_get_derived(); } if (!dm) { *needsFree_r = 1; - dm = mesh_get_base_derived(ob); + dm = editmesh_get_derived_proxy(); } return dm; } -DerivedMesh *derivedmesh_from_mesh(Object *ob, MVert *deformedVerts) +/***/ + +void makeDispListMesh(Object *ob) { - Mesh *me = ob->data; + MVert *deformedMVerts = NULL; + float min[3], max[3]; + Mesh *me; - return getMeshDerivedMesh(ob->data, ob, deformedVerts, NULL, NULL); -} + if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed + me= ob->data; -DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3]) -{ - if ((me->flag&ME_SUBSURF) && me->subdiv) { - return subsurf_make_derived_from_mesh(me, me->subdiv, NULL, vertCos); - } else { - return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos); + /* also serves as signal to remake texspace */ + if (me->bb) { + MEM_freeN(me->bb); + me->bb = NULL; } -} -DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3]) -{ - if ((me->flag&ME_SUBSURF) && me->subdivr) { - return subsurf_make_derived_from_mesh(me, me->subdivr, NULL, vertCos); + freedisplist(&ob->disp); + + if (me->derived) { + me->derived->release(me->derived); + me->derived= NULL; + } + if (ob->derivedDeform) { + ob->derivedDeform->release(ob->derivedDeform); + ob->derivedDeform= NULL; + } + + if (ob==G.obedit) { + G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); } else { - return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos); + mesh_calc_modifiers(ob->data, ob, NULL, &ob->derivedDeform, &me->derived, 0, 1); + + INIT_MINMAX(min, max); + + me->derived->getMinMax(me->derived, min, max); + + boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max); + + build_particle_system(ob); } } diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 0c1de9e624d..8fbb10d46b9 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -610,62 +610,15 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co } -static float *mesh_build_faceNormals(Object *meshOb) -{ - Mesh *me = meshOb->data; - float *nors = MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals"); - float *n1 = nors; - int i; - - for (i=0; i<me->totface; i++,n1+=3) { - MFace *mf = &me->mface[i]; - - if (mf->v3) { - MVert *ve1= &me->mvert[mf->v1]; - MVert *ve2= &me->mvert[mf->v2]; - MVert *ve3= &me->mvert[mf->v3]; - MVert *ve4= &me->mvert[mf->v4]; - - if(mf->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1); - else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1); - } - } - - return nors; -} - void addnormalsDispList(Object *ob, ListBase *lb) { DispList *dl = NULL; - Mesh *me; float *vdata, *ndata, nor[3]; float *v1, *v2, *v3, *v4; float *n1, *n2, *n3, *n4; int a, b, p1, p2, p3, p4; - if(ob->type==OB_MESH) { - - me= get_mesh(ob); - - if(me->totface==0) return; - - if(me->disp.first==0) { - dl= MEM_callocN(sizeof(DispList), "meshdisp"); - dl->type= DL_NORS; - dl->parts= 1; - dl->nr= me->totface; - BLI_addtail(&me->disp, dl); - } - else return; - - if(dl->nors==0) { - dl->nors= mesh_build_faceNormals(ob); - } - - return; - } - dl= lb->first; while(dl) { @@ -1408,62 +1361,6 @@ float calc_taper(Object *taperobj, int cur, int tot) return 1.0; } -void makeDispListMesh(Object *ob) -{ - MVert *deformedMVerts = NULL; - float min[3], max[3]; - Mesh *me; - - if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MESH) return; - me= ob->data; - - /* also serves as signal to remake texspace */ - if (me->bb) { - MEM_freeN(me->bb); - me->bb = NULL; - } - - freedisplist(&ob->disp); - freedisplist(&me->disp); - - if (me->derived) { - me->derived->release(me->derived); - me->derived= NULL; - } - if (ob->derivedDeform) { - ob->derivedDeform->release(ob->derivedDeform); - ob->derivedDeform= NULL; - } - - if (ob!=G.obedit) { - mesh_modifier(ob, &deformedMVerts); - - if (deformedMVerts) { - ob->derivedDeform = derivedmesh_from_mesh(ob, deformedMVerts); - } - } - - if ((me->flag&ME_SUBSURF) && me->subdiv) { - if (ob==G.obedit) { - G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); - } else { - me->derived= subsurf_make_derived_from_mesh(ob->data, me->subdiv, ob, NULL); - } - } - - INIT_MINMAX(min, max); - if (me->derived) { - me->derived->getMinMax(me->derived, min, max); - - boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max); - } else if (ob->derivedDeform) { - ob->derivedDeform->getMinMax(ob->derivedDeform, min, max); - - boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max); - } - - build_particle_system(ob); -} void makeDispListMBall(Object *ob) { if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MBALL) return; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 7b0e1d98750..52791ae0e06 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -151,7 +151,6 @@ void free_mesh(Mesh *me) if(me->mat) MEM_freeN(me->mat); if(me->bb) MEM_freeN(me->bb); - if(me->disp.first) freedisplist(&me->disp); if(me->derived) me->derived->release(me->derived); } @@ -236,8 +235,6 @@ Mesh *copy_mesh(Mesh *me) men->texcomesh= NULL; men->bb= MEM_dupallocN(men->bb); - men->disp.first= men->disp.last= NULL; // dont copy, editmode version has pointers in it - men->key= copy_key(me->key); if(men->key) men->key->from= (ID *)men; @@ -724,20 +721,6 @@ void flipnorm_mesh(Mesh *me) } mface++; } - - if(me->disp.first) { - dl= me->disp.first; - fp= dl->nors; - if(fp) { - a= dl->nr; - while(a--) { - fp[0]= -fp[0]; - fp[1]= -fp[1]; - fp[2]= -fp[2]; - fp+= 3; - } - } - } } Mesh *get_mesh(Object *ob) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index f7e17f75ae3..b5222d21630 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -72,7 +72,6 @@ typedef struct _SubSurf { /* used by mesh control type */ Mesh *me; - Object *deformOb; float (*vertCos)[3]; } SubSurf; @@ -145,14 +144,13 @@ static SubSurf *subSurf_fromEditmesh(EditMesh *em, int subdivLevels, int useAgin return ss; } -static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, Object *deformOb, float (*vertCos)[3]) { +static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, float (*vertCos)[3]) { SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_m"); ss->controlType = SUBSURF_CONTROLTYPE_MESH; ss->useAging=0; ss->subSurf = _getSubSurf(ss, subdivLevels, 1); ss->me = me; - ss->deformOb = deformOb; ss->vertCos = vertCos; ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f); @@ -509,15 +507,7 @@ static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) { CCGVertHDL fVerts[4]; int i; - if (ss->deformOb && ss->deformOb->derivedDeform) { - DispListMesh *dlm = ss->deformOb->derivedDeform->convertToDispListMesh(ss->deformOb->derivedDeform); - - for (i=0; i<ss->me->totvert; i++) { - ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, dlm->mvert[i].co); - } - - displistmesh_free(dlm); - } else if (ss->vertCos) { + if (ss->vertCos) { for (i=0; i<ss->me->totvert; i++) { ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->vertCos[i]); } @@ -1021,9 +1011,9 @@ DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, return (DerivedMesh*) ccgdm; } -DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, Object *deformedVertsOb, float (*vertCos)[3]) { +DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, float (*vertCos)[3]) { int useFlatSubdiv = me->subsurftype==ME_SIMPLE_SUBSURF; - SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, deformedVertsOb, vertCos); + SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, vertCos); DispListMesh *dlm; subSurf_sync(ss, useFlatSubdiv); @@ -1042,7 +1032,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) * calculated vert positions is incorrect for the verts * on the boundary of the mesh. */ - SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL, NULL); + SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL); float edge_sum[3], face_sum[3]; CCGVertIterator *vi; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 10c58904c3e..0911ccc7312 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2086,7 +2086,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) mesh->dvert= newdataadr(fd, mesh->dvert); direct_link_dverts(fd, mesh->totvert, mesh->dvert); - mesh->disp.first= mesh->disp.last= NULL; mesh->bb= NULL; mesh->oc= 0; mesh->dface= NULL; diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 2c09f93c5f4..8ec820b578c 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -65,7 +65,6 @@ typedef struct Mesh { struct BoundBox *bb; ListBase effect; - ListBase disp; struct Ipo *ipo; struct Key *key; diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c index 57768be2464..dd8cdda52d4 100644 --- a/source/blender/python/api2_2x/NMesh.c +++ b/source/blender/python/api2_2x/NMesh.c @@ -2399,7 +2399,6 @@ static void EXPP_unlink_mesh( Mesh * me ) static int unlink_existingMeshData( Mesh * mesh ) { - freedisplist( &mesh->disp ); EXPP_unlink_mesh( mesh ); if( mesh->mvert ) MEM_freeN( mesh->mvert ); diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 47443d24273..dd90f251be5 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -1318,7 +1318,8 @@ static void init_render_mesh(Object *ob) int a, a1, ok, do_puno=0, need_orco=0, totvlako, totverto, vertofs; int start, end, do_autosmooth=0, totvert = 0; DispListMesh *dlm = NULL; - + DerivedMesh *dm; + me= ob->data; paf = give_parteff(ob); @@ -1358,19 +1359,13 @@ static void init_render_mesh(Object *ob) orco = get_mesh_orco(ob); } - { - int needsFree; - DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree); - dlm = dm->convertToDispListMesh(dm); - if (needsFree) { - dm->release(dm); - } + dm = mesh_create_derived_render(ob); + dlm = dm->convertToDispListMesh(dm); - mvert= dlm->mvert; - totvert= dlm->totvert; + mvert= dlm->mvert; + totvert= dlm->totvert; - ms = (totvert==me->totvert)?me->msticky:NULL; - } + ms = (totvert==me->totvert)?me->msticky:NULL; ma= give_render_material(ob, 1); @@ -1600,6 +1595,7 @@ static void init_render_mesh(Object *ob) } if(dlm) displistmesh_free(dlm); + dm->release(dm); } /* ------------------------------------------------------------------------- */ diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index d3a34072cfd..4a14fbbd21f 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -2054,7 +2054,10 @@ void do_meshbuts(unsigned short event) if(G.obedit) { flip_editnormals(); } - else flipnorm_mesh( get_mesh(ob) ); + else { + flipnorm_mesh( get_mesh(ob) ); + DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); + } allqueue(REDRAWVIEW3D, 0); break; diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 7521f4391b1..4c05139227c 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1062,7 +1062,7 @@ static void calc_meshverts(DerivedMesh *dm) void calc_meshverts_ext(void) { int dmNeedsFree; - DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); + DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree); areawinset(curarea->win); persp(PERSP_VIEW); @@ -1080,7 +1080,7 @@ void calc_meshverts_ext(void) void calc_meshverts_ext_f2(void) { int dmNeedsFree; - DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); + DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree); float co[3], mat[4][4]; EditVert *eve; @@ -1776,14 +1776,13 @@ static void draw_mesh_object_outline(Object *ob, DerivedMesh *dm) } } -static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *realDM, int dt) +static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, int dt) { Mesh *me = ob->data; Material *ma= give_current_material(ob, 1); int hasHaloMat = (ma && (ma->mode&MA_HALO)); int draw_wire = ob->dtx&OB_DRAWWIRE; DispList *dl; - DerivedMesh *dm = realDM?realDM:baseDM; glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); @@ -1919,8 +1918,8 @@ static void draw_mesh_object(Base *base, int dt) int has_alpha= 0; if(G.obedit && ob->data==G.obedit->data) { - DerivedMesh *baseDM = mesh_get_base_derived(ob); - DerivedMesh *realDM = mesh_get_derived(ob); + DerivedMesh *baseDM = editmesh_get_derived_proxy(); + DerivedMesh *realDM = editmesh_get_derived(); if(dt>OB_WIRE) init_gl_materials(ob); // no transp in editmode, the fancy draw over goes bad then draw_em_fancy(ob, G.editMesh, baseDM, realDM, dt); @@ -1931,14 +1930,15 @@ static void draw_mesh_object(Base *base, int dt) BoundBox *bb = mesh_get_bb(me); if(me->totface<=4 || boundbox_clip(ob->obmat, bb)) { - int baseDMneedsFree; + int baseDMneedsFree, realDMneedsFree; DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree); - DerivedMesh *realDM = mesh_get_derived(ob); + DerivedMesh *realDM = mesh_get_derived_final(ob, &realDMneedsFree); if(dt==OB_SOLID) has_alpha= init_gl_materials(ob); draw_mesh_fancy(ob, baseDM, realDM, dt); if (baseDMneedsFree) baseDM->release(baseDM); + if (realDMneedsFree) realDM->release(realDM); } } @@ -4051,7 +4051,7 @@ void draw_object_backbufsel(Object *ob) case OB_MESH: if(ob==G.obedit) { int dmNeedsFree; - DerivedMesh *dm = mesh_get_cage_derived(ob, &dmNeedsFree); + DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree); em_solidoffs= bbs_mesh_solid_EM(dm, G.scene->selectmode & SCE_SELECT_FACE); diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index a3bd62aa6c0..0f0d131793a 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -678,7 +678,7 @@ static EditFace *findnearestface(short *dist) static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa) { int dmNeedsFree; - DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); + DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree); glDrawBuffer(GL_FRONT); diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c index c6f68ac331c..a15b686c64a 100644 --- a/source/blender/src/transform_manipulator.c +++ b/source/blender/src/transform_manipulator.c @@ -173,7 +173,7 @@ int calc_manipulator_stats(ScrArea *sa) if(G.obedit->type==OB_MESH) { int dmNeedsFree; - DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); + DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree); EditMesh *em = G.editMesh; EditVert *eve; float vec[3]; |