265
269
/* main loop for itterations */
266
static void progressiverad_rr()
270
static void progressiverad_rr(Render *re)
268
extern void RE_local_timecursor(int); // RE_callbacks.c
273
shoot= findshoot_rr();
276
shoot= findshoot_rr(re);
276
279
/* backfaces receive no energy, but are zbuffered... */
277
backface_test_rr(shoot);
280
backface_test_rr(re, shoot);
279
282
/* ...unless it's two sided */
280
283
if(shoot->radface->flag & RAD_TWOSIDED) {
281
284
VECCOPY(unshot, shoot->radface->unshot);
282
285
VecMulf(shoot->radface->norm, -1.0);
283
makeformfactors_rr(shoot);
284
applyformfactors_rr(shoot);
286
makeformfactors_rr(re, shoot);
287
applyformfactors_rr(re, shoot);
285
288
VecMulf(shoot->radface->norm, -1.0);
286
289
VECCOPY(shoot->radface->unshot, unshot);
289
292
/* hemi-zbuffers */
290
makeformfactors_rr(shoot);
293
makeformfactors_rr(re, shoot);
291
294
/* based at RG.formfactors array, distribute shoot energy over other faces */
292
applyformfactors_rr(shoot);
295
applyformfactors_rr(re, shoot);
295
RE_local_timecursor(it);
297
clear_backface_test_rr();
299
if(blender_test_break()) break;
300
clear_backface_test_rr(re);
302
if(re->test_break()) break;
300
303
if(RG.maxiter && RG.maxiter<=it) break;
302
shoot= findshoot_rr();
305
shoot= findshoot_rr(re);
304
307
printf(" Unshot energy:%f\n", 1000.0*maxenergy);
306
RE_local_timecursor((G.scene->r.cfra));
309
re->timecursor((G.scene->r.cfra));
309
312
static RadFace *radfaces=NULL;
311
static void initradfaces(void)
314
static void initradfaces(Render *re)
313
316
VlakRen *vlr= NULL;
403
/* unused now, doesnt work... */
404
static void filter_rad_values(void)
409
float n1[3], n2[3], n3[4], n4[3], co[4];
412
/* one filter pass */
413
for(a=0; a<R.totvert; a++) {
414
if((a & 255)==0) v1= R.blove[a>>8]; else v1++;
416
v1->rad[0]= v1->rad[0]/v1->accum;
417
v1->rad[1]= v1->rad[1]/v1->accum;
418
v1->rad[2]= v1->rad[2]/v1->accum;
422
/* cosines in verts accumulate in faces */
423
for(a=0; a<R.totvlak; a++) {
424
if((a & 255)==0) vlr= R.blovl[a>>8]; else vlr++;
429
/* calculate cosines of angles, for weighted add (irregular faces) */
430
VecSubf(n1, vlr->v2->co, vlr->v1->co);
431
VecSubf(n2, vlr->v3->co, vlr->v2->co);
436
VecSubf(n3, vlr->v1->co, vlr->v3->co);
439
co[0]= saacos(-n3[0]*n1[0]-n3[1]*n1[1]-n3[2]*n1[2])/M_PI;
440
co[1]= saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2])/M_PI;
441
co[2]= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2])/M_PI;
442
co[0]= co[1]= co[2]= 1.0/3.0;
445
VecSubf(n3, vlr->v4->co, vlr->v3->co);
446
VecSubf(n4, vlr->v1->co, vlr->v4->co);
450
co[0]= saacos(-n4[0]*n1[0]-n4[1]*n1[1]-n4[2]*n1[2])/M_PI;
451
co[1]= saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2])/M_PI;
452
co[2]= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2])/M_PI;
453
co[3]= saacos(-n3[0]*n4[0]-n3[1]*n4[1]-n3[2]*n4[2])/M_PI;
454
co[0]= co[1]= co[2]= co[3]= 1.0/4.0;
457
rf->totrad[0]= rf->totrad[1]= rf->totrad[2]= 0.0;
459
vecaddfac(rf->totrad, rf->totrad, vlr->v1->rad, co[0]);
460
vecaddfac(rf->totrad, rf->totrad, vlr->v2->rad, co[1]);
461
vecaddfac(rf->totrad, rf->totrad, vlr->v3->rad, co[2]);
463
vecaddfac(rf->totrad, rf->totrad, vlr->v4->rad, co[3]);
468
/* accumulate vertexcolors again */
469
for(a=0; a<R.totvlak; a++) {
470
if((a & 255)==0) vlr= R.blovl[a>>8]; else vlr++;
475
vecaddfac(vlr->v1->rad, vlr->v1->rad, rf->totrad, rf->area);
476
vlr->v1->accum+= rf->area;
477
vecaddfac(vlr->v2->rad, vlr->v2->rad, rf->totrad, rf->area);
478
vlr->v2->accum+= rf->area;
479
vecaddfac(vlr->v3->rad, vlr->v3->rad, rf->totrad, rf->area);
480
vlr->v3->accum+= rf->area;
482
vecaddfac(vlr->v4->rad, vlr->v4->rad, rf->totrad, rf->area);
483
vlr->v4->accum+= rf->area;
491
static void make_vertex_rad_values()
405
/* unused now, doesnt work..., find it in cvs of nov 2005 or older */
406
/* static void filter_rad_values(void) */
409
static void make_vertex_rad_values(Render *re)
498
417
RG.igamma= 1.0/RG.gamma;
499
418
RG.radfactor= RG.radfac*pow(64*64, RG.igamma)/128.0; /* compatible with radio-tool */
501
420
/* accumulate vertexcolors */
502
for(a=0; a<R.totvlak; a++) {
503
if((a & 255)==0) vlr= R.blovl[a>>8]; else vlr++;
421
for(a=0; a<re->totvlak; a++) {
422
if((a & 255)==0) vlr= re->blovl[a>>8]; else vlr++;
505
424
if(vlr->radface) {
506
425
rf= vlr->radface;
515
434
if(vlr->mat->g > 0.0) rf->totrad[1]/= vlr->mat->g;
516
435
if(vlr->mat->b > 0.0) rf->totrad[2]/= vlr->mat->b;
518
vecaddfac(vlr->v1->rad, vlr->v1->rad, rf->totrad, rf->area);
519
vlr->v1->accum+= rf->area;
520
vecaddfac(vlr->v2->rad, vlr->v2->rad, rf->totrad, rf->area);
521
vlr->v2->accum+= rf->area;
522
vecaddfac(vlr->v3->rad, vlr->v3->rad, rf->totrad, rf->area);
523
vlr->v3->accum+= rf->area;
437
col= RE_vertren_get_rad(re, vlr->v1, 1);
438
vecaddfac(col, col, rf->totrad, rf->area);
441
col= RE_vertren_get_rad(re, vlr->v2, 1);
442
vecaddfac(col, col, rf->totrad, rf->area);
445
col= RE_vertren_get_rad(re, vlr->v3, 1);
446
vecaddfac(col, col, rf->totrad, rf->area);
525
vecaddfac(vlr->v4->rad, vlr->v4->rad, rf->totrad, rf->area);
526
vlr->v4->accum+= rf->area;
450
col= RE_vertren_get_rad(re, vlr->v4, 1);
451
vecaddfac(col, col, rf->totrad, rf->area);
531
457
/* make vertex colors */
532
for(a=0; a<R.totvert; a++) {
533
if((a & 255)==0) v1= R.blove[a>>8]; else v1++;
535
v1->rad[0]/= v1->accum;
536
v1->rad[1]/= v1->accum;
537
v1->rad[2]/= v1->accum;
458
for(a=0; a<re->totvert; a++) {
459
if((a & 255)==0) v1= RE_findOrAddVert(re, a); else v1++;
461
col= RE_vertren_get_rad(re, v1, 0);
462
if(col && col[3]>0.0) {
543
471
/* main call, extern */
544
void do_radio_render(void)
472
void do_radio_render(Render *re)
546
474
if(G.scene->radio==NULL) add_radio();
547
475
freeAllRad(); /* just in case radio-tool is still used */
549
477
set_radglobal(); /* init the RG struct */
551
initradfaces(); /* add radface structs to render faces */
478
RG.re= re; /* only used by hemizbuf(), prevents polluting radio code all over */
480
initradfaces(re); /* add radface structs to render faces */
552
481
if(RG.totenergy>0.0) {
554
483
initradiosity(); /* LUT's */
555
484
inithemiwindows(); /* views, need RG.maxsize for clipping */
557
progressiverad_rr(); /* main radio loop */
486
progressiverad_rr(re); /* main radio loop */
559
make_vertex_rad_values(); /* convert face energy to vertex ones */
488
make_vertex_rad_values(re); /* convert face energy to vertex ones */