56 |
|
short specfl; /* specularity flags, defined above */ |
57 |
|
SCOLOR mcolor; /* color of this material */ |
58 |
|
SCOLOR scolor; /* color of specular component */ |
59 |
– |
FVECT vrefl; /* vector in direction of reflected ray */ |
59 |
|
FVECT prdir; /* vector in transmitted direction */ |
60 |
|
double alpha2; /* roughness squared */ |
61 |
|
double rdiff, rspec; /* reflected specular, diffuse */ |
134 |
|
dtmp = np->alpha2; |
135 |
|
/* + source if flat */ |
136 |
|
if (np->specfl & SP_FLAT) |
137 |
< |
dtmp += omega * (0.25/PI); |
137 |
> |
dtmp += (1. - dstrsrc) * omega * (0.25/PI); |
138 |
|
/* half vector */ |
139 |
|
VSUB(vtmp, ldir, np->rp->rdir); |
140 |
|
d2 = DOT(vtmp, np->pnorm); |
225 |
|
VCOPY(nd.pnorm, r->ron); |
226 |
|
nd.pdot = r->rod; |
227 |
|
} |
228 |
< |
if (r->ro != NULL && isflat(r->ro->otype)) |
228 |
> |
if (!hastexture && r->ro != NULL && isflat(r->ro->otype)) |
229 |
|
nd.specfl |= SP_FLAT; |
230 |
|
if (nd.pdot < .001) |
231 |
|
nd.pdot = .001; /* non-zero for dirnorm() */ |
303 |
|
/* check threshold */ |
304 |
|
if (!(nd.specfl & SP_PURE) && specthresh >= nd.rspec-FTINY) |
305 |
|
nd.specfl |= SP_RBLT; |
307 |
– |
/* compute reflected ray */ |
308 |
– |
VSUM(nd.vrefl, r->rdir, nd.pnorm, 2.*nd.pdot); |
309 |
– |
/* penetration? */ |
310 |
– |
if (hastexture && DOT(nd.vrefl, r->ron) <= FTINY) |
311 |
– |
VSUM(nd.vrefl, r->rdir, r->ron, 2.*r->rod); |
312 |
– |
checknorm(nd.vrefl); |
306 |
|
} |
307 |
|
/* reflected ray */ |
308 |
|
if ((nd.specfl&(SP_REFL|SP_PURE|SP_RBLT)) == (SP_REFL|SP_PURE)) { |
309 |
|
RAY lr; |
310 |
|
if (rayorigin(&lr, REFLECTED, r, nd.scolor) == 0) { |
311 |
< |
VCOPY(lr.rdir, nd.vrefl); |
311 |
> |
/* compute reflected ray */ |
312 |
> |
VSUM(lr.rdir, r->rdir, nd.pnorm, 2.*nd.pdot); |
313 |
> |
/* penetration? */ |
314 |
> |
if (hastexture && DOT(lr.rdir, r->ron) <= FTINY) |
315 |
> |
VSUM(lr.rdir, r->rdir, r->ron, 2.*r->rod); |
316 |
> |
checknorm(lr.rdir); |
317 |
|
rayvalue(&lr); |
318 |
|
smultscolor(lr.rcol, lr.rcoef); |
319 |
|
copyscolor(r->mcol, lr.rcol); |
320 |
|
saddscolor(r->rcol, lr.rcol); |
321 |
|
r->rmt = r->rot; |
322 |
< |
if (nd.specfl & SP_FLAT && |
325 |
< |
!hastexture | (r->crtype & AMBIENT)) |
322 |
> |
if (nd.specfl & SP_FLAT && r->crtype & AMBIENT) |
323 |
|
r->rmt += raydistance(&lr); |
324 |
|
} |
325 |
|
} |
335 |
|
scalescolor(sctmp, nd.rdiff); |
336 |
|
if (nd.specfl & SP_RBLT) /* add in specular as well? */ |
337 |
|
saddscolor(sctmp, nd.scolor); |
338 |
< |
multambient(sctmp, r, hastexture ? nd.pnorm : r->ron); |
338 |
> |
multambient(sctmp, r, nd.pnorm); |
339 |
|
saddscolor(r->rcol, sctmp); /* add to returned color */ |
340 |
|
} |
341 |
|
if (nd.tdiff > FTINY) { /* ambient from other side */ |
342 |
+ |
FVECT bnorm; |
343 |
|
copyscolor(sctmp, nd.mcolor); /* modified by color */ |
344 |
|
if (nd.specfl & SP_TBLT) { |
345 |
|
scalescolor(sctmp, nd.trans); |
346 |
|
} else { |
347 |
|
scalescolor(sctmp, nd.tdiff); |
348 |
|
} |
349 |
< |
flipsurface(r); |
350 |
< |
if (hastexture) { |
351 |
< |
FVECT bnorm; |
352 |
< |
bnorm[0] = -nd.pnorm[0]; |
355 |
< |
bnorm[1] = -nd.pnorm[1]; |
356 |
< |
bnorm[2] = -nd.pnorm[2]; |
357 |
< |
multambient(sctmp, r, bnorm); |
358 |
< |
} else |
359 |
< |
multambient(sctmp, r, r->ron); |
349 |
> |
bnorm[0] = -nd.pnorm[0]; |
350 |
> |
bnorm[1] = -nd.pnorm[1]; |
351 |
> |
bnorm[2] = -nd.pnorm[2]; |
352 |
> |
multambient(sctmp, r, bnorm); |
353 |
|
saddscolor(r->rcol, sctmp); |
361 |
– |
flipsurface(r); |
354 |
|
} |
355 |
|
/* add direct component */ |
356 |
|
direct(r, dirnorm, &nd); |
380 |
|
fcross(v, np->pnorm, u); |
381 |
|
/* compute reflection */ |
382 |
|
if ((np->specfl & (SP_REFL|SP_RBLT)) == SP_REFL && |
383 |
< |
rayorigin(&sr, SPECULAR, np->rp, np->scolor) == 0) { |
383 |
> |
rayorigin(&sr, RSPECULAR, np->rp, np->scolor) == 0) { |
384 |
|
nstarget = 1; |
385 |
|
if (specjitter > 1.5) { /* multiple samples? */ |
386 |
|
nstarget = specjitter*np->rp->rweight + .5; |
445 |
|
copyscolor(sr.rcoef, np->mcolor); /* modified by color */ |
446 |
|
scalescolor(sr.rcoef, np->tspec); |
447 |
|
if ((np->specfl & (SP_TRAN|SP_TBLT)) == SP_TRAN && |
448 |
< |
rayorigin(&sr, SPECULAR, np->rp, sr.rcoef) == 0) { |
448 |
> |
rayorigin(&sr, TSPECULAR, np->rp, sr.rcoef) == 0) { |
449 |
|
nstarget = 1; |
450 |
|
if (specjitter > 1.5) { /* multiple samples? */ |
451 |
|
nstarget = specjitter*np->rp->rweight + .5; |