forked from bartvdbraak/blender
- 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:
parent
e6f4527813
commit
e1c653c5c3
@ -49,6 +49,7 @@
|
||||
#include "DNA_meshdata_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BKE_DerivedMesh.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_anim.h"
|
||||
@ -328,12 +329,11 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
{
|
||||
Object *ob, *newob;
|
||||
Base *base;
|
||||
MVert *mvert;
|
||||
Mesh *me;
|
||||
DispList *dl;
|
||||
float *extverts=NULL, vec[3], pvec[3], pmat[4][4], mat[3][3], tmat[4][4];
|
||||
float vec[3], pmat[4][4], mat[3][3], tmat[4][4];
|
||||
float *q2;
|
||||
int lay, totvert, a;
|
||||
int dmNeedsFree;
|
||||
DerivedMesh *dm;
|
||||
|
||||
Mat4CpyMat4(pmat, par->obmat);
|
||||
|
||||
@ -341,8 +341,8 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
|
||||
lay= G.scene->lay;
|
||||
|
||||
dl= find_displist(&par->disp, DL_VERTS);
|
||||
if(dl) extverts= dl->verts;
|
||||
dm = mesh_get_derived_deform(par, &dmNeedsFree);
|
||||
totvert = dm->getNumVerts(dm);
|
||||
|
||||
base= sce->base.first;
|
||||
while(base) {
|
||||
@ -351,29 +351,12 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
ob= base->object->parent;
|
||||
while(ob) {
|
||||
if(ob==par) {
|
||||
|
||||
ob= base->object;
|
||||
/* mballs have a different dupli handling */
|
||||
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;
|
||||
totvert= me->totvert;
|
||||
|
||||
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);
|
||||
}
|
||||
for(a=0; a<totvert; a++) {
|
||||
dm->getVertCo(dm, a, vec);
|
||||
|
||||
Mat4MulVecfl(pmat, vec);
|
||||
VecSubf(vec, vec, pmat[3]);
|
||||
@ -383,7 +366,7 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
VECCOPY(newob->obmat[3], vec);
|
||||
|
||||
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];
|
||||
|
||||
q2= vectoquat(vec, ob->trackflag, ob->upflag);
|
||||
@ -392,9 +375,6 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
Mat4CpyMat4(tmat, newob->obmat);
|
||||
Mat4MulMat43(newob->obmat, tmat, mat);
|
||||
}
|
||||
|
||||
VECCOPY(pvec, vec);
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -403,6 +383,9 @@ void vertex_duplilist(Scene *sce, Object *par)
|
||||
}
|
||||
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 */
|
||||
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;
|
||||
|
||||
if(dl->verts) MEM_freeN(dl->verts);
|
||||
@ -308,10 +308,6 @@ int mesh_modifier(Object *ob, char mode)
|
||||
mvert= NULL;
|
||||
}
|
||||
}
|
||||
else if(mode=='a') { // apply
|
||||
if(mvert) MEM_freeN(mvert);
|
||||
mvert= NULL;
|
||||
}
|
||||
|
||||
return done;
|
||||
}
|
||||
|
@ -1159,10 +1159,11 @@ void build_particle_system(Object *ob)
|
||||
PartEff *paf;
|
||||
Particle *pa;
|
||||
Mesh *me;
|
||||
MVert *mvert;
|
||||
MTex *mtexmove=0;
|
||||
Material *ma;
|
||||
DispListMesh *dlm;
|
||||
int dmNeedsFree;
|
||||
DerivedMesh *dm;
|
||||
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;
|
||||
@ -1183,9 +1184,6 @@ void build_particle_system(Object *ob)
|
||||
waitcursor(1);
|
||||
|
||||
disable_speed_curve(1);
|
||||
|
||||
/* warning! we cannot call this when modifier is active! */
|
||||
mesh_modifier(ob, 's');
|
||||
|
||||
/* generate all particles */
|
||||
if(paf->keys) MEM_freeN(paf->keys);
|
||||
@ -1263,13 +1261,8 @@ void build_particle_system(Object *ob)
|
||||
}
|
||||
|
||||
/* init */
|
||||
if (mesh_uses_displist(me)) {
|
||||
DerivedMesh *dm = mesh_get_derived(ob);
|
||||
|
||||
dlm = dm->convertToDispListMesh(dm);
|
||||
} else {
|
||||
dlm = NULL;
|
||||
}
|
||||
dm = mesh_get_derived_final(ob, &dmNeedsFree);
|
||||
dlm = dm->convertToDispListMesh(dm);
|
||||
|
||||
give_mesh_mvert(me, dlm, totpart, co, no, paf->seed);
|
||||
|
||||
@ -1328,9 +1321,14 @@ void build_particle_system(Object *ob)
|
||||
/* get coordinates */
|
||||
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);
|
||||
VECCOPY(no, mvert->no);
|
||||
float fno[3];
|
||||
|
||||
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);
|
||||
@ -1355,7 +1353,6 @@ void build_particle_system(Object *ob)
|
||||
|
||||
/* start speed: normal */
|
||||
if(paf->normfac!=0.0) {
|
||||
/* sp= mvert->no; */
|
||||
/* transpose ! */
|
||||
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];
|
||||
@ -1413,13 +1410,10 @@ void build_particle_system(Object *ob)
|
||||
if(ma) do_mat_ipo(ma); // set back on current time
|
||||
disable_speed_curve(0);
|
||||
|
||||
mesh_modifier(ob, 'e');
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
if (dlm) {
|
||||
displistmesh_free(dlm);
|
||||
}
|
||||
displistmesh_free(dlm);
|
||||
if (dmNeedsFree) dm->release(dm);
|
||||
}
|
||||
|
||||
/* ************* WAVE **************** */
|
||||
|
@ -44,6 +44,8 @@
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_editVert.h"
|
||||
|
||||
#include "BKE_DerivedMesh.h"
|
||||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_deform.h"
|
||||
#include "BKE_displist.h"
|
||||
@ -611,9 +613,17 @@ void object_apply_deform(Object *ob)
|
||||
if(me->id.us>1) {
|
||||
err= "Can't apply deformation to Mesh with other users";
|
||||
} else {
|
||||
mesh_modifier(ob, 's'); // start
|
||||
mesh_modifier(ob, 'a'); // apply and end
|
||||
freedisplist(&ob->disp);
|
||||
int i, dmNeedsFree;
|
||||
DerivedMesh *dm = mesh_get_derived_deform(ob, &dmNeedsFree);
|
||||
|
||||
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user