ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/o_face.c
Revision: 2.4
Committed: Sat Mar 27 12:41:45 2004 UTC (20 years, 7 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.3: +7 -5 lines
Log Message:
Continued ANSIfication. Renamed local initotypes() to ot_initotypes().

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: o_face.c,v 2.3 2003/07/27 22:12:03 schorsch Exp $";
3 #endif
4 /*
5 * o_face.c - routines for creating octrees for polygonal faces.
6 *
7 * 8/27/85
8 */
9
10 #include "standard.h"
11
12 #include "octree.h"
13
14 #include "object.h"
15
16 #include "face.h"
17
18 #include "plocate.h"
19
20 /*
21 * The algorithm for determining a face's intersection
22 * with a cube is relatively straightforward:
23 *
24 * 1) Check to see if any vertices are inside the cube
25 * (intersection).
26 *
27 * 2) Check to see if all vertices are to one side of
28 * cube (no intersection).
29 *
30 * 3) Check to see if any portion of any edge is inside
31 * cube (intersection).
32 *
33 * 4) Check to see if the cube cuts the plane of the
34 * face and one of its edges passes through
35 * the face (intersection).
36 *
37 * 5) If test 4 fails, we have no intersection.
38 */
39
40 /* XXX this is extern, but not declared in any header file yet */
41 int
42 o_face( /* determine if face intersects cube */
43 OBJREC *o,
44 CUBE *cu
45 )
46 {
47 FVECT cumin, cumax;
48 FVECT v1, v2;
49 double d1, d2;
50 int vloc;
51 register FACE *f;
52 register int i, j;
53 /* get face arguments */
54 f = getface(o);
55 if (f->area == 0.0) /* empty face */
56 return(O_MISS);
57 /* compute cube boundaries */
58 for (j = 0; j < 3; j++)
59 cumax[j] = (cumin[j] = cu->cuorg[j]-FTINY)
60 + cu->cusize + 2.0*FTINY;
61
62 vloc = ABOVE | BELOW; /* check vertices */
63 for (i = 0; i < f->nv; i++)
64 if ( (j = plocate(VERTEX(f,i), cumin, cumax)) )
65 vloc &= j;
66 else
67 return(O_HIT); /* vertex inside */
68
69 if (vloc) /* all to one side */
70 return(O_MISS);
71
72 for (i = 0; i < f->nv; i++) { /* check edges */
73 if ((j = i + 1) >= f->nv)
74 j = 0; /* wrap around */
75 VCOPY(v1, VERTEX(f,i)); /* clip modifies */
76 VCOPY(v2, VERTEX(f,j)); /* the vertices! */
77 if (clip(v1, v2, cumin, cumax))
78 return(O_HIT); /* edge inside */
79 }
80 /* see if cube cuts plane */
81 for (j = 0; j < 3; j++)
82 if (f->norm[j] > 0.0) {
83 v1[j] = cumin[j];
84 v2[j] = cumax[j];
85 } else {
86 v1[j] = cumax[j];
87 v2[j] = cumin[j];
88 }
89 if ((d1 = DOT(v1, f->norm) - f->offset) > FTINY)
90 return(O_MISS);
91 if ((d2 = DOT(v2, f->norm) - f->offset) < -FTINY)
92 return(O_MISS);
93 /* intersect face */
94 for (j = 0; j < 3; j++)
95 v1[j] = (v1[j]*d2 - v2[j]*d1)/(d2 - d1);
96 if (inface(v1, f))
97 return(O_HIT);
98
99 return(O_MISS); /* no intersection */
100 }