47 |
|
double pdot; /* perturbed dot product */ |
48 |
|
} ASHIKDAT; /* anisotropic material data */ |
49 |
|
|
50 |
< |
static void getacoords_as(RAY *r, ASHIKDAT *np); |
51 |
< |
static void ashiksamp(RAY *r, ASHIKDAT *np); |
50 |
> |
static void getacoords_as(ASHIKDAT *np); |
51 |
> |
static void ashiksamp(ASHIKDAT *np); |
52 |
|
|
53 |
+ |
#undef MAX |
54 |
+ |
#define MAX(a,b) ((a)>(b) ? (a) : (b)) |
55 |
|
|
54 |
– |
static double |
55 |
– |
max(double a, double b) { |
56 |
– |
if (a > b) |
57 |
– |
return(a); |
58 |
– |
return(b); |
59 |
– |
} |
56 |
|
|
61 |
– |
|
57 |
|
static double |
58 |
|
schlick_fres(double dprod) |
59 |
|
{ |
110 |
|
dtmp = DOT(np->pnorm, h); |
111 |
|
dtmp = pow(dtmp, (dtmp1+dtmp2)/(1.-dtmp*dtmp)); |
112 |
|
dtmp *= sqrt((np->u_power+1.)*(np->v_power+1.)); |
113 |
< |
dtmp /= 8.*PI * DOT(ldir,h) * max(ldot,np->pdot); |
113 |
> |
dtmp /= 8.*PI * DOT(ldir,h) * MAX(ldot,np->pdot); |
114 |
|
/* worth using? */ |
115 |
|
if (dtmp > FTINY) { |
116 |
|
copycolor(ctmp, np->scolor); |
178 |
|
if (r->ro != NULL && isflat(r->ro->otype)) |
179 |
|
nd.specfl |= SPA_FLAT; |
180 |
|
/* set up coordinates */ |
181 |
< |
getacoords_as(r, &nd); |
181 |
> |
getacoords_as(&nd); |
182 |
|
/* specular sampling? */ |
183 |
|
if ((nd.specfl & (SPA_REFL|SPA_RBLT)) == SPA_REFL) |
184 |
< |
ashiksamp(r, &nd); |
184 |
> |
ashiksamp(&nd); |
185 |
|
/* diffuse interreflection */ |
186 |
|
if (bright(nd.mcolor) > FTINY) { |
187 |
|
copycolor(ctmp, nd.mcolor); /* modified by material color */ |
198 |
|
|
199 |
|
static void |
200 |
|
getacoords_as( /* set up coordinate system */ |
206 |
– |
RAY *r, |
201 |
|
ASHIKDAT *np |
202 |
|
) |
203 |
|
{ |
205 |
|
int i; |
206 |
|
|
207 |
|
mf = getfunc(np->mp, 3, 0x7, 1); |
208 |
< |
setfunc(np->mp, r); |
208 |
> |
setfunc(np->mp, np->rp); |
209 |
|
errno = 0; |
210 |
|
for (i = 0; i < 3; i++) |
211 |
|
np->u[i] = evalue(mf->ep[i]); |
228 |
|
|
229 |
|
static void |
230 |
|
ashiksamp( /* sample anisotropic Ashikhmin-Shirley specular */ |
237 |
– |
RAY *r, |
231 |
|
ASHIKDAT *np |
232 |
|
) |
233 |
|
{ |
240 |
|
int i; |
241 |
|
|
242 |
|
if (np->specfl & SPA_BADU || |
243 |
< |
rayorigin(&sr, SPECULAR, r, np->scolor) < 0) |
243 |
> |
rayorigin(&sr, SPECULAR, np->rp, np->scolor) < 0) |
244 |
|
return; |
245 |
|
|
246 |
|
nstarget = 1; |
247 |
|
if (specjitter > 1.5) { /* multiple samples? */ |
248 |
< |
nstarget = specjitter*r->rweight + .5; |
248 |
> |
nstarget = specjitter*np->rp->rweight + .5; |
249 |
|
if (sr.rweight <= minweight*nstarget) |
250 |
|
nstarget = sr.rweight/minweight; |
251 |
|
if (nstarget > 1) { |
262 |
|
if (ntrials) |
263 |
|
dtmp = frandom(); |
264 |
|
else |
265 |
< |
dtmp = urand(ilhash(dimlist,ndims)+1823+samplendx); |
265 |
> |
dtmp = urand(ilhash(dimlist,ndims)+647+samplendx); |
266 |
|
multisamp(rv, 2, dtmp); |
267 |
|
dtmp = 2.*PI * rv[0]; |
268 |
< |
cosph = sqrt(np->u_power + 1.) * tcos(dtmp); |
269 |
< |
sinph = sqrt(np->v_power + 1.) * tsin(dtmp); |
270 |
< |
dtmp = 1./(cosph*cosph + sinph*sinph); |
268 |
> |
cosph = sqrt(np->v_power + 1.) * tcos(dtmp); |
269 |
> |
sinph = sqrt(np->u_power + 1.) * tsin(dtmp); |
270 |
> |
dtmp = 1./sqrt(cosph*cosph + sinph*sinph); |
271 |
|
cosph *= dtmp; |
272 |
|
sinph *= dtmp; |
273 |
|
costh = pow(rv[1], 1./(np->u_power*cosph*cosph+np->v_power*sinph*sinph+1.)); |
279 |
|
|
280 |
|
if (nstaken) |
281 |
|
rayclear(&sr); |
282 |
< |
dtmp = -2.*DOT(h, r->rdir); |
283 |
< |
VSUM(sr.rdir, r->rdir, h, dtmp); |
282 |
> |
dtmp = -2.*DOT(h, np->rp->rdir); |
283 |
> |
VSUM(sr.rdir, np->rp->rdir, h, dtmp); |
284 |
|
/* sample rejection test */ |
285 |
< |
if (DOT(sr.rdir, r->ron) <= FTINY) |
285 |
> |
if (DOT(sr.rdir, np->rp->ron) <= FTINY) |
286 |
|
continue; |
287 |
+ |
checknorm(sr.rdir); |
288 |
|
rayvalue(&sr); |
289 |
|
multcolor(sr.rcol, sr.rcoef); |
290 |
< |
addcolor(r->rcol, sr.rcol); |
290 |
> |
addcolor(np->rp->rcol, sr.rcol); |
291 |
|
++nstaken; |
292 |
|
} |
293 |
|
ndims--; |