ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/ashikhmin.c
(Generate patch)

Comparing ray/src/rt/ashikhmin.c (file contents):
Revision 2.1 by greg, Sun Jul 29 19:01:39 2012 UTC vs.
Revision 2.3 by greg, Wed Aug 7 05:10:09 2013 UTC

# Line 47 | Line 47 | typedef struct {
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   {
# Line 115 | Line 110 | dirashik(              /* compute source contribution */
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);
# Line 183 | Line 178 | m_ashikhmin(                   /* shade ray that hit something anisotr
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 */                
# Line 203 | Line 198 | m_ashikhmin(                   /* shade ray that hit something anisotr
198  
199   static void
200   getacoords_as(          /* set up coordinate system */
206        RAY  *r,
201          ASHIKDAT  *np
202   )
203   {
# Line 211 | Line 205 | getacoords_as(         /* set up coordinate system */
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]);
# Line 234 | Line 228 | getacoords_as(         /* set up coordinate system */
228  
229   static void
230   ashiksamp(              /* sample anisotropic Ashikhmin-Shirley specular */
237        RAY  *r,
231          ASHIKDAT  *np
232   )
233   {
# Line 242 | Line 235 | ashiksamp(             /* sample anisotropic Ashikhmin-Shirley sp
235          FVECT  h;
236          double  rv[2], dtmp;
237          double  cosph, sinph, costh, sinth;
245        COLOR   scol;
238          int  maxiter, ntrials, nstarget, nstaken;
239          int  i;
240  
241          if (np->specfl & SPA_BADU ||
242 <                        rayorigin(&sr, SPECULAR, r, np->scolor) < 0)
242 >                        rayorigin(&sr, SPECULAR, np->rp, np->scolor) < 0)
243                  return;
244  
245          nstarget = 1;
246          if (specjitter > 1.5) {                 /* multiple samples? */
247 <                nstarget = specjitter*r->rweight + .5;
247 >                nstarget = specjitter*np->rp->rweight + .5;
248                  if (sr.rweight <= minweight*nstarget)
249                          nstarget = sr.rweight/minweight;
250                  if (nstarget > 1) {
# Line 269 | Line 261 | ashiksamp(             /* sample anisotropic Ashikhmin-Shirley sp
261                  if (ntrials)
262                          dtmp = frandom();
263                  else
264 <                        dtmp = urand(ilhash(dimlist,ndims)+1823+samplendx);
264 >                        dtmp = urand(ilhash(dimlist,ndims)+647+samplendx);
265                  multisamp(rv, 2, dtmp);
266                  dtmp = 2.*PI * rv[0];
267 <                cosph = sqrt(np->u_power + 1.) * tcos(dtmp);
268 <                sinph = sqrt(np->v_power + 1.) * tsin(dtmp);
269 <                dtmp = 1./(cosph*cosph + sinph*sinph);
267 >                cosph = sqrt(np->v_power + 1.) * tcos(dtmp);
268 >                sinph = sqrt(np->u_power + 1.) * tsin(dtmp);
269 >                dtmp = 1./sqrt(cosph*cosph + sinph*sinph);
270                  cosph *= dtmp;
271                  sinph *= dtmp;
272                  costh = pow(rv[1], 1./(np->u_power*cosph*cosph+np->v_power*sinph*sinph+1.));
# Line 286 | Line 278 | ashiksamp(             /* sample anisotropic Ashikhmin-Shirley sp
278  
279                  if (nstaken)
280                          rayclear(&sr);
281 <                dtmp = -2.*DOT(h, r->rdir);
282 <                VSUM(sr.rdir, r->rdir, h, dtmp);                                
281 >                dtmp = -2.*DOT(h, np->rp->rdir);
282 >                VSUM(sr.rdir, np->rp->rdir, h, dtmp);                          
283                                                  /* sample rejection test */
284 <                if (DOT(sr.rdir, r->ron) <= FTINY)
284 >                if (DOT(sr.rdir, np->rp->ron) <= FTINY)
285                          continue;
286 +                checknorm(sr.rdir);
287                  rayvalue(&sr);
288                  multcolor(sr.rcol, sr.rcoef);
289 <                addcolor(r->rcol, sr.rcol);
289 >                addcolor(np->rp->rcol, sr.rcol);
290                  ++nstaken;
291          }
292          ndims--;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines