--- ray/src/hd/holo.c 1997/11/06 16:37:45 3.3 +++ ray/src/hd/holo.c 1997/11/11 15:14:02 3.5 @@ -178,6 +178,38 @@ register GCOORD gc[2]; } +hdcell(cp, hp, gc) /* compute cell coordinates */ +register FVECT cp[4]; /* returned (may be passed as FVECT cp[2][2]) */ +register HOLO *hp; +register GCOORD *gc; +{ + register FLOAT *v; + double d; + /* compute common component */ + VCOPY(cp[0], hp->orig); + if (gc->w & 1) { + v = hp->xv[gc->w>>1]; + cp[0][0] += v[0]; cp[0][1] += v[1]; cp[0][2] += v[2]; + } + v = hp->xv[wg0[gc->w]]; + d = (double)gc->i[0] / hp->grid[wg0[gc->w]]; + VSUM(cp[0], cp[0], v, d); + v = hp->xv[wg1[gc->w]]; + d = (double)gc->i[1] / hp->grid[wg1[gc->w]]; + VSUM(cp[0], cp[0], v, d); + /* compute x1 sums */ + v = hp->xv[wg0[gc->w]]; + d = 1.0 / hp->grid[wg0[gc->w]]; + VSUM(cp[1], cp[0], v, d); + VSUM(cp[3], cp[0], v, d); + /* compute y1 sums */ + v = hp->xv[wg1[gc->w]]; + d = 1.0 / hp->grid[wg1[gc->w]]; + VSUM(cp[2], cp[0], v, d); + VSUM(cp[3], cp[3], v, d); +} + + hdlseg(lseg, hp, i) /* compute line segment for beam */ register int lseg[2][3]; register HOLO *hp; @@ -219,29 +251,21 @@ double d; double hdray(ro, rd, hp, gc, r) /* compute ray within a beam */ FVECT ro, rd; /* returned */ -register HOLO *hp; -register GCOORD gc[2]; +HOLO *hp; +GCOORD gc[2]; BYTE r[2][2]; { - FVECT p[2]; - register int i; - register FLOAT *v; - double d; + FVECT cp[4], p[2]; + register int i, j; + double d0, d1; /* compute entry and exit points */ for (i = 0; i < 2; i++) { - VCOPY(p[i], hp->orig); - if (gc[i].w & 1) { - v = hp->xv[gc[i].w>>1]; - p[i][0] += *v++; p[i][1] += *v++; p[i][2] += *v; - } - d = ( gc[i].i[0] + (1./256.)*(r[i][0]+.5) ) / - hp->grid[wg0[gc[i].w]]; - v = hp->xv[wg0[gc[i].w]]; - p[i][0] += d * *v++; p[i][1] += d * *v++; p[i][2] += d * *v; - d = (gc[i].i[1] + (1./256.)*(r[i][1]+.5)) / - hp->grid[wg1[gc[i].w]]; - v = hp->xv[wg1[gc[i].w]]; - p[i][0] += d * *v++; p[i][1] += d * *v++; p[i][2] += d * *v; + hdcell(cp, hp, gc+i); + d0 = (1./256.)*(r[i][0]+.5); + d1 = (1./256.)*(r[i][1]+.5); + for (j = 0; j < 3; j++) + p[i][j] = (1.-d0-d1)*cp[0][j] + + d0*cp[1][j] + d1*cp[2][j]; } VCOPY(ro, p[0]); /* assign ray origin and direction */ rd[0] = p[1][0] - p[0][0];