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) |
78 |
> |
while (readambval(&amb, ambfp)) |
79 |
|
avinsert(&amb, &atrunk, thescene.cuorg, |
80 |
|
thescene.cusize); |
81 |
|
/* align */ |
82 |
< |
fseek(ambfp, -(ftell(ambfp)%sizeof(AMBVAL)), 1); |
82 |
> |
fseek(ambfp, -(ftell(ambfp)%AMBVALSIZ), 1); |
83 |
|
} else if ((ambfp = fopen(afile, "w")) == NULL) { |
84 |
|
sprintf(errmsg, "cannot open ambient file \"%s\"", |
85 |
|
afile); |
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) |
305 |
|
#endif |
306 |
|
if (ambfp == NULL) |
307 |
|
return; |
308 |
< |
if (fwrite((char *)av, sizeof(AMBVAL), 1, ambfp) != 1) |
308 |
> |
if (writambval(av, ambfp) < 0) |
309 |
|
goto writerr; |
310 |
|
#ifdef AMBFLUSH |
311 |
|
if (++nunflshed >= AMBFLUSH) { |