ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/o_face.c
Revision: 2.2
Committed: Sat Feb 22 02:07:26 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.1: +1 -4 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.2 static const char RCSid[] = "$Id$";
3 greg 1.1 #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    
41     o_face(o, cu) /* determine if face intersects cube */
42     OBJREC *o;
43     CUBE *cu;
44     {
45     FVECT cumin, cumax;
46     FVECT v1, v2;
47     double d1, d2;
48     int vloc;
49     register FACE *f;
50     register int i, j;
51     /* get face arguments */
52     f = getface(o);
53     if (f->area == 0.0) /* empty face */
54 greg 1.3 return(O_MISS);
55 greg 1.1 /* compute cube boundaries */
56     for (j = 0; j < 3; j++)
57 greg 1.4 cumax[j] = (cumin[j] = cu->cuorg[j]-FTINY)
58     + cu->cusize + 2.0*FTINY;
59 greg 1.1
60     vloc = ABOVE | BELOW; /* check vertices */
61     for (i = 0; i < f->nv; i++)
62     if (j = plocate(VERTEX(f,i), cumin, cumax))
63     vloc &= j;
64     else
65 greg 1.3 return(O_HIT); /* vertex inside */
66 greg 1.1
67     if (vloc) /* all to one side */
68 greg 1.3 return(O_MISS);
69 greg 1.1
70     for (i = 0; i < f->nv; i++) { /* check edges */
71     if ((j = i + 1) >= f->nv)
72     j = 0; /* wrap around */
73     VCOPY(v1, VERTEX(f,i)); /* clip modifies */
74     VCOPY(v2, VERTEX(f,j)); /* the vertices! */
75     if (clip(v1, v2, cumin, cumax))
76 greg 1.3 return(O_HIT); /* edge inside */
77 greg 1.1 }
78     /* see if cube cuts plane */
79     for (j = 0; j < 3; j++)
80     if (f->norm[j] > 0.0) {
81     v1[j] = cumin[j];
82     v2[j] = cumax[j];
83     } else {
84     v1[j] = cumax[j];
85     v2[j] = cumin[j];
86     }
87 greg 1.2 if ((d1 = DOT(v1, f->norm) - f->offset) > FTINY)
88 greg 1.3 return(O_MISS);
89 greg 1.2 if ((d2 = DOT(v2, f->norm) - f->offset) < -FTINY)
90 greg 1.3 return(O_MISS);
91 greg 1.1 /* intersect face */
92     for (j = 0; j < 3; j++)
93     v1[j] = (v1[j]*d2 - v2[j]*d1)/(d2 - d1);
94     if (inface(v1, f))
95 greg 1.3 return(O_HIT);
96 greg 1.1
97 greg 1.3 return(O_MISS); /* no intersection */
98 greg 1.1 }