| 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 |  | * | 
| 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 | > | /* 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; | 
| 53 |  | /* get face arguments */ | 
| 54 |  | f = getface(o); | 
| 55 |  | if (f->area == 0.0)             /* empty face */ | 
| 56 | < | return(0); | 
| 56 | > | return(O_MISS); | 
| 57 |  | /* compute cube boundaries */ | 
| 58 |  | for (j = 0; j < 3; j++) | 
| 59 | < | cumax[j] = (cumin[j] = cu->cuorg[j]) + cu->cusize; | 
| 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)) | 
| 64 | > | if ( (j = plocate(VERTEX(f,i), cumin, cumax)) ) | 
| 65 |  | vloc &= j; | 
| 66 |  | else | 
| 67 | < | return(1);      /* vertex inside */ | 
| 67 | > | return(O_HIT);  /* vertex inside */ | 
| 68 |  |  | 
| 69 |  | if (vloc)                       /* all to one side */ | 
| 70 | < | return(0); | 
| 70 | > | return(O_MISS); | 
| 71 |  |  | 
| 72 |  | for (i = 0; i < f->nv; i++) {   /* check edges */ | 
| 73 |  | if ((j = i + 1) >= f->nv) | 
| 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(1);              /* edge inside */ | 
| 78 | > | return(O_HIT);          /* edge inside */ | 
| 79 |  | } | 
| 80 |  | /* see if cube cuts plane */ | 
| 81 |  | for (j = 0; j < 3; j++) | 
| 86 |  | v1[j] = cumax[j]; | 
| 87 |  | v2[j] = cumin[j]; | 
| 88 |  | } | 
| 89 | < | if ((d1 = DOT(v1, f->norm) - f->const) > FTINY) | 
| 90 | < | return(0); | 
| 91 | < | if ((d2 = DOT(v2, f->norm) - f->const) < -FTINY) | 
| 92 | < | return(0); | 
| 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(1); | 
| 97 | > | return(O_HIT); | 
| 98 |  |  | 
| 99 | < | return(0);              /* no intersection */ | 
| 99 | > | return(O_MISS);         /* no intersection */ | 
| 100 |  | } |