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

Comparing ray/src/hd/holo.c (file contents):
Revision 3.2 by gregl, Mon Nov 3 11:03:23 1997 UTC vs.
Revision 3.5 by gregl, Tue Nov 11 15:14:02 1997 UTC

# Line 104 | Line 104 | HDGRID *hproto;
104  
105  
106   hdbcoord(gc, hp, i)             /* compute beam coordinates from index */
107 < BCOORD  gc;             /* returned */
107 > GCOORD  gc[2];          /* returned */
108   register HOLO   *hp;
109   register int    i;
110   {
111          register int    j, n;
112          int     n2, reverse;
113 <        BCOORD  g2;
113 >        GCOORD  g2[2];
114                                          /* check range */
115          if (i < 1 | i > nbeams(hp))
116                  return(0);
# Line 150 | Line 150 | register int   i;
150   int
151   hdbindex(hp, gc)                /* compute index from beam coordinates */
152   register HOLO   *hp;
153 < register BCOORD gc;
153 > register GCOORD gc[2];
154   {
155 <        BCOORD  g2;
155 >        GCOORD  g2[2];
156          int     reverse;
157          register int    i, j;
158                                          /* check ordering and limits */
# Line 178 | Line 178 | register BCOORD        gc;
178   }
179  
180  
181 + hdcell(cp, hp, gc)              /* compute cell coordinates */
182 + register FVECT  cp[4];  /* returned (may be passed as FVECT cp[2][2]) */
183 + register HOLO   *hp;
184 + register GCOORD *gc;
185 + {
186 +        register FLOAT  *v;
187 +        double  d;
188 +                                        /* compute common component */
189 +        VCOPY(cp[0], hp->orig);
190 +        if (gc->w & 1) {
191 +                v = hp->xv[gc->w>>1];
192 +                cp[0][0] += v[0]; cp[0][1] += v[1]; cp[0][2] += v[2];
193 +        }
194 +        v = hp->xv[wg0[gc->w]];
195 +        d = (double)gc->i[0] / hp->grid[wg0[gc->w]];
196 +        VSUM(cp[0], cp[0], v, d);
197 +        v = hp->xv[wg1[gc->w]];
198 +        d = (double)gc->i[1] / hp->grid[wg1[gc->w]];
199 +        VSUM(cp[0], cp[0], v, d);
200 +                                        /* compute x1 sums */
201 +        v = hp->xv[wg0[gc->w]];
202 +        d = 1.0 / hp->grid[wg0[gc->w]];
203 +        VSUM(cp[1], cp[0], v, d);
204 +        VSUM(cp[3], cp[0], v, d);
205 +                                        /* compute y1 sums */
206 +        v = hp->xv[wg1[gc->w]];
207 +        d = 1.0 / hp->grid[wg1[gc->w]];
208 +        VSUM(cp[2], cp[0], v, d);
209 +        VSUM(cp[3], cp[3], v, d);
210 + }
211 +
212 +
213   hdlseg(lseg, hp, i)                     /* compute line segment for beam */
214   register int    lseg[2][3];
215   register HOLO   *hp;
216   int     i;
217   {
218 <        BCOORD  gc;
218 >        GCOORD  gc[2];
219          register int    k;
220  
221          if (!hdbcoord(gc, hp, i))               /* compute grid coordinates */
# Line 219 | Line 251 | double d;
251   double
252   hdray(ro, rd, hp, gc, r)        /* compute ray within a beam */
253   FVECT   ro, rd;         /* returned */
254 < register HOLO   *hp;
255 < register BCOORD gc;
254 > HOLO    *hp;
255 > GCOORD  gc[2];
256   BYTE    r[2][2];
257   {
258 <        FVECT   p[2];
259 <        register int    i;
260 <        register FLOAT  *v;
229 <        double  d;
258 >        FVECT   cp[4], p[2];
259 >        register int    i, j;
260 >        double  d0, d1;
261                                          /* compute entry and exit points */
262          for (i = 0; i < 2; i++) {
263 <                VCOPY(p[i], hp->orig);
264 <                if (gc[i].w & 1) {
265 <                        v = hp->xv[gc[i].w>>1];
266 <                        p[i][0] += *v++; p[i][1] += *v++; p[i][2] += *v;
267 <                }
268 <                d = ( gc[i].i[0] + (1./256.)*(r[i][0]+.5) ) /
238 <                                hp->grid[wg0[gc[i].w]];
239 <                v = hp->xv[wg0[gc[i].w]];
240 <                p[i][0] += d * *v++; p[i][1] += d * *v++; p[i][2] += d * *v;
241 <                d = (gc[i].i[1] + (1./256.)*(r[i][1]+.5)) /
242 <                                hp->grid[wg1[gc[i].w]];
243 <                v = hp->xv[wg1[gc[i].w]];
244 <                p[i][0] += d * *v++; p[i][1] += d * *v++; p[i][2] += d * *v;
263 >                hdcell(cp, hp, gc+i);
264 >                d0 = (1./256.)*(r[i][0]+.5);
265 >                d1 = (1./256.)*(r[i][1]+.5);
266 >                for (j = 0; j < 3; j++)
267 >                        p[i][j] = (1.-d0-d1)*cp[0][j] +
268 >                                        d0*cp[1][j] + d1*cp[2][j];
269          }
270          VCOPY(ro, p[0]);                /* assign ray origin and direction */
271          rd[0] = p[1][0] - p[0][0];
# Line 253 | Line 277 | BYTE   r[2][2];
277  
278   double
279   hdinter(gc, r, hp, ro, rd)      /* compute ray intersection with section */
280 < register BCOORD gc;     /* returned */
280 > register GCOORD gc[2];  /* returned */
281   BYTE    r[2][2];        /* returned */
282   register HOLO   *hp;
283   FVECT   ro, rd;         /* rd should be normalized */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines