| 25 |
|
#define MINADIV 7 /* minimum # divisions in each dimension */ |
| 26 |
|
#endif |
| 27 |
|
|
| 28 |
– |
extern void SDsquare2disk(double ds[2], double seedx, double seedy); |
| 29 |
– |
|
| 28 |
|
typedef struct { |
| 29 |
|
COLOR v; /* hemisphere sample value */ |
| 30 |
|
float d; /* reciprocal distance */ |
| 98 |
|
AMBSAMP *ap = &ambsam(hp,i,j); |
| 99 |
|
RAY ar; |
| 100 |
|
int hlist[3], ii; |
| 101 |
< |
double spt[2], zd; |
| 101 |
> |
RREAL spt[2]; |
| 102 |
> |
double zd; |
| 103 |
|
/* generate hemispherical sample */ |
| 104 |
|
/* ambient coefficient for weight */ |
| 105 |
|
if (ambacc > FTINY) |
| 117 |
|
hlist[2] = i; |
| 118 |
|
multisamp(spt, 2, urand(ilhash(hlist,3)+n)); |
| 119 |
|
resample: |
| 120 |
< |
SDsquare2disk(spt, (j+spt[1])/hp->ns, (i+spt[0])/hp->ns); |
| 120 |
> |
square2disk(spt, (j+spt[1])/hp->ns, (i+spt[0])/hp->ns); |
| 121 |
|
zd = sqrt(1. - spt[0]*spt[0] - spt[1]*spt[1]); |
| 122 |
|
for (ii = 3; ii--; ) |
| 123 |
|
ar.rdir[ii] = spt[0]*hp->ux[ii] + |
| 178 |
|
if (i) { /* from above */ |
| 179 |
|
b1 = bright(ap[-hp->ns].v); |
| 180 |
|
d2 = b - b1; |
| 181 |
< |
d2 *= d2*normf/(b + b1); |
| 181 |
> |
d2 *= d2*normf/(b + b1 + FTINY); |
| 182 |
|
ep[0] += d2; |
| 183 |
|
ep[-hp->ns] += d2; |
| 184 |
|
} |
| 186 |
|
/* from behind */ |
| 187 |
|
b1 = bright(ap[-1].v); |
| 188 |
|
d2 = b - b1; |
| 189 |
< |
d2 *= d2*normf/(b + b1); |
| 189 |
> |
d2 *= d2*normf/(b + b1 + FTINY); |
| 190 |
|
ep[0] += d2; |
| 191 |
|
ep[-1] += d2; |
| 192 |
|
if (!i) continue; |
| 193 |
|
/* diagonal */ |
| 194 |
|
b1 = bright(ap[-hp->ns-1].v); |
| 195 |
|
d2 = b - b1; |
| 196 |
< |
d2 *= d2*normf/(b + b1); |
| 196 |
> |
d2 *= d2*normf/(b + b1 + FTINY); |
| 197 |
|
ep[0] += d2; |
| 198 |
|
ep[-hp->ns-1] += d2; |
| 199 |
|
} |