| 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 |
|
} |
| 394 |
|
nstarget = 1; |
| 395 |
|
} |
| 396 |
|
scolorblack(scol); |
| 397 |
< |
dimlist[ndims++] = (int)(size_t)np->mp; |
| 397 |
> |
dimlist[ndims_inc()] = (int)(size_t)np->mp; |
| 398 |
|
maxiter = MAXITER*nstarget; |
| 399 |
|
for (nstaken = ntrials = 0; nstaken < nstarget && |
| 400 |
|
ntrials < maxiter; ntrials++) { |
| 439 |
|
scalescolor(scol, d); |
| 440 |
|
saddscolor(np->rp->rcol, scol); |
| 441 |
|
} |
| 442 |
< |
ndims--; |
| 442 |
> |
dec_ndims(); |
| 443 |
|
} |
| 444 |
|
/* compute transmission */ |
| 445 |
|
copyscolor(sr.rcoef, np->mcolor); /* modified by color */ |
| 458 |
|
} else |
| 459 |
|
nstarget = 1; |
| 460 |
|
} |
| 461 |
< |
dimlist[ndims++] = (int)(size_t)np->mp; |
| 461 |
> |
dimlist[ndims_inc()] = (int)(size_t)np->mp; |
| 462 |
|
maxiter = MAXITER*nstarget; |
| 463 |
|
for (nstaken = ntrials = 0; nstaken < nstarget && |
| 464 |
|
ntrials < maxiter; ntrials++) { |
| 489 |
|
saddscolor(np->rp->rcol, sr.rcol); |
| 490 |
|
++nstaken; |
| 491 |
|
} |
| 492 |
< |
ndims--; |
| 492 |
> |
dec_ndims(); |
| 493 |
|
} |
| 494 |
|
} |