600 |
|
const double ang_step = ang_res/((int)(16/PI*ang_res) + (1+FTINY)); |
601 |
|
double avg_d = 0; |
602 |
|
uint32 flgs = 0; |
603 |
+ |
FVECT vec; |
604 |
+ |
double u, v; |
605 |
+ |
double ang, a1; |
606 |
|
int i, j; |
607 |
|
/* don't bother for a few samples */ |
608 |
|
if (hp->ns < 12) |
620 |
|
for (i = 0; i < hp->ns; i++) |
621 |
|
for (j = 0; j < hp->ns; j += !i|(i==hp->ns-1) ? 1 : hp->ns-1) { |
622 |
|
AMBSAMP *ap = &ambsam(hp,i,j); |
620 |
– |
FVECT vec; |
621 |
– |
double u, v; |
622 |
– |
double ang, a1; |
623 |
– |
int abp; |
623 |
|
if ((ap->d <= FTINY) | (ap->d >= max_d)) |
624 |
|
continue; /* too far or too near */ |
625 |
|
VSUB(vec, ap->p, hp->rp->rop); |
631 |
|
for (a1 = ang-.5*ang_res; a1 <= ang+.5*ang_res; a1 += ang_step) |
632 |
|
flgs |= 1L<<(int)(16/PI*(a1 + 2.*PI*(a1 < 0))); |
633 |
|
} |
634 |
+ |
/* add low-angle incident (< 20deg) */ |
635 |
+ |
if (fabs(hp->rp->rod) <= 0.342) { |
636 |
+ |
u = -DOT(hp->rp->rdir, uv[0]); |
637 |
+ |
v = -DOT(hp->rp->rdir, uv[1]); |
638 |
+ |
if ((r0*r0*u*u + r1*r1*v*v) > hp->rp->rot*hp->rp->rot) { |
639 |
+ |
ang = atan2a(v, u); |
640 |
+ |
ang += 2.*PI*(ang < 0); |
641 |
+ |
ang *= 16/PI; |
642 |
+ |
if ((ang < .5) | (ang >= 31.5)) |
643 |
+ |
flgs |= 0x80000001; |
644 |
+ |
else |
645 |
+ |
flgs |= 3L<<(int)(ang-.5); |
646 |
+ |
} |
647 |
+ |
} |
648 |
|
return(flgs); |
649 |
|
} |
650 |
|
|