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

Comparing ray/src/ot/o_face.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:33:03 1989 UTC vs.
Revision 2.5 by schorsch, Tue Mar 30 16:13:00 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1986 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  o_face.c - routines for creating octrees for polygonal faces.
6   *
# Line 40 | Line 37 | static char SCCSid[] = "$SunId$ LBL";
37   *      5) If test 4 fails, we have no intersection.
38   */
39  
40 <
41 < o_face(o, cu)                   /* determine if face intersects cube */
42 < OBJREC  *o;
43 < CUBE  *cu;
40 > int
41 > o_face(         /* determine if face intersects cube */
42 >        OBJREC  *o,
43 >        CUBE  *cu
44 > )
45   {
46          FVECT  cumin, cumax;
47          FVECT  v1, v2;
# Line 54 | Line 52 | CUBE  *cu;
52                                  /* get face arguments */
53          f = getface(o);
54          if (f->area == 0.0)             /* empty face */
55 <                return(0);
55 >                return(O_MISS);
56                                          /* compute cube boundaries */
57          for (j = 0; j < 3; j++)
58 <                cumax[j] = (cumin[j] = cu->cuorg[j]) + cu->cusize;
58 >                cumax[j] = (cumin[j] = cu->cuorg[j]-FTINY)
59 >                                + cu->cusize + 2.0*FTINY;
60  
61          vloc = ABOVE | BELOW;           /* check vertices */
62          for (i = 0; i < f->nv; i++)
63 <                if (j = plocate(VERTEX(f,i), cumin, cumax))
63 >                if ( (j = plocate(VERTEX(f,i), cumin, cumax)) )
64                          vloc &= j;
65                  else
66 <                        return(1);      /* vertex inside */
66 >                        return(O_HIT);  /* vertex inside */
67  
68          if (vloc)                       /* all to one side */
69 <                return(0);
69 >                return(O_MISS);
70          
71          for (i = 0; i < f->nv; i++) {   /* check edges */
72                  if ((j = i + 1) >= f->nv)
# Line 75 | Line 74 | CUBE  *cu;
74                  VCOPY(v1, VERTEX(f,i));         /* clip modifies */
75                  VCOPY(v2, VERTEX(f,j));         /* the vertices! */
76                  if (clip(v1, v2, cumin, cumax))
77 <                        return(1);              /* edge inside */
77 >                        return(O_HIT);          /* edge inside */
78          }
79                                          /* see if cube cuts plane */
80          for (j = 0; j < 3; j++)
# Line 86 | Line 85 | CUBE  *cu;
85                          v1[j] = cumax[j];
86                          v2[j] = cumin[j];
87                  }
88 <        if ((d1 = DOT(v1, f->norm) - f->const) > FTINY)
89 <                return(0);
90 <        if ((d2 = DOT(v2, f->norm) - f->const) < -FTINY)
91 <                return(0);
88 >        if ((d1 = DOT(v1, f->norm) - f->offset) > FTINY)
89 >                return(O_MISS);
90 >        if ((d2 = DOT(v2, f->norm) - f->offset) < -FTINY)
91 >                return(O_MISS);
92                                          /* intersect face */
93          for (j = 0; j < 3; j++)
94                  v1[j] = (v1[j]*d2 - v2[j]*d1)/(d2 - d1);
95          if (inface(v1, f))
96 <                return(1);
96 >                return(O_HIT);
97          
98 <        return(0);              /* no intersection */
98 >        return(O_MISS);         /* no intersection */
99   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines