27 |
|
|
28 |
|
typedef struct { |
29 |
|
COLOR v; /* hemisphere sample value */ |
30 |
< |
float d; /* reciprocal distance (1/rt) */ |
30 |
> |
float d; /* reciprocal distance */ |
31 |
|
FVECT p; /* intersection point */ |
32 |
|
} AMBSAMP; /* sample value */ |
33 |
|
|
131 |
|
dimlist[ndims++] = AI(hp,i,j) + 90171; |
132 |
|
rayvalue(&ar); /* evaluate ray */ |
133 |
|
ndims--; |
134 |
< |
if (ar.rt <= FTINY) |
134 |
> |
zd = raydistance(&ar); |
135 |
> |
if (zd <= FTINY) |
136 |
|
return(0); /* should never happen */ |
137 |
|
multcolor(ar.rcol, ar.rcoef); /* apply coefficient */ |
138 |
< |
if (ar.rt*ap->d < 1.0) /* new/closer distance? */ |
139 |
< |
ap->d = 1.0/ar.rt; |
138 |
> |
if (zd*ap->d < 1.0) /* new/closer distance? */ |
139 |
> |
ap->d = 1.0/zd; |
140 |
|
if (!n) { /* record first vertex & value */ |
141 |
< |
if (ar.rt > 10.0*thescene.cusize + 1000.) |
142 |
< |
ar.rt = 10.0*thescene.cusize + 1000.; |
143 |
< |
VSUM(ap->p, ar.rorg, ar.rdir, ar.rt); |
141 |
> |
if (zd > 10.0*thescene.cusize + 1000.) |
142 |
> |
zd = 10.0*thescene.cusize + 1000.; |
143 |
> |
VSUM(ap->p, ar.rorg, ar.rdir, zd); |
144 |
|
copycolor(ap->v, ar.rcol); |
145 |
|
} else { /* else update recorded value */ |
146 |
|
hp->acol[RED] -= colval(ap->v,RED); |
157 |
|
} |
158 |
|
|
159 |
|
|
160 |
< |
/* Estimate variance based on relative ambient division differences */ |
160 |
> |
/* Estimate variance based on ambient division differences */ |
161 |
|
static float * |
162 |
|
getambdiffs(AMBHEMI *hp) |
163 |
|
{ |
176 |
|
b = bright(ap[0].v); |
177 |
|
if (i) { /* from above */ |
178 |
|
b1 = bright(ap[-hp->ns].v); |
179 |
< |
d2 = (b - b1)/(b + b1); |
180 |
< |
d2 *= d2*normf; |
179 |
> |
d2 = b - b1; |
180 |
> |
d2 *= d2*normf/(b + b1); |
181 |
|
ep[0] += d2; |
182 |
|
ep[-hp->ns] += d2; |
183 |
|
} |
184 |
|
if (!j) continue; |
185 |
|
/* from behind */ |
186 |
|
b1 = bright(ap[-1].v); |
187 |
< |
d2 = (b - b1)/(b + b1); |
188 |
< |
d2 *= d2*normf; |
187 |
> |
d2 = b - b1; |
188 |
> |
d2 *= d2*normf/(b + b1); |
189 |
|
ep[0] += d2; |
190 |
|
ep[-1] += d2; |
191 |
|
if (!i) continue; |
192 |
|
/* diagonal */ |
193 |
|
b1 = bright(ap[-hp->ns-1].v); |
194 |
< |
d2 = (b - b1)/(b + b1); |
195 |
< |
d2 *= d2*normf; |
194 |
> |
d2 = b - b1; |
195 |
> |
d2 *= d2*normf/(b + b1); |
196 |
|
ep[0] += d2; |
197 |
|
ep[-hp->ns-1] += d2; |
198 |
|
} |
864 |
|
ndims--; |
865 |
|
multcolor(ar.rcol, ar.rcoef); /* apply coefficient */ |
866 |
|
addcolor(dp->v, ar.rcol); |
867 |
< |
/* use rt to improve gradient calc */ |
868 |
< |
if (ar.rt > FTINY && ar.rt < FHUGE) |
869 |
< |
dp->r += 1.0/ar.rt; |
867 |
> |
/* use rxt to improve gradient calc */ |
868 |
> |
if (ar.rxt > FTINY && ar.rxt < FHUGE) |
869 |
> |
dp->r += 1.0/ar.rxt; |
870 |
|
/* (re)initialize error */ |
871 |
|
if (dp->n++) { |
872 |
|
b2 = bright(dp->v)/dp->n - bright(ar.rcol); |