--- ray/src/hd/holo.c 1997/11/11 17:03:28 3.6 +++ ray/src/hd/holo.c 1998/01/03 15:55:55 3.12 @@ -199,16 +199,13 @@ register GCOORD *gc; } -hdlseg(lseg, hp, i) /* compute line segment for beam */ +hdlseg(lseg, hp, gc) /* compute line segment for beam */ register int lseg[2][3]; register HOLO *hp; -int i; +GCOORD gc[2]; { - GCOORD gc[2]; register int k; - if (!hdbcoord(gc, hp, i)) /* compute grid coordinates */ - return(0); for (k = 0; k < 2; k++) { /* compute end points */ lseg[k][gc[k].w>>1] = gc[k].w&1 ? hp->grid[gc[k].w>>1]-1 : 0 ; lseg[k][wg0[gc[k].w]] = gc[k].i[0]; @@ -224,7 +221,7 @@ HOLO *hp; double d; { double tl = hp->tlin; - register unsigned c; + register long c; if (d <= 0.) return(0); @@ -232,8 +229,8 @@ double d; return(DCINF); if (d < tl) return((unsigned)(d*DCLIN/tl)); - c = (unsigned)(log(d/tl)/logstep) + DCLIN; - return(c > DCINF ? DCINF : c); + c = (long)(log(d/tl)/logstep) + DCLIN; + return(c > DCINF ? (unsigned)DCINF : (unsigned)c); } @@ -253,6 +250,24 @@ FVECT wp; } +hdworld(wp, hp, gp) /* compute world coordinates */ +register FVECT wp; +register HOLO *hp; +FVECT gp; +{ + register double d; + + d = gp[0]/hp->grid[0]; + VSUM(wp, hp->orig, hp->xv[0], d); + + d = gp[1]/hp->grid[1]; + VSUM(wp, wp, hp->xv[1], d); + + d = gp[2]/hp->grid[2]; + VSUM(wp, wp, hp->xv[2], d); +} + + double hdray(ro, rd, hp, gc, r) /* compute ray within a beam */ FVECT ro, rd; /* returned */ @@ -281,11 +296,12 @@ BYTE r[2][2]; double -hdinter(gc, r, hp, ro, rd) /* compute ray intersection with section */ +hdinter(gc, r, ed, hp, ro, rd) /* compute ray intersection with section */ register GCOORD gc[2]; /* returned */ -BYTE r[2][2]; /* returned */ +BYTE r[2][2]; /* returned (optional) */ +double *ed; /* returned (optional) */ register HOLO *hp; -FVECT ro, rd; /* rd should be normalized */ +FVECT ro, rd; /* normalization of rd affects distances */ { FVECT p[2], vt; double d, t0, t1, d0, d1; @@ -337,16 +353,16 @@ FVECT ro, rd; /* rd should be normalized */ d = DOT(vt, v) * hp->wg[wg0[gc[i].w]]; if (d < 0. || (gc[i].i[0] = d) >= hp->grid[wg0[gc[i].w]]) return(FHUGE); /* outside wall */ - r[i][0] = 256. * (d - gc[i].i[0]); + if (r != NULL) + r[i][0] = 256. * (d - gc[i].i[0]); v = hp->wn[wg1[gc[i].w]]; d = DOT(vt, v) * hp->wg[wg1[gc[i].w]]; if (d < 0. || (gc[i].i[1] = d) >= hp->grid[wg1[gc[i].w]]) return(FHUGE); /* outside wall */ - r[i][1] = 256. * (d - gc[i].i[1]); + if (r != NULL) + r[i][1] = 256. * (d - gc[i].i[1]); } - /* return distance from entry point */ - vt[0] = ro[0] - p[0][0]; - vt[1] = ro[1] - p[0][1]; - vt[2] = ro[2] - p[0][2]; - return(DOT(vt,rd)); + if (ed != NULL) /* assign distance to exit point */ + *ed = t1; + return(t0); /* return distance to entry point */ }