--- ray/src/hd/holofile.c 1998/01/07 17:31:00 3.21 +++ ray/src/hd/holofile.c 1998/08/12 17:53:59 3.23 @@ -105,6 +105,7 @@ hdinit(fd, hproto) /* initialize a holodeck section in int fd; /* corresponding file descriptor */ HDGRID *hproto; /* holodeck section grid */ { + long rtrunc; long fpos; register HOLO *hp; register int n; @@ -144,13 +145,19 @@ HDGRID *hproto; /* holodeck section grid */ hdattach(fd); /* check rays on disk */ fpos = hdfilen(fd); - biglob(hp)->nrd = 0; + biglob(hp)->nrd = rtrunc = 0; for (n = hproto == NULL ? nbeams(hp) : 0; n > 0; n--) if (hp->bi[n].nrd) - if (hp->bi[n].fo + hp->bi[n].nrd > fpos) - hp->bi[n].nrd = 0; /* off end */ - else + if (hp->bi[n].fo + hp->bi[n].nrd > fpos) { + rtrunc += hp->bi[n].nrd; + hp->bi[n].nrd = 0; + } else biglob(hp)->nrd += hp->bi[n].nrd; + if (rtrunc) { + sprintf(errmsg, "truncated section, %ld rays lost (%.1f%%)", + rtrunc, 100.*rtrunc/(rtrunc+biglob(hp)->nrd)); + error(WARNING, errmsg); + } /* add to holodeck list */ for (n = 0; n < HDMAX; n++) if (hdlist[n] == NULL) { @@ -372,8 +379,8 @@ int n; /* list length */ int (*bf)(); /* callback function (optional) */ { unsigned origcachesize, memuse; - register BEAM *bp; int bytesloaded, needbytes, bytes2free; + register BEAM *bp; register int i; /* precheck consistency */ for (i = n; i--; ) @@ -383,10 +390,10 @@ int (*bf)(); /* callback function (optional) */ qsort((char *)hb, n, sizeof(HDBEAMI), hdfilord); bytesloaded = 0; /* run through loaded beams */ for ( ; n && (bp = hb->h->bl[hb->b]) != NULL; n--, hb++) { - bp->tick = hdclock; /* preempt swap */ + bp->tick = hdclock; /* preempt swap */ bytesloaded += bp->nrm; if (bf != NULL) - (*bf)(bp, hb->h, hb->b); + (*bf)(bp, hb); } bytesloaded *= sizeof(RAYVAL); if ((origcachesize = hdcachesize) > 0) { @@ -405,7 +412,7 @@ int (*bf)(); /* callback function (optional) */ } for (i = 0; i < n; i++) if ((bp = hdgetbeam(hb[i].h, hb[i].b)) != NULL && bf != NULL) - (*bf)(bp, hb[i].h, hb[i].b); + (*bf)(bp, hb+i); hdcachesize = origcachesize; /* resume dynamic swapping */ }