diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-01-23 16:35:51 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-01-23 16:35:51 +0300 |
commit | 52404cd114a96fbb49ded19f41fecdc86f369373 (patch) | |
tree | 81a6922407805e57dc9d4207c6245fa1625e2dd8 /source/blender/radiosity | |
parent | d4ae72c7c9b0c7bed08638c9716fcaf251ac42b5 (diff) |
Minor render memory usage optimization, removed layer and
radface from VlakRen, saves about 100mb for 10 million faces.
Diffstat (limited to 'source/blender/radiosity')
-rw-r--r-- | source/blender/radiosity/intern/source/radrender.c | 122 |
1 files changed, 65 insertions, 57 deletions
diff --git a/source/blender/radiosity/intern/source/radrender.c b/source/blender/radiosity/intern/source/radrender.c index ee52956bbd2..52e2b46d506 100644 --- a/source/blender/radiosity/intern/source/radrender.c +++ b/source/blender/radiosity/intern/source/radrender.c @@ -84,22 +84,23 @@ static float maxenergy; /* find the face with maximum energy to become shooter */ /* nb: _rr means rad-render version of existing radio call */ -static VlakRen *findshoot_rr(Render *re) +static void findshoot_rr(Render *re, VlakRen **shoot_p, RadFace **shootrf_p) { - RadFace *rf; + RadFace *rf, *shootrf, **radface; ObjectRen *obr; VlakRen *vlr=NULL, *shoot; float energy; int a; shoot= NULL; + shootrf= NULL; maxenergy= 0.0; for(obr=re->objecttable.first; obr; obr=obr->next) { for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface) { - rf= vlr->radface; + if((radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; rf->flag &= ~RAD_SHOOT; energy= rf->unshot[0]*rf->area; @@ -108,26 +109,31 @@ static VlakRen *findshoot_rr(Render *re) if(energy>maxenergy) { shoot= vlr; + shootrf= rf; maxenergy= energy; } } } } - if(shoot) { + if(shootrf) { maxenergy/= RG.totenergy; - if(maxenergy<RG.convergence) return NULL; - shoot->radface->flag |= RAD_SHOOT; + if(maxenergy<RG.convergence) { + *shoot_p= NULL; + *shootrf_p= NULL; + } + shootrf->flag |= RAD_SHOOT; } - return shoot; + *shoot_p= shoot; + *shootrf_p= shootrf; } -static void backface_test_rr(Render *re, VlakRen *shoot) +static void backface_test_rr(Render *re, VlakRen *shoot, RadFace *shootrf) { ObjectRen *obr; VlakRen *vlr=NULL; - RadFace *rf; + RadFace *rf, **radface; float tvec[3]; int a; @@ -135,9 +141,9 @@ static void backface_test_rr(Render *re, VlakRen *shoot) for(obr=re->objecttable.first; obr; obr=obr->next) { for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface && vlr!=shoot) { - rf= vlr->radface; - VecSubf(tvec, shoot->radface->cent, rf->cent); + if(vlr != shoot && (radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; + VecSubf(tvec, shootrf->cent, rf->cent); if(tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0) rf->flag |= RAD_BACKFACE; @@ -150,7 +156,7 @@ static void clear_backface_test_rr(Render *re) { ObjectRen *obr; VlakRen *vlr=NULL; - RadFace *rf; + RadFace *rf, **radface; int a; /* backface flag clear */ @@ -158,8 +164,8 @@ static void clear_backface_test_rr(Render *re) for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface) { - rf= vlr->radface; + if((radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; rf->flag &= ~RAD_BACKFACE; } } @@ -169,11 +175,11 @@ static void clear_backface_test_rr(Render *re) extern RadView hemitop, hemiside; // radfactors.c /* hemi-zbuffering, delivers formfactors array */ -static void makeformfactors_rr(Render *re, VlakRen *shoot) +static void makeformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf) { ObjectRen *obr; VlakRen *vlr=NULL; - RadFace *rf; + RadFace *rf, **radface; float len, vec[3], up[3], side[3], tar[5][3], *fp; int a; @@ -182,25 +188,25 @@ static void makeformfactors_rr(Render *re, VlakRen *shoot) /* set up hemiview */ /* first: upvector for hemitop, we use diagonal hemicubes to prevent aliasing */ - VecSubf(vec, shoot->v1->co, shoot->radface->cent); - Crossf(up, shoot->radface->norm, vec); + VecSubf(vec, shoot->v1->co, shootrf->cent); + Crossf(up, shootrf->norm, vec); len= Normalize(up); VECCOPY(hemitop.up, up); - VECCOPY(hemiside.up, shoot->radface->norm); + VECCOPY(hemiside.up, shootrf->norm); - Crossf(side, shoot->radface->norm, up); + Crossf(side, shootrf->norm, up); /* five targets */ - VecAddf(tar[0], shoot->radface->cent, shoot->radface->norm); - VecAddf(tar[1], shoot->radface->cent, up); - VecSubf(tar[2], shoot->radface->cent, up); - VecAddf(tar[3], shoot->radface->cent, side); - VecSubf(tar[4], shoot->radface->cent, side); + VecAddf(tar[0], shootrf->cent, shootrf->norm); + VecAddf(tar[1], shootrf->cent, up); + VecSubf(tar[2], shootrf->cent, up); + VecAddf(tar[3], shootrf->cent, side); + VecSubf(tar[4], shootrf->cent, side); /* camera */ - VECCOPY(hemiside.cam, shoot->radface->cent); - VECCOPY(hemitop.cam, shoot->radface->cent); + VECCOPY(hemiside.cam, shootrf->cent); + VECCOPY(hemitop.cam, shootrf->cent); /* do it! */ VECCOPY(hemitop.tar, tar[0]); @@ -218,10 +224,10 @@ static void makeformfactors_rr(Render *re, VlakRen *shoot) for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface) { - rf= vlr->radface; + if((radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; if(*fp!=0.0 && rf->area!=0.0) { - *fp *= shoot->radface->area/rf->area; + *fp *= shootrf->area/rf->area; if(*fp>1.0) *fp= 1.0001; } fp++; @@ -231,17 +237,17 @@ static void makeformfactors_rr(Render *re, VlakRen *shoot) } /* based at RG.formfactors array, distribute shoot energy over other faces */ -static void applyformfactors_rr(Render *re, VlakRen *shoot) +static void applyformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf) { ObjectRen *obr; VlakRen *vlr=NULL; - RadFace *rf; + RadFace *rf, **radface; float *fp, *ref, unr, ung, unb, r, g, b; int a; - unr= shoot->radface->unshot[0]; - ung= shoot->radface->unshot[1]; - unb= shoot->radface->unshot[2]; + unr= shootrf->unshot[0]; + ung= shootrf->unshot[1]; + unb= shootrf->unshot[2]; fp= RG.formfactors; @@ -249,8 +255,8 @@ static void applyformfactors_rr(Render *re, VlakRen *shoot) for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface) { - rf= vlr->radface; + if((radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; if(*fp!= 0.0) { ref= &(vlr->mat->r); @@ -274,7 +280,7 @@ static void applyformfactors_rr(Render *re, VlakRen *shoot) } } /* shoot energy has been shot */ - shoot->radface->unshot[0]= shoot->radface->unshot[1]= shoot->radface->unshot[2]= 0.0; + shootrf->unshot[0]= shootrf->unshot[1]= shootrf->unshot[2]= 0.0; } @@ -282,29 +288,30 @@ static void applyformfactors_rr(Render *re, VlakRen *shoot) static void progressiverad_rr(Render *re) { VlakRen *shoot; + RadFace *shootrf; float unshot[3]; int it= 0; - shoot= findshoot_rr(re); + findshoot_rr(re, &shoot, &shootrf); while( shoot ) { /* backfaces receive no energy, but are zbuffered... */ - backface_test_rr(re, shoot); + backface_test_rr(re, shoot, shootrf); /* ...unless it's two sided */ - if(shoot->radface->flag & RAD_TWOSIDED) { - VECCOPY(unshot, shoot->radface->unshot); - VecMulf(shoot->radface->norm, -1.0); - makeformfactors_rr(re, shoot); - applyformfactors_rr(re, shoot); - VecMulf(shoot->radface->norm, -1.0); - VECCOPY(shoot->radface->unshot, unshot); + if(shootrf->flag & RAD_TWOSIDED) { + VECCOPY(unshot, shootrf->unshot); + VecMulf(shootrf->norm, -1.0); + makeformfactors_rr(re, shoot, shootrf); + applyformfactors_rr(re, shoot, shootrf); + VecMulf(shootrf->norm, -1.0); + VECCOPY(shootrf->unshot, unshot); } /* hemi-zbuffers */ - makeformfactors_rr(re, shoot); + makeformfactors_rr(re, shoot, shootrf); /* based at RG.formfactors array, distribute shoot energy over other faces */ - applyformfactors_rr(re, shoot); + applyformfactors_rr(re, shoot, shootrf); it++; re->timecursor(it); @@ -314,7 +321,7 @@ static void progressiverad_rr(Render *re) if(re->test_break()) break; if(RG.maxiter && RG.maxiter<=it) break; - shoot= findshoot_rr(re); + findshoot_rr(re, &shoot, &shootrf); } printf(" Unshot energy:%f\n", 1000.0*maxenergy); @@ -327,7 +334,7 @@ static void initradfaces(Render *re) { ObjectRen *obr; VlakRen *vlr= NULL; - RadFace *rf; + RadFace *rf, **radface; int a, b; /* globals */ @@ -393,7 +400,8 @@ printf(" Rad elems: %d emittors %d\n", RG.totelem, RG.totpatch); // uncommented; this isnt satisfying, but i leave it in the code for now (ton) // if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED; - vlr->radface= rf++; + radface=RE_vlakren_get_radface(obr, vlr, 1); + *radface= rf++; } } } @@ -428,7 +436,7 @@ static void make_vertex_rad_values(Render *re) ObjectRen *obr; VertRen *v1=NULL; VlakRen *vlr=NULL; - RadFace *rf; + RadFace *rf, **radface; float *col; int a; @@ -440,8 +448,8 @@ static void make_vertex_rad_values(Render *re) for(a=0; a<obr->totvlak; a++) { if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr->radface) { - rf= vlr->radface; + if((radface=RE_vlakren_get_radface(obr, vlr, 0))) { + rf= *radface; /* apply correction */ rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma); |