| 32 |
|
#define SPA_REFL 01 /* has reflected specular component */ |
| 33 |
|
#define SPA_FLAT 02 /* reflecting surface is flat */ |
| 34 |
|
#define SPA_RBLT 010 /* reflection below sample threshold */ |
| 35 |
– |
#define SPA_BADU 020 /* bad u direction calculation */ |
| 35 |
|
|
| 36 |
|
typedef struct { |
| 37 |
|
OBJREC *mp; /* material pointer */ |
| 92 |
|
scalecolor(ctmp, dtmp); |
| 93 |
|
addcolor(cval, ctmp); |
| 94 |
|
|
| 95 |
< |
if ((np->specfl & (SPA_REFL|SPA_BADU)) != SPA_REFL) |
| 95 |
> |
if (!(np->specfl & SPA_REFL)) |
| 96 |
|
return; |
| 97 |
|
/* |
| 98 |
|
* Compute specular reflection coefficient |
| 208 |
|
errno = 0; |
| 209 |
|
for (i = 0; i < 3; i++) |
| 210 |
|
np->u[i] = evalue(mf->ep[i]); |
| 211 |
< |
if ((errno == EDOM) | (errno == ERANGE)) { |
| 212 |
< |
objerror(np->mp, WARNING, "compute error"); |
| 214 |
< |
np->specfl |= SPA_BADU; |
| 215 |
< |
return; |
| 216 |
< |
} |
| 211 |
> |
if ((errno == EDOM) | (errno == ERANGE)) |
| 212 |
> |
np->u[0] = np->u[1] = np->u[2] = 0.0; |
| 213 |
|
if (mf->fxp != &unitxf) |
| 214 |
|
multv3(np->u, np->u, mf->fxp->xfm); |
| 215 |
|
fcross(np->v, np->pnorm, np->u); |
| 216 |
|
if (normalize(np->v) == 0.0) { |
| 217 |
< |
objerror(np->mp, WARNING, "illegal orientation vector"); |
| 218 |
< |
np->specfl |= SPA_BADU; |
| 219 |
< |
return; |
| 220 |
< |
} |
| 221 |
< |
fcross(np->u, np->v, np->pnorm); |
| 217 |
> |
if (fabs(np->u_power - np->v_power) > 0.1) |
| 218 |
> |
objerror(np->mp, WARNING, "bad orientation vector"); |
| 219 |
> |
getperpendicular(np->u, np->pnorm, 1); /* punting */ |
| 220 |
> |
fcross(np->v, np->pnorm, np->u); |
| 221 |
> |
np->u_power = np->v_power = |
| 222 |
> |
2./(1./(np->u_power+1e-5) + 1./(np->v_power+1e-5)); |
| 223 |
> |
} else |
| 224 |
> |
fcross(np->u, np->v, np->pnorm); |
| 225 |
|
} |
| 226 |
|
|
| 227 |
|
|
| 234 |
|
FVECT h; |
| 235 |
|
double rv[2], dtmp; |
| 236 |
|
double cosph, sinph, costh, sinth; |
| 238 |
– |
COLOR scol; |
| 237 |
|
int maxiter, ntrials, nstarget, nstaken; |
| 238 |
|
int i; |
| 239 |
|
|
| 240 |
< |
if (np->specfl & SPA_BADU || |
| 243 |
< |
rayorigin(&sr, SPECULAR, np->rp, np->scolor) < 0) |
| 240 |
> |
if (rayorigin(&sr, SPECULAR, np->rp, np->scolor) < 0) |
| 241 |
|
return; |
| 242 |
|
|
| 243 |
|
nstarget = 1; |