204 |
|
int hitfront = 1; |
205 |
|
BRDFDAT nd; |
206 |
|
RAY sr; |
207 |
+ |
double mirtest=0, mirdist=0; |
208 |
|
double transtest, transdist; |
209 |
|
int hasrefl, hastrans; |
210 |
+ |
int hastexture; |
211 |
|
COLOR ctmp; |
212 |
|
FVECT vtmp; |
213 |
+ |
double d; |
214 |
|
register MFUNC *mf; |
215 |
|
register int i; |
216 |
|
/* check arguments */ |
236 |
|
m->oargs.farg[8]); |
237 |
|
/* get modifiers */ |
238 |
|
raytexture(r, m->omod); |
239 |
< |
nd.pdot = raynormal(nd.pnorm, r); /* perturb normal */ |
239 |
> |
hastexture = DOT(r->pert,r->pert) > FTINY*FTINY; |
240 |
> |
if (hastexture) { /* perturb normal */ |
241 |
> |
nd.pdot = raynormal(nd.pnorm, r); |
242 |
> |
} else { |
243 |
> |
VCOPY(nd.pnorm, r->ron); |
244 |
> |
nd.pdot = r->rod; |
245 |
> |
} |
246 |
|
if (r->rod < 0.0) { /* orient perturbed values */ |
247 |
|
nd.pdot = -nd.pdot; |
248 |
|
for (i = 0; i < 3; i++) { |
261 |
|
mf = getfunc(m, 9, 0x3f, 0); |
262 |
|
/* compute transmitted ray */ |
263 |
|
setbrdfunc(&nd); |
255 |
– |
transtest = 0; |
256 |
– |
transdist = r->rot; |
264 |
|
errno = 0; |
265 |
|
setcolor(ctmp, evalue(mf->ep[3]), |
266 |
|
evalue(mf->ep[4]), |
268 |
|
if (errno == EDOM || errno == ERANGE) |
269 |
|
objerror(m, WARNING, "compute error"); |
270 |
|
else if (rayorigin(&sr, r, TRANS, bright(ctmp)) == 0) { |
271 |
< |
if (!(r->crtype & SHADOW) && |
265 |
< |
DOT(r->pert,r->pert) > FTINY*FTINY) { |
271 |
> |
if (!(r->crtype & SHADOW) && hastexture) { |
272 |
|
for (i = 0; i < 3; i++) /* perturb direction */ |
273 |
|
sr.rdir[i] = r->rdir[i] - .75*r->pert[i]; |
274 |
|
if (normalize(sr.rdir) == 0.0) { |
277 |
|
} |
278 |
|
} else { |
279 |
|
VCOPY(sr.rdir, r->rdir); |
274 |
– |
transtest = 2; |
280 |
|
} |
281 |
|
rayvalue(&sr); |
282 |
|
multcolor(sr.rcol, ctmp); |
283 |
|
addcolor(r->rcol, sr.rcol); |
284 |
< |
transtest *= bright(sr.rcol); |
285 |
< |
transdist = r->rot + sr.rt; |
284 |
> |
if (!hastexture) { |
285 |
> |
transtest = 2.0*bright(sr.rcol); |
286 |
> |
transdist = r->rot + sr.rt; |
287 |
> |
} |
288 |
|
} |
289 |
|
if (r->crtype & SHADOW) /* the rest is shadow */ |
290 |
|
return(1); |
302 |
|
rayvalue(&sr); |
303 |
|
multcolor(sr.rcol, ctmp); |
304 |
|
addcolor(r->rcol, sr.rcol); |
305 |
+ |
if (!hastexture && r->ro != NULL && isflat(r->ro->otype)) { |
306 |
+ |
mirtest = 2.0*bright(sr.rcol); |
307 |
+ |
mirdist = r->rot + sr.rt; |
308 |
+ |
} |
309 |
|
} |
310 |
|
/* compute ambient */ |
311 |
|
if (hasrefl) { |
331 |
|
} |
332 |
|
if (hasrefl | hastrans || m->oargs.sarg[6][0] != '0') |
333 |
|
direct(r, dirbrdf, &nd); /* add direct component */ |
334 |
< |
/* check distance */ |
335 |
< |
if (transtest > bright(r->rcol)) |
334 |
> |
|
335 |
> |
d = bright(r->rcol); /* set effective distance */ |
336 |
> |
if (transtest > d) |
337 |
|
r->rt = transdist; |
338 |
+ |
else if (mirtest > d) |
339 |
+ |
r->rt = mirdist; |
340 |
|
|
341 |
|
return(1); |
342 |
|
} |