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

Comparing ray/src/ot/o_instance.c (file contents):
Revision 1.7 by greg, Sat Jan 5 09:41:26 1991 UTC vs.
Revision 2.6 by schorsch, Tue Mar 30 16:13:00 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 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_instance.c - routines for creating octrees for other octrees.
9 < *
10 < *     11/11/88
5 > *  o_instance.c - routines for creating octrees for other octrees
6   */
7  
8   #include  "standard.h"
9  
10   #include  "object.h"
11  
12 + #include  "octree.h"
13 +
14   #include  "instance.h"
15  
16 + #include  "mesh.h"
17 +
18   #include  "plocate.h"
19  
20   /*
# Line 41 | Line 40 | static char SCCSid[] = "$SunId$ LBL";
40   */
41  
42  
43 < o_instance(o, cu)                       /* determine if cubes intersect */
44 < OBJREC  *o;
45 < CUBE  *cu;
43 > static int o_cube(CUBE  *cu1, FULLXF  *fxf, CUBE  *cu);
44 >
45 >
46 > static int
47 > o_cube(                 /* determine if cubes intersect */
48 >        CUBE  *cu1,
49 >        FULLXF  *fxf,
50 >        CUBE  *cu
51 > )
52   {
53          static int  vstart[4] = {0, 3, 5, 6};
54          FVECT  cumin, cumax;
55          FVECT  vert[8];
56          FVECT  v1, v2;
52        register INSTANCE  *in;
57          int  vloc, vout;
58          register int  i, j;
55                                        /* get octree arguments */
56        in = getinstance(o, IO_BOUNDS);
59                                          /* check if cube vertex in octree */
60          for (j = 0; j < 3; j++)
61 <                cumax[j] = (cumin[j] = in->obj->scube.cuorg[j]) +
60 <                                in->obj->scube.cusize;
61 >                cumax[j] = (cumin[j] = cu1->cuorg[j]) + cu1->cusize;
62          vloc = ABOVE | BELOW;
63          vout = 0;
64          for (i = 0; i < 8; i++) {
# Line 66 | Line 67 | CUBE  *cu;
67                          if (i & 1<<j)
68                                  v1[j] += cu->cusize;
69                  }
70 <                multp3(v2, v1, in->x.b.xfm);
71 <                if (j = plocate(v2, cumin, cumax))
70 >                multp3(v2, v1, fxf->b.xfm);
71 >                if ( (j = plocate(v2, cumin, cumax)) )
72                          vout++;
73                  vloc &= j;
74          }
# Line 83 | Line 84 | CUBE  *cu;
84          vloc = ABOVE | BELOW;
85          for (i = 0; i < 8; i++) {
86                  for (j = 0; j < 3; j++) {
87 <                        v1[j] = in->obj->scube.cuorg[j];
87 >                        v1[j] = cu1->cuorg[j];
88                          if (i & 1<<j)
89 <                                v1[j] += in->obj->scube.cusize;
89 >                                v1[j] += cu1->cusize;
90                  }
91 <                multp3(vert[i], v1, in->x.f.xfm);
92 <                if (j = plocate(vert[i], cumin, cumax))
91 >                multp3(vert[i], v1, fxf->f.xfm);
92 >                if ( (j = plocate(vert[i], cumin, cumax)) )
93                          vloc &= j;
94                  else
95                          return(O_HIT);  /* vertex inside */
# Line 106 | Line 107 | CUBE  *cu;
107                  }
108  
109          return(O_MISS);                 /* no intersection */
110 + }
111 +
112 +
113 + int
114 + o_instance(                     /* determine if instance intersects */
115 +        OBJREC  *o,
116 +        CUBE  *cu
117 + )
118 + {
119 +        INSTANCE  *ins;
120 +                                        /* get octree bounds */
121 +        ins = getinstance(o, IO_BOUNDS);
122 +                                        /* call o_cube to do the work */
123 +        return(o_cube(&ins->obj->scube, &ins->x, cu));
124 + }
125 +
126 +
127 + int
128 + o_mesh(                         /* determine if mesh intersects */
129 +        OBJREC  *o,
130 +        CUBE  *cu
131 + )
132 + {
133 +        MESHINST        *mip;
134 +                                        /* get mesh bounds */
135 +        mip = getmeshinst(o, IO_BOUNDS);
136 +                                        /* call o_cube to do the work */
137 +        return(o_cube(&mip->msh->mcube, &mip->x, cu));
138   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines