--- ray/src/hd/rhcopy.c 1998/01/07 09:23:02 3.5 +++ ray/src/hd/rhcopy.c 1998/10/27 08:49:50 3.9 @@ -12,6 +12,10 @@ static char SCCSid[] = "$SunId$ SGI"; #include "view.h" #include "resolu.h" +#ifndef BLOADSIZE +#define BLOADSIZE 1024 /* number of input beams to load at a time */ +#endif + int checkdepth = 1; /* check depth (!-f option)? */ int checkrepeats = 0; /* check for repeats (-c option)? */ int frompicz; /* input from pictures & depth-buffers? */ @@ -31,10 +35,10 @@ char *argv[]; frompicz = -1; for (i = 2; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { - case 'c': + case 'u': checkrepeats = 1; break; - case 'f': + case 'd': checkdepth = 0; break; case 'h': @@ -59,9 +63,9 @@ char *argv[]; addholo(argv[i]); quit(0); userr: - fprintf(stderr, "Usage: %s output.hdk [-c][-f] -h inp1.hdk ..\n", + fprintf(stderr, "Usage: %s output.hdk [-u][-d] -h inp1.hdk ..\n", progname); - fprintf(stderr, " Or: %s output.hdk [-c][-f] -pz inp1.pic inp1.zbf ..\n", + fprintf(stderr, " Or: %s output.hdk [-u][-d] -pz inp1.pic inp1.zbf ..\n", progname); exit(1); } @@ -71,6 +75,7 @@ userr: #define H_OBST 02 #define H_OBSF 04 +int holheadline(s, hf) /* check holodeck header line */ register char *s; int *hf; @@ -82,7 +87,7 @@ int *hf; *hf |= H_BADF; else *hf &= ~H_BADF; - return; + return(0); } if (!strncmp(s, "OBSTRUCTIONS=", 13)) { s += 13; @@ -93,8 +98,9 @@ int *hf; *hf |= H_OBSF; else error(WARNING, "bad OBSTRUCTIONS value in holodeck"); - return; + return(0); } + return(0); } int @@ -187,30 +193,34 @@ COLR cv; addholo(hdf) /* add a holodeck file */ char *hdf; { + HDBEAMI hbl[BLOADSIZE]; int fd; register HOLO *hp; register BEAM *bp; - register HDBEAMI *hbl; GCOORD gc[2]; FVECT ro, rd; double d; - int i, j; + int i, j, n, li; register int k; /* open the holodeck for reading */ openholo(hdf, 0); fd = hdlist[noutsects]->fd; /* remember the file handle */ while ((hp = hdlist[noutsects]) != NULL) { /* load each section */ - hbl = (HDBEAMI *)malloc(nbeams(hp)*sizeof(HDBEAMI)); - if (hbl == NULL) - error(SYSTEM, "out of memory in addholo"); - for (j = nbeams(hp); j > 0; j--) { /* sort the beams */ - hbl[j].h = hp; - hbl[j].b = j; - } - qsort((char *)hbl, nbeams(hp), sizeof(HDBEAMI), hdfilord); - for (j = 0; j < nbeams(hp); j++) /* load each beam */ - if ((bp = hdgetbeam(hp, hbl[j].b)) != NULL) { - hdbcoord(gc, hp, hbl[j].b); + for (j = 0; j < nbeams(hp); j++) { /* load each beam */ + if (!(li = j % BLOADSIZE)) { /* optimize order */ + if (j+BLOADSIZE > nbeams(hp)) + k = n = nbeams(hp) - j; + else + k = n = BLOADSIZE; + while (k--) { + hbl[k].h = hp; + hbl[k].b = j+k+1; + } + qsort((char *)hbl, n, + sizeof(HDBEAMI), hdfilord); + } + if ((bp = hdgetbeam(hp, hbl[li].b)) != NULL) { + hdbcoord(gc, hp, hbl[li].b); for (k = bp->nrm; k--; ) { d = hdray(ro, rd, hp, gc, hdbray(bp)[k].r); @@ -221,9 +231,9 @@ char *hdf; d = hddepth(hp, hdbray(bp)[k].d) - d; addray(ro, rd, d, hdbray(bp)[k].v); } - hdfreebeam(hp, hbl[j].b); /* free beam */ + hdfreebeam(hp, hbl[li].b); /* free beam */ } - free((char *)hbl); /* free beam list */ + } hddone(hp); /* free the section */ } close(fd); /* close the file */ @@ -239,6 +249,7 @@ struct phead { }; +int picheadline(s, ph) /* process picture header line */ char *s; struct phead *ph; @@ -247,20 +258,21 @@ struct phead *ph; if (formatval(fmt, s)) { ph->badfmt = strcmp(fmt, COLRFMT); - return; + return(0); } if (isprims(s)) { ph->altprims++; /* don't want to deal with this */ - return; + return(0); } if (isexpos(s)) { ph->expos *= exposval(s); - return; + return(0); } if (isview(s)) { ph->gotview += sscanview(&ph->vw, s); - return; + return(0); } + return(0); }