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

Comparing ray/src/rt/raytrace.c (file contents):
Revision 2.56 by greg, Mon Aug 22 21:54:41 2005 UTC vs.
Revision 2.63 by greg, Wed Apr 6 00:14:26 2011 UTC

# Line 17 | Line 17 | static const char RCSid[] = "$Id$";
17  
18   #define  MAXCSET        ((MAXSET+1)*2-1)        /* maximum check set size */
19  
20 < unsigned long  raynum = 0;              /* next unique ray number */
21 < unsigned long  nrays = 0;               /* number of calls to localhit */
20 > RNUMBER  raynum = 0;            /* next unique ray number */
21 > RNUMBER  nrays = 0;             /* number of calls to localhit */
22  
23   static RREAL  Lambfa[5] = {PI, PI, PI, 0.0, 0.0};
24   OBJREC  Lamb = {
25          OVOID, MAT_PLASTIC, "Lambertian",
26 <        {0, 5, NULL, Lambfa}, NULL,
26 >        {NULL, Lambfa, 0, 5}, NULL
27   };                                      /* a Lambertian surface */
28  
29   OBJREC  Aftplane;                       /* aft clipping plane object */
# Line 93 | Line 93 | rayorigin(             /* start new ray from old one */
93                                  colval(ro->cext,RED) : colval(ro->cext,GRN);
94                  if (colval(ro->cext,BLU) < re) re = colval(ro->cext,BLU);
95                  re *= ro->rot;
96 <                if (re > 0.1)
97 <                        if (re > 92.)
96 >                if (re > 0.1) {
97 >                        if (re > 92.) {
98                                  r->rweight = 0.0;
99 <                        else
99 >                        } else {
100                                  r->rweight *= exp(-re);
101 +                        }
102 +                }
103          }
104          rayclear(r);
105          if (r->rweight <= 0.0)                  /* check for expiration */
# Line 302 | Line 304 | raymixture(            /* mix modifiers */
304                                          /* foreground */
305          fr = *r;
306          if (coef > FTINY) {
307 +                fr.rweight *= coef;
308                  scalecolor(fr.rcoef, coef);
309                  foremat = rayshade(&fr, fore);
310          }
311                                          /* background */
312          br = *r;
313          if (coef < 1.0-FTINY) {
314 +                br.rweight *= 1.0-coef;
315                  scalecolor(br.rcoef, 1.0-coef);
316                  backmat = rayshade(&br, back);
317          }
# Line 357 | Line 361 | raydist(               /* compute (cumulative) ray distance */
361  
362   extern void
363   raycontrib(             /* compute (cumulative) ray contribution */
364 <        double  rc[3],
364 >        RREAL  rc[3],
365          const RAY  *r,
366          int  flags
367   )
# Line 508 | Line 512 | localhit(              /* check for hit in the octree */
512                  else if (r->rdir[i] < -1e-7)
513                          sflags |= 0x10 << i;
514          }
515 <        if (sflags == 0)
516 <                error(CONSISTENCY, "zero ray direction in localhit");
515 >        if (!sflags) {
516 >                error(WARNING, "zero ray direction in localhit");
517 >                return(0);
518 >        }
519                                          /* start off assuming nothing hit */
520          if (r->rmax > FTINY) {          /* except aft plane if one */
521                  r->ro = &Aftplane;
522                  r->rot = r->rmax;
523 <                for (i = 0; i < 3; i++)
518 <                        r->rop[i] = r->rorg[i] + r->rot*r->rdir[i];
523 >                VSUM(r->rop, r->rorg, r->rdir, r->rot);
524          }
525                                          /* find global cube entrance point */
526          t = 0.0;
# Line 538 | Line 543 | localhit(              /* check for hit in the octree */
543                  if (t >= r->rot)        /* clipped already */
544                          return(0);
545                                          /* advance position */
546 <                for (i = 0; i < 3; i++)
542 <                        curpos[i] += r->rdir[i]*t;
546 >                VSUM(curpos, curpos, r->rdir, t);
547  
548                  if (!incube(scene, curpos))     /* non-intersecting ray */
549                          return(0);
# Line 630 | Line 634 | raymove(               /* check for hit as we move */
634                          ax = 2;
635                  }
636          }
637 <        pos[0] += r->rdir[0]*t;
634 <        pos[1] += r->rdir[1]*t;
635 <        pos[2] += r->rdir[2]*t;
637 >        VSUM(pos, pos, r->rdir, t);
638          return(ax);
639   }
640  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines