diff options
4 files changed, 35 insertions, 9 deletions
diff --git a/source/blender/radiosity/extern/include/radio_types.h b/source/blender/radiosity/extern/include/radio_types.h index 4d5e56d7a15..910b50e4373 100644 --- a/source/blender/radiosity/extern/include/radio_types.h +++ b/source/blender/radiosity/extern/include/radio_types.h @@ -70,6 +70,7 @@ typedef struct RadView { #define RAD_SHOOT 2 #define RAD_SUBDIV 4 #define RAD_BACKFACE 8 +#define RAD_TWOSIDED 16 typedef struct RNode { /* length: 76 */ diff --git a/source/blender/radiosity/intern/source/radfactors.c b/source/blender/radiosity/intern/source/radfactors.c index fb66f994cbc..cbe861fa443 100644 --- a/source/blender/radiosity/intern/source/radfactors.c +++ b/source/blender/radiosity/intern/source/radfactors.c @@ -524,6 +524,7 @@ void rad_init_energy() void progressiverad() { RPatch *shoot; + float unshot[3]; int it= 0; rad_printstatus(); @@ -539,8 +540,16 @@ void progressiverad() drawpatch_ext(shoot, 0x88FF00); + if(shoot->first->f & RAD_TWOSIDED) { + VECCOPY(unshot, shoot->unshot); + VecMulf(shoot->norm, -1.0); + if(makeformfactors(shoot)) + applyformfactors(shoot); + VecMulf(shoot->norm, -1.0); + VECCOPY(shoot->unshot, unshot); + } + if( makeformfactors(shoot) ) { - applyformfactors(shoot); it++; diff --git a/source/blender/radiosity/intern/source/radpreprocess.c b/source/blender/radiosity/intern/source/radpreprocess.c index 80c6294db02..1f2f8bc2a89 100644 --- a/source/blender/radiosity/intern/source/radpreprocess.c +++ b/source/blender/radiosity/intern/source/radpreprocess.c @@ -459,6 +459,9 @@ void rad_collect_meshes() rp->emit[1]*= rp->ref[1]; rp->emit[2]*= rp->ref[2]; +// uncommented, this is not satisfying, but i leave it in code for now (ton) +// if(ma->translucency!=0.0) rn->f |= RAD_TWOSIDED; + nodevert= (VeNoCo **)&(rn->v1); for(b=0; b<rp->type; b++) { rp->cent[0]+= (*nodevert)->v[0]; diff --git a/source/blender/radiosity/intern/source/radrender.c b/source/blender/radiosity/intern/source/radrender.c index 61d069ce587..6c94d3f8da9 100644 --- a/source/blender/radiosity/intern/source/radrender.c +++ b/source/blender/radiosity/intern/source/radrender.c @@ -127,9 +127,8 @@ static void backface_test_rr(VlakRen *shoot) for(a=0; a<R.totvlak; a++) { if((a & 255)==0) vlr= R.blovl[a>>8]; else vlr++; if(vlr->radface) { - rf= vlr->radface; if(vlr!=shoot) { - + rf= vlr->radface; VecSubf(tvec, shoot->radface->cent, rf->cent); if( tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0) { @@ -244,7 +243,8 @@ static void applyformfactors_rr(VlakRen *shoot) r= (*fp)*unr*ref[0]; g= (*fp)*ung*ref[1]; b= (*fp)*unb*ref[2]; - + + // if(rf->flag & RAD_BACKFACE) { rf->totrad[0]+= r; rf->totrad[1]+= g; @@ -267,21 +267,32 @@ static void progressiverad_rr() { extern void RE_local_timecursor(int); // RE_callbacks.c VlakRen *shoot; + float unshot[3]; int it= 0; shoot= findshoot_rr(); while( shoot ) { - - /* backfaces receive no energy, but are zbuffered */ + + /* backfaces receive no energy, but are zbuffered... */ backface_test_rr(shoot); + + /* ...unless it's two sided */ + if(shoot->radface->flag & RAD_TWOSIDED) { + VECCOPY(unshot, shoot->radface->unshot); + VecMulf(shoot->radface->norm, -1.0); + makeformfactors_rr(shoot); + applyformfactors_rr(shoot); + VecMulf(shoot->radface->norm, -1.0); + VECCOPY(shoot->radface->unshot, unshot); + } + /* hemi-zbuffers */ makeformfactors_rr(shoot); /* based at RG.formfactors array, distribute shoot energy over other faces */ applyformfactors_rr(shoot); - + it++; RE_local_timecursor(it); - // printf("\r Radiosity step %d", it); fflush(stdout); clear_backface_test_rr(); @@ -359,7 +370,9 @@ printf(" Rad elems: %d emittors %d\n", RG.totelem, RG.totpatch); RG.min[b]= MIN2(RG.min[b], rf->cent[b]); RG.max[b]= MAX2(RG.max[b], rf->cent[b]); } - + +// 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++; } |