47 |
|
#define newambtree() (AMBTREE *)calloc(8, sizeof(AMBTREE)) |
48 |
|
|
49 |
|
|
50 |
+ |
setambres(ar) /* set ambient resolution */ |
51 |
+ |
int ar; |
52 |
+ |
{ |
53 |
+ |
/* set min & max radii */ |
54 |
+ |
if (ar <= 0) { |
55 |
+ |
minarad = 0.0; |
56 |
+ |
maxarad = thescene.cusize / 2.0; |
57 |
+ |
} else { |
58 |
+ |
minarad = thescene.cusize / ar; |
59 |
+ |
maxarad = 16.0 * minarad; /* heuristic */ |
60 |
+ |
if (maxarad > thescene.cusize / 2.0) |
61 |
+ |
maxarad = thescene.cusize / 2.0; |
62 |
+ |
} |
63 |
+ |
if (maxarad <= FTINY) |
64 |
+ |
maxarad = .001; |
65 |
+ |
} |
66 |
+ |
|
67 |
+ |
|
68 |
|
setambient(afile) /* initialize calculation */ |
69 |
|
char *afile; |
70 |
|
{ |
71 |
|
long ftell(); |
72 |
|
AMBVAL amb; |
73 |
< |
|
74 |
< |
maxarad = thescene.cusize / 2.0; /* maximum radius */ |
75 |
< |
/* minimum radius */ |
58 |
< |
minarad = ambres > 0 ? thescene.cusize/ambres : 0.0; |
59 |
< |
|
60 |
< |
/* open ambient file */ |
73 |
> |
/* init ambient limits */ |
74 |
> |
setambres(ambres); |
75 |
> |
/* open ambient file */ |
76 |
|
if (afile != NULL) |
77 |
|
if ((ambfp = fopen(afile, "r+")) != NULL) { |
78 |
|
while (fread((char *)&amb,sizeof(AMBVAL),1,ambfp) == 1) |
201 |
|
for (j = 0; j < 3; j++) |
202 |
|
d += (r->rop[j] - av->pos[j]) * |
203 |
|
(av->dir[j] + r->ron[j]); |
204 |
< |
if (d*0.5 < -minarad*ambacc) |
204 |
> |
if (d*0.5 < -minarad*ambacc-.001) |
205 |
|
continue; |
206 |
|
/* |
207 |
|
* Jittering final test reduces image artifacts. |
208 |
|
*/ |
209 |
|
wt = sqrt(e1) + sqrt(e2); |
210 |
< |
wt *= .9 + .2*frandom(); |
210 |
> |
wt *= .9 + .2*urand(9015+samplendx); |
211 |
|
if (wt > ambacc) |
212 |
|
continue; |
213 |
|
if (wt <= 1e-3) |