diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/effect.c | 38 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/exotic.c | 29 |
6 files changed, 60 insertions, 38 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 72ad71feb49..3fe9f771c7f 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -43,6 +43,9 @@ struct DerivedMesh { int (*getNumVerts)(DerivedMesh *dm); int (*getNumFaces)(DerivedMesh *dm); + /* Convert to new DispListMesh, should be free'd by caller */ + struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm); + /* Drawing Operations */ /* Draw all vertices as bgl points (no options) */ diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 95883501f55..7ae1ac664e3 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -110,6 +110,7 @@ void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me); DispListMesh *displistmesh_from_editmesh(struct EditMesh *em); DispListMesh *displistmesh_from_mesh(struct Mesh *mesh, float *extverts); +DispListMesh *displistmesh_copy(DispListMesh *odlm); /* * All the different DispList.type's use the diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 8d84db9c903..ea5a8c6e6b2 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -375,12 +375,21 @@ static int meshDM_getNumFaces(DerivedMesh *dm) return me->totface; } +static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm) +{ + MeshDerivedMesh *mdm= (MeshDerivedMesh*) dm; + + return displistmesh_from_mesh(mdm->ob->data, mdm->extverts); +} + + static DerivedMesh *getMeshDerivedMesh(Object *ob, float *extverts, float *nors) { MeshDerivedMesh *mdm = MEM_mallocN(sizeof(*mdm), "dm"); mdm->dm.getNumVerts = meshDM_getNumVerts; mdm->dm.getNumFaces = meshDM_getNumFaces; + mdm->dm.convertToDispListMesh = meshDM_convertToDispListMesh; mdm->dm.drawVerts = meshDM_drawVerts; mdm->dm.drawMappedVertsEM = NULL; @@ -510,12 +519,20 @@ static int emDM_getNumFaces(DerivedMesh *dm) return BLI_countlist(&emdm->em->faces); } +static DispListMesh *emDM_convertToDispListMesh(DerivedMesh *dm) +{ + EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; + + return displistmesh_from_editmesh(emdm->em); +} + static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em) { EditMeshDerivedMesh *emdm = MEM_mallocN(sizeof(*emdm), "dm"); emdm->dm.getNumVerts = emDM_getNumVerts; emdm->dm.getNumFaces = emDM_getNumFaces; + emdm->dm.convertToDispListMesh = emDM_convertToDispListMesh; emdm->dm.drawVerts = NULL; emdm->dm.drawMappedVertsEM = emDM_drawMappedVertsEM; @@ -817,12 +834,20 @@ static int ssDM_getNumFaces(DerivedMesh *dm) return ssdm->dlm->totface; } +static DispListMesh *ssDM_convertToDispListMesh(DerivedMesh *dm) +{ + SSDerivedMesh *ssdm = (SSDerivedMesh*) dm; + + return displistmesh_copy(ssdm->dlm); +} + static DerivedMesh *getSSDerivedMesh(EditMesh *em, DispListMesh *dlm, float *nors) { SSDerivedMesh *ssdm = MEM_mallocN(sizeof(*ssdm), "dm"); ssdm->dm.getNumVerts = ssDM_getNumVerts; ssdm->dm.getNumFaces = ssDM_getNumFaces; + ssdm->dm.convertToDispListMesh = ssDM_convertToDispListMesh; ssdm->dm.drawVerts = ssDM_drawVerts; ssdm->dm.drawMappedVertsEM = ssDM_drawMappedVertsEM; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 3173c755335..98bc929d3f8 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -220,7 +220,7 @@ void displistmesh_free(DispListMesh *dlm) MEM_freeN(dlm); } -static DispListMesh *displistmesh_copy(DispListMesh *odlm) +DispListMesh *displistmesh_copy(DispListMesh *odlm) { DispListMesh *ndlm= MEM_dupallocN(odlm); ndlm->mvert= MEM_dupallocN(odlm->mvert); diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 899352f9ca7..d283c5808c6 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -59,6 +59,7 @@ #include "BKE_constraint.h" #include "BKE_deform.h" #include "BKE_displist.h" +#include "BKE_DerivedMesh.h" #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_ipo.h" @@ -1022,7 +1023,7 @@ void init_mv_jit(float *jit, int num,int seed2) } -static void give_mesh_mvert(Mesh *me, int nr, float *co, short *no, int seed2) +static void give_mesh_mvert(Mesh *me, DispListMesh *dlm, int nr, float *co, short *no, int seed2) { static float *jit=0; static int jitlevel=1; @@ -1039,16 +1040,11 @@ static void give_mesh_mvert(Mesh *me, int nr, float *co, short *no, int seed2) return; } - /* get it from displist? */ - if(me->disp.first) { - DispList *dl= me->disp.first; - if(dl->type==DL_MESH) { - DispListMesh *dlm= dl->mesh; - mvertbase= dlm->mvert; - mfacebase= dlm->mface; - totface= dlm->totface; - totvert= dlm->totvert; - } + if(dlm) { + mvertbase= dlm->mvert; + mfacebase= dlm->mface; + totface= dlm->totface; + totvert= dlm->totvert; } if(totvert==0) { @@ -1133,6 +1129,7 @@ void build_particle_system(Object *ob) MVert *mvert; MTex *mtexmove=0; Material *ma; + DispListMesh *dlm; float framelenont, ftime, dtime, force[3], imat[3][3], vec[3]; float fac, prevobmat[4][4], sfraont, co[3]; int deform=0, a, cur, cfraont, cfralast, totpart; @@ -1233,7 +1230,17 @@ void build_particle_system(Object *ob) } /* init */ - give_mesh_mvert(me, totpart, co, no, paf->seed); + if (mesh_uses_displist(me)) { + DerivedMesh *dm = mesh_get_derived(ob); + + dlm = dm->convertToDispListMesh(dm); + + dm->release(dm); + } else { + dlm = NULL; + } + + give_mesh_mvert(me, dlm, totpart, co, no, paf->seed); if(G.f & G_DEBUG) { printf("\n"); @@ -1284,7 +1291,7 @@ void build_particle_system(Object *ob) } } /* get coordinates */ - if(paf->flag & PAF_FACE) give_mesh_mvert(me, a, co, no,paf->seed); + if(paf->flag & PAF_FACE) give_mesh_mvert(me, dlm, a, co, no,paf->seed); else { mvert= me->mvert + (a % me->totvert); VECCOPY(co, mvert->co); @@ -1341,7 +1348,7 @@ void build_particle_system(Object *ob) /* restore */ G.scene->r.cfra= cfraont; G.scene->r.framelen= framelenont; - give_mesh_mvert(0, 0, 0, 0,paf->seed); + give_mesh_mvert(0, 0, 0, 0, 0,paf->seed); /* put hierarchy back */ par= ob; @@ -1370,6 +1377,9 @@ void build_particle_system(Object *ob) waitcursor(0); + if (dlm) { + displistmesh_free(dlm); + } } /* ************* WAVE **************** */ diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 8ef742d816e..2c16b76235a 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -118,6 +118,7 @@ /* #include "BKE_error.h" */ #include "BKE_screen.h" #include "BKE_displist.h" +#include "BKE_DerivedMesh.h" #include "BKE_curve.h" #include "BPY_extern.h" @@ -2552,31 +2553,13 @@ static int write_object_stl(FILE *fpSTL, Object *ob, Mesh *me) int numfacets = 0; if(mesh_uses_displist(me)) { - ListBase *dlbase=0; - DispList *dl; - float *data; - dlbase = &me->disp; + DerivedMesh *dm = mesh_get_derived(ob); + DispListMesh *dlm = dm->convertToDispListMesh(dm); - if (dlbase==0) return 0; + numfacets += write_displistmesh_stl(fpSTL, ob, dlm); - dl= dlbase->first; - while(dl) { - data= dl->verts; - - switch(dl->type) { - case DL_MESH: - numfacets - += write_displistmesh_stl(fpSTL, ob, dl->mesh); - break; -#if 0 - default: - numfacets - += write_displist_stl(fpSTL, ob, dl); - break; -#endif - } - dl= dl->next; - } + displistmesh_free(dlm); + dm->release(dm); } else { numfacets += write_mesh_stl(fpSTL, ob, me); |