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.h3
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c25
-rw-r--r--source/blender/blenkernel/intern/displist.c2
-rw-r--r--source/blender/blenkernel/intern/effect.c38
-rw-r--r--source/blender/blenkernel/intern/exotic.c29
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);