191 |
|
} |
192 |
|
|
193 |
|
|
194 |
< |
m_brdf(m, r) /* color a ray which hit a BRDTF material */ |
194 |
> |
m_brdf(m, r) /* color a ray which hit a BRDTfunc material */ |
195 |
|
register OBJREC *m; |
196 |
|
register RAY *r; |
197 |
|
{ |
200 |
|
double transtest, transdist; |
201 |
|
int hasrefl, hastrans; |
202 |
|
COLOR ctmp; |
203 |
+ |
FVECT vtmp; |
204 |
|
register MFUNC *mf; |
205 |
|
register int i; |
206 |
|
/* check arguments */ |
290 |
|
} |
291 |
|
/* compute ambient */ |
292 |
|
if (hasrefl) { |
293 |
< |
if (nd.pdot < 0.0) |
293 |
> |
if (nd.pdot < 0.0) { |
294 |
|
flipsurface(r); |
295 |
< |
ambient(ctmp, r); |
295 |
> |
vtmp[0] = -nd.pnorm[0]; |
296 |
> |
vtmp[1] = -nd.pnorm[1]; |
297 |
> |
vtmp[2] = -nd.pnorm[2]; |
298 |
> |
} else |
299 |
> |
VCOPY(vtmp, nd.pnorm); |
300 |
> |
ambient(ctmp, r, vtmp); |
301 |
|
multcolor(ctmp, nd.rdiff); |
302 |
|
addcolor(r->rcol, ctmp); /* add to returned color */ |
303 |
|
if (nd.pdot < 0.0) |
304 |
|
flipsurface(r); |
305 |
|
} |
306 |
|
if (hastrans) { /* from other side */ |
307 |
< |
if (nd.pdot > 0.0) |
307 |
> |
if (nd.pdot > 0.0) { |
308 |
|
flipsurface(r); |
309 |
< |
ambient(ctmp, r); |
309 |
> |
vtmp[0] = -nd.pnorm[0]; |
310 |
> |
vtmp[1] = -nd.pnorm[1]; |
311 |
> |
vtmp[2] = -nd.pnorm[2]; |
312 |
> |
} else |
313 |
> |
VCOPY(vtmp, nd.pnorm); |
314 |
> |
ambient(ctmp, r, vtmp); |
315 |
|
multcolor(ctmp, nd.tdiff); |
316 |
|
addcolor(r->rcol, ctmp); |
317 |
|
if (nd.pdot > 0.0) |
334 |
|
{ |
335 |
|
BRDFDAT nd; |
336 |
|
COLOR ctmp; |
337 |
+ |
FVECT vtmp; |
338 |
|
double dtmp; |
339 |
|
/* always a shadow */ |
340 |
|
if (r->crtype & SHADOW) |
389 |
|
} |
390 |
|
/* compute ambient */ |
391 |
|
if (nd.trans < 1.0-FTINY) { |
392 |
< |
ambient(ctmp, r); |
392 |
> |
ambient(ctmp, r, nd.pnorm); |
393 |
|
scalecolor(ctmp, 1.0-nd.trans); |
394 |
|
multcolor(ctmp, nd.mcolor); /* modified by material color */ |
395 |
|
addcolor(r->rcol, ctmp); /* add to returned color */ |
396 |
|
} |
397 |
|
if (nd.trans > FTINY) { /* from other side */ |
398 |
|
flipsurface(r); |
399 |
< |
ambient(ctmp, r); |
399 |
> |
vtmp[0] = -nd.pnorm[0]; |
400 |
> |
vtmp[1] = -nd.pnorm[1]; |
401 |
> |
vtmp[2] = -nd.pnorm[2]; |
402 |
> |
ambient(ctmp, r, vtmp); |
403 |
|
scalecolor(ctmp, nd.trans); |
404 |
|
multcolor(ctmp, nd.mcolor); |
405 |
|
addcolor(r->rcol, ctmp); |