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_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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user