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 |
+ |
} |
64 |
+ |
|
65 |
+ |
|
66 |
|
setambient(afile) /* initialize calculation */ |
67 |
|
char *afile; |
68 |
|
{ |
69 |
|
long ftell(); |
70 |
|
AMBVAL amb; |
71 |
< |
|
72 |
< |
maxarad = thescene.cusize / 2.0; /* maximum radius */ |
73 |
< |
/* minimum radius */ |
58 |
< |
minarad = ambres > 0 ? thescene.cusize/ambres : 0.0; |
59 |
< |
|
60 |
< |
/* open ambient file */ |
71 |
> |
/* init ambient limits */ |
72 |
> |
setambres(ambres); |
73 |
> |
/* open ambient file */ |
74 |
|
if (afile != NULL) |
75 |
|
if ((ambfp = fopen(afile, "r+")) != NULL) { |
76 |
|
while (fread((char *)&amb,sizeof(AMBVAL),1,ambfp) == 1) |
199 |
|
for (j = 0; j < 3; j++) |
200 |
|
d += (r->rop[j] - av->pos[j]) * |
201 |
|
(av->dir[j] + r->ron[j]); |
202 |
< |
if (d*0.5 < -minarad*ambacc) |
202 |
> |
if (d*0.5 < -minarad*ambacc-.001) |
203 |
|
continue; |
204 |
|
/* |
205 |
|
* Jittering final test reduces image artifacts. |
206 |
|
*/ |
207 |
|
wt = sqrt(e1) + sqrt(e2); |
208 |
< |
wt *= .9 + .2*frandom(); |
208 |
> |
wt *= .9 + .2*urand(9015+samplendx); |
209 |
|
if (wt > ambacc) |
210 |
|
continue; |
211 |
|
if (wt <= 1e-3) |
248 |
|
FVECT gp, gd; |
249 |
|
/* compute weight */ |
250 |
|
amb.weight = pow(AVGREFL, (double)al); |
251 |
< |
if (r->rweight < 0.1*amb.weight) /* heuristic */ |
251 |
> |
if (r->rweight < 0.2*amb.weight) /* heuristic */ |
252 |
|
amb.weight = r->rweight; |
253 |
|
/* compute ambient */ |
254 |
|
amb.rad = doambient(acol, r, amb.weight, gp, gd); |