--- ray/src/hd/holofile.c 1998/01/05 16:45:24 3.20 +++ ray/src/hd/holofile.c 1998/02/12 16:30:04 3.22 @@ -16,10 +16,10 @@ static char SCCSid[] = "$SunId$ SGI"; #define CACHESIZE 16 /* default cache size (Mbytes, 0==inf) */ #endif #ifndef FREEBEAMS -#define FREEBEAMS 512 /* maximum beams to free at a time */ +#define FREEBEAMS 1024 /* maximum beams to free at a time */ #endif #ifndef PCTFREE -#define PCTFREE 20 /* maximum fraction to free (%) */ +#define PCTFREE 15 /* maximum fraction to free (%) */ #endif #ifndef MAXFRAG #define MAXFRAG 32767 /* maximum fragments/file to track (0==inf) */ @@ -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) { @@ -641,7 +648,7 @@ register HOLO *hp; /* section we're adding from */ { register int i, j; /* insert each beam from hp */ - for (i = nbeams(hp); i > 0; i--) { + for (i = 1; i <= nbeams(hp); i++) { if (hp->bl[i] == NULL) /* check if loaded */ continue; #if 0