- convert vertex_duplilist to use mesh_get_derived_deform

- convert object_apply_deform to use mesh_get_derived_deform
 - convert build_particle_system to use mesh_get_derived_deform
 - remove apply option from mesh_modifier

What do you know, this leaves only one callsite for mesh_modifier
and one "user" site for DL_VERTS...
This commit is contained in:
Daniel Dunbar 2005-07-17 05:20:57 +00:00
parent e6f4527813
commit e1c653c5c3
4 changed files with 40 additions and 57 deletions

@ -49,6 +49,7 @@
#include "DNA_meshdata_types.h" #include "DNA_meshdata_types.h"
#include "DNA_scene_types.h" #include "DNA_scene_types.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_utildefines.h" #include "BKE_utildefines.h"
#include "BKE_anim.h" #include "BKE_anim.h"
@ -328,12 +329,11 @@ void vertex_duplilist(Scene *sce, Object *par)
{ {
Object *ob, *newob; Object *ob, *newob;
Base *base; Base *base;
MVert *mvert; float vec[3], pmat[4][4], mat[3][3], tmat[4][4];
Mesh *me;
DispList *dl;
float *extverts=NULL, vec[3], pvec[3], pmat[4][4], mat[3][3], tmat[4][4];
float *q2; float *q2;
int lay, totvert, a; int lay, totvert, a;
int dmNeedsFree;
DerivedMesh *dm;
Mat4CpyMat4(pmat, par->obmat); Mat4CpyMat4(pmat, par->obmat);
@ -341,8 +341,8 @@ void vertex_duplilist(Scene *sce, Object *par)
lay= G.scene->lay; lay= G.scene->lay;
dl= find_displist(&par->disp, DL_VERTS); dm = mesh_get_derived_deform(par, &dmNeedsFree);
if(dl) extverts= dl->verts; totvert = dm->getNumVerts(dm);
base= sce->base.first; base= sce->base.first;
while(base) { while(base) {
@ -351,29 +351,12 @@ void vertex_duplilist(Scene *sce, Object *par)
ob= base->object->parent; ob= base->object->parent;
while(ob) { while(ob) {
if(ob==par) { if(ob==par) {
ob= base->object; ob= base->object;
/* mballs have a different dupli handling */ /* mballs have a different dupli handling */
if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */ if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */
me= par->data;
mvert= me->mvert;
mvert+= (me->totvert-1);
VECCOPY(pvec, mvert->co);
Mat4MulVecfl(pmat, pvec);
mvert= me->mvert; for(a=0; a<totvert; a++) {
totvert= me->totvert; dm->getVertCo(dm, a, vec);
for(a=0; a<totvert; a++, mvert++) {
/* calc the extra offset for children (wrt. centre parent) */
if(extverts) {
VECCOPY(vec, extverts+3*a);
}
else {
VECCOPY(vec, mvert->co);
}
Mat4MulVecfl(pmat, vec); Mat4MulVecfl(pmat, vec);
VecSubf(vec, vec, pmat[3]); VecSubf(vec, vec, pmat[3]);
@ -383,7 +366,7 @@ void vertex_duplilist(Scene *sce, Object *par)
VECCOPY(newob->obmat[3], vec); VECCOPY(newob->obmat[3], vec);
if(par->transflag & OB_DUPLIROT) { if(par->transflag & OB_DUPLIROT) {
VECCOPY(vec, mvert->no); dm->getVertNo(dm, a, vec);
vec[0]= -vec[0]; vec[1]= -vec[1]; vec[2]= -vec[2]; vec[0]= -vec[0]; vec[1]= -vec[1]; vec[2]= -vec[2];
q2= vectoquat(vec, ob->trackflag, ob->upflag); q2= vectoquat(vec, ob->trackflag, ob->upflag);
@ -392,9 +375,6 @@ void vertex_duplilist(Scene *sce, Object *par)
Mat4CpyMat4(tmat, newob->obmat); Mat4CpyMat4(tmat, newob->obmat);
Mat4MulMat43(newob->obmat, tmat, mat); Mat4MulMat43(newob->obmat, tmat, mat);
} }
VECCOPY(pvec, vec);
} }
break; break;
} }
@ -403,6 +383,9 @@ void vertex_duplilist(Scene *sce, Object *par)
} }
base= base->next; base= base->next;
} }
if (dmNeedsFree)
dm->release(dm);
} }

@ -283,7 +283,7 @@ int mesh_modifier(Object *ob, char mode)
/* put deformed vertices in dl->verts, optional subsurf will replace that */ /* put deformed vertices in dl->verts, optional subsurf will replace that */
if(done) { if(done) {
DispList *dl= find_displist_create(&ob->disp, DL_VERTS); DispList *dl= find_displist_create(&ob->disp, DL_VERTS); // removed after switchover
float *fp; float *fp;
if(dl->verts) MEM_freeN(dl->verts); if(dl->verts) MEM_freeN(dl->verts);
@ -308,10 +308,6 @@ int mesh_modifier(Object *ob, char mode)
mvert= NULL; mvert= NULL;
} }
} }
else if(mode=='a') { // apply
if(mvert) MEM_freeN(mvert);
mvert= NULL;
}
return done; return done;
} }

@ -1159,10 +1159,11 @@ void build_particle_system(Object *ob)
PartEff *paf; PartEff *paf;
Particle *pa; Particle *pa;
Mesh *me; Mesh *me;
MVert *mvert;
MTex *mtexmove=0; MTex *mtexmove=0;
Material *ma; Material *ma;
DispListMesh *dlm; DispListMesh *dlm;
int dmNeedsFree;
DerivedMesh *dm;
float framelenont, ftime, dtime, force[3], imat[3][3], vec[3]; float framelenont, ftime, dtime, force[3], imat[3][3], vec[3];
float fac, prevobmat[4][4], sfraont, co[3]; float fac, prevobmat[4][4], sfraont, co[3];
int deform=0, a, cur, cfraont, cfralast, totpart; int deform=0, a, cur, cfraont, cfralast, totpart;
@ -1183,9 +1184,6 @@ void build_particle_system(Object *ob)
waitcursor(1); waitcursor(1);
disable_speed_curve(1); disable_speed_curve(1);
/* warning! we cannot call this when modifier is active! */
mesh_modifier(ob, 's');
/* generate all particles */ /* generate all particles */
if(paf->keys) MEM_freeN(paf->keys); if(paf->keys) MEM_freeN(paf->keys);
@ -1263,13 +1261,8 @@ void build_particle_system(Object *ob)
} }
/* init */ /* init */
if (mesh_uses_displist(me)) { dm = mesh_get_derived_final(ob, &dmNeedsFree);
DerivedMesh *dm = mesh_get_derived(ob); dlm = dm->convertToDispListMesh(dm);
dlm = dm->convertToDispListMesh(dm);
} else {
dlm = NULL;
}
give_mesh_mvert(me, dlm, totpart, co, no, paf->seed); give_mesh_mvert(me, dlm, totpart, co, no, paf->seed);
@ -1328,9 +1321,14 @@ void build_particle_system(Object *ob)
/* get coordinates */ /* get coordinates */
if(paf->flag & PAF_FACE) give_mesh_mvert(me, dlm, a, co, no, paf->seed); if(paf->flag & PAF_FACE) give_mesh_mvert(me, dlm, a, co, no, paf->seed);
else { else {
mvert= me->mvert + (a % me->totvert); float fno[3];
VECCOPY(co, mvert->co);
VECCOPY(no, mvert->no); dm->getVertCo(dm, a%dm->getNumVerts(dm), co);
dm->getVertNo(dm, a%dm->getNumVerts(dm), fno);
no[0] = fno[0]*32767.f;
no[1] = fno[1]*32767.f;
no[2] = fno[2]*32767.f;
} }
VECCOPY(pa->co, co); VECCOPY(pa->co, co);
@ -1355,7 +1353,6 @@ void build_particle_system(Object *ob)
/* start speed: normal */ /* start speed: normal */
if(paf->normfac!=0.0) { if(paf->normfac!=0.0) {
/* sp= mvert->no; */
/* transpose ! */ /* transpose ! */
vec[0]= imat[0][0]*no[0] + imat[0][1]*no[1] + imat[0][2]*no[2]; vec[0]= imat[0][0]*no[0] + imat[0][1]*no[1] + imat[0][2]*no[2];
vec[1]= imat[1][0]*no[0] + imat[1][1]*no[1] + imat[1][2]*no[2]; vec[1]= imat[1][0]*no[0] + imat[1][1]*no[1] + imat[1][2]*no[2];
@ -1413,13 +1410,10 @@ void build_particle_system(Object *ob)
if(ma) do_mat_ipo(ma); // set back on current time if(ma) do_mat_ipo(ma); // set back on current time
disable_speed_curve(0); disable_speed_curve(0);
mesh_modifier(ob, 'e');
waitcursor(0); waitcursor(0);
if (dlm) { displistmesh_free(dlm);
displistmesh_free(dlm); if (dmNeedsFree) dm->release(dm);
}
} }
/* ************* WAVE **************** */ /* ************* WAVE **************** */

@ -44,6 +44,8 @@
#include "BLI_blenlib.h" #include "BLI_blenlib.h"
#include "BLI_editVert.h" #include "BLI_editVert.h"
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_deform.h" #include "BKE_deform.h"
#include "BKE_displist.h" #include "BKE_displist.h"
@ -611,9 +613,17 @@ void object_apply_deform(Object *ob)
if(me->id.us>1) { if(me->id.us>1) {
err= "Can't apply deformation to Mesh with other users"; err= "Can't apply deformation to Mesh with other users";
} else { } else {
mesh_modifier(ob, 's'); // start int i, dmNeedsFree;
mesh_modifier(ob, 'a'); // apply and end DerivedMesh *dm = mesh_get_derived_deform(ob, &dmNeedsFree);
freedisplist(&ob->disp);
for (i=0; i<me->totvert; i++) {
dm->getVertCo(dm, i, me->mvert[i].co);
}
if (dmNeedsFree)
dm->release(dm);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
} }
} }
else if (ob->type==OB_CURVE || ob->type==OB_SURF) { else if (ob->type==OB_CURVE || ob->type==OB_SURF) {