Another fix for bug #11140: explode modifier was still using more

memory than needed.
This commit is contained in:
Brecht Van Lommel
2008-05-27 15:36:36 +00:00
parent 056f0564c2
commit 83a7fbf499

View File

@@ -6485,12 +6485,14 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
MFace *mf=0;
MVert *dupvert=0;
ParticleSettings *part=psmd->psys->part;
ParticleData *pa, *pars=psmd->psys->particles;
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
EdgeHash *vertpahash;
EdgeHashIterator *ehi;
float *vertco=0, imat[4][4];
float loc0[3], nor[3];
float timestep, cfra;
int *facepa=emd->facepa, *vertpa=0;
int *facepa=emd->facepa;
int totdup=0,totvert=0,totface=0,totpart=0;
int i, j, v, mindex=0;
@@ -6505,34 +6507,36 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
else
cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
/* table for vertice <-> particle relations (row totpart+1 is for yet unexploded verts) */
vertpa = MEM_callocN(sizeof(int)*(totpart+1)*totvert, "explode_vertpatab");
for(i=0; i<(totpart+1)*totvert; i++)
vertpa[i] = -1;
/* hash table for vertice <-> particle relations */
vertpahash= BLI_edgehash_new();
for (i=0; i<totface; i++) {
/* do mindex + totvert to ensure the vertex index to be the first
* with BLI_edgehashIterator_getKey */
if(facepa[i]==totpart || cfra <= (pars+facepa[i])->time)
mindex = totpart*totvert;
mindex = totvert+totpart;
else
mindex = facepa[i]*totvert;
mindex = totvert+facepa[i];
mf=CDDM_get_face(dm,i);
/*set face vertices to exist in particle group*/
vertpa[mindex+mf->v1] = 1;
vertpa[mindex+mf->v2] = 1;
vertpa[mindex+mf->v3] = 1;
/* set face vertices to exist in particle group */
BLI_edgehash_insert(vertpahash, mf->v1, mindex, NULL);
BLI_edgehash_insert(vertpahash, mf->v2, mindex, NULL);
BLI_edgehash_insert(vertpahash, mf->v3, mindex, NULL);
if(mf->v4)
vertpa[mindex+mf->v4] = 1;
BLI_edgehash_insert(vertpahash, mf->v4, mindex, NULL);
}
/*make new vertice indexes & count total vertices after duplication*/
for(i=0; i<(totpart+1)*totvert; i++){
if(vertpa[i] != -1)
vertpa[i] = totdup++;
/* make new vertice indexes & count total vertices after duplication */
ehi= BLI_edgehashIterator_new(vertpahash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup));
totdup++;
}
BLI_edgehashIterator_free(ehi);
/*the final duplicated vertices*/
/* the final duplicated vertices */
explode= CDDM_from_template(dm, totdup, 0,totface);
dupvert= CDDM_get_verts(explode);
@@ -6541,45 +6545,49 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
psmd->psys->lattice = psys_get_lattice(ob, psmd->psys);
/*duplicate & displace vertices*/
for(i=0, pa=pars; i<=totpart; i++, pa++){
if(i!=totpart){
/* duplicate & displace vertices */
ehi= BLI_edgehashIterator_new(vertpahash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
MVert source;
MVert *dest;
/* get particle + vertex from hash */
BLI_edgehashIterator_getKey(ehi, &j, &i);
i -= totvert;
v= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
dm->getVert(dm, j, &source);
dest = CDDM_get_vert(explode,v);
DM_copy_vert_data(dm,explode,j,v,1);
*dest = source;
if(i!=totpart) {
/* get particle */
pa= pars+i;
/* get particle state */
psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
Mat4MulVecfl(ob->obmat,loc0);
state.time=cfra;
psys_get_particle_state(ob,psmd->psys,i,&state,1);
}
for(j=0; j<totvert; j++){
v=vertpa[i*totvert+j];
if(v != -1) {
MVert source;
MVert *dest;
vertco=CDDM_get_vert(explode,v)->co;
Mat4MulVecfl(ob->obmat,vertco);
dm->getVert(dm, j, &source);
dest = CDDM_get_vert(explode,v);
VECSUB(vertco,vertco,loc0);
DM_copy_vert_data(dm,explode,j,v,1);
*dest = source;
/* apply rotation, size & location */
QuatMulVecf(state.rot,vertco);
VecMulf(vertco,pa->size);
VECADD(vertco,vertco,state.co);
if(i!=totpart){
vertco=CDDM_get_vert(explode,v)->co;
Mat4MulVecfl(ob->obmat,vertco);
VECSUB(vertco,vertco,loc0);
/* apply rotation, size & location */
QuatMulVecf(state.rot,vertco);
VecMulf(vertco,pa->size);
VECADD(vertco,vertco,state.co);
Mat4MulVecfl(imat,vertco);
}
}
Mat4MulVecfl(imat,vertco);
}
}
BLI_edgehashIterator_free(ehi);
/*map new vertices to faces*/
for (i=0; i<totface; i++) {
@@ -6601,15 +6609,15 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
orig_v4 = source.v4;
if(facepa[i]!=totpart && cfra <= pa->time)
mindex = totpart*totvert;
mindex = totvert+totpart;
else
mindex = facepa[i]*totvert;
mindex = totvert+facepa[i];
source.v1 = vertpa[mindex+source.v1];
source.v2 = vertpa[mindex+source.v2];
source.v3 = vertpa[mindex+source.v3];
source.v1 = edgesplit_get(vertpahash, source.v1, mindex);
source.v2 = edgesplit_get(vertpahash, source.v2, mindex);
source.v3 = edgesplit_get(vertpahash, source.v3, mindex);
if(source.v4)
source.v4 = vertpa[mindex+source.v4];
source.v4 = edgesplit_get(vertpahash, source.v4, mindex);
DM_copy_face_data(dm,explode,i,i,1);
@@ -6618,9 +6626,10 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
test_index_face(mf, &explode->faceData, i, (mf->v4 ? 4 : 3));
}
MEM_printmemlist_stats();
/* cleanup */
if(vertpa) MEM_freeN(vertpa);
BLI_edgehash_free(vertpahash, NULL);
/* finalization */
CDDM_calc_edges(explode);