--- ray/src/rt/rpict.c 1993/08/02 21:48:37 2.27 +++ ray/src/rt/rpict.c 1996/06/08 21:16:06 2.47 @@ -1,4 +1,4 @@ -/* Copyright (c) 1992 Regents of the University of California */ +/* Copyright (c) 1996 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -6,17 +6,24 @@ static char SCCSid[] = "$SunId$ LBL"; /* * rpict.c - routines and variables for picture generation. - * - * 8/14/85 */ #include "ray.h" +#include + +#ifndef NIX #ifdef BSD #include #include +#else +#include +#include #endif +#endif +extern time_t time(); + #include #include "view.h" @@ -54,13 +61,21 @@ int vspretest = 512; /* virtual source pretest dens int directvis = 1; /* sources visible? */ double srcsizerat = .25; /* maximum ratio source size/dist. */ +COLOR cextinction = BLKCOLOR; /* global extinction coefficient */ +COLOR salbedo = BLKCOLOR; /* global scattering albedo */ +double seccg = 0.; /* global scattering eccentricity */ +double ssampdist = 0.; /* scatter sampling distance */ + double specthresh = .15; /* specular sampling threshold */ double specjitter = 1.; /* specular sampling jitter */ +int backvis = 1; /* back face visibility */ + int maxdepth = 6; /* maximum recursion depth */ double minweight = 5e-3; /* minimum ray weight */ COLOR ambval = BLKCOLOR; /* ambient value */ +int ambvwt = 0; /* initial weight for ambient value */ double ambacc = 0.2; /* ambient accuracy */ int ambres = 32; /* ambient resolution */ int ambdiv = 128; /* ambient divisions */ @@ -77,10 +92,9 @@ int ralrm = 0; /* seconds between reports */ double pctdone = 0.0; /* percentage done */ -long tlastrept = 0L; /* time at last report */ +time_t tlastrept = 0L; /* time at last report */ -extern long time(); -extern long tstart; /* starting time */ +extern time_t tstart; /* starting time */ extern unsigned long nrays; /* number of rays traced */ @@ -88,7 +102,7 @@ extern unsigned long nrays; /* number of rays traced #define pixjitter() (.5+dstrpix*(.5-frandom())) -static int hres, vres; /* resolution for this frame */ +int hres, vres; /* resolution for this frame */ extern char *mktemp(); @@ -121,32 +135,53 @@ int code; } -#ifdef BSD +#ifndef NIX report() /* report progress */ { + extern char *myhostname(); + double u, s; +#ifdef BSD struct rusage rubuf; - double t; +#else + struct tms tbuf; + double period; +#endif + tlastrept = time((time_t *)NULL); +#ifdef BSD getrusage(RUSAGE_SELF, &rubuf); - t = (rubuf.ru_utime.tv_usec + rubuf.ru_stime.tv_usec) / 1e6; - t += rubuf.ru_utime.tv_sec + rubuf.ru_stime.tv_sec; + u = rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec/1e6; + s = rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec/1e6; getrusage(RUSAGE_CHILDREN, &rubuf); - t += (rubuf.ru_utime.tv_usec + rubuf.ru_stime.tv_usec) / 1e6; - t += rubuf.ru_utime.tv_sec + rubuf.ru_stime.tv_sec; + u += rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec/1e6; + s += rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec/1e6; +#else + times(&tbuf); +#ifdef _SC_CLK_TCK + period = 1.0 / sysconf(_SC_CLK_TCK); +#else + period = 1.0 / 60.0; +#endif + u = ( tbuf.tms_utime + tbuf.tms_cutime ) * period; + s = ( tbuf.tms_stime + tbuf.tms_cstime ) * period; +#endif - sprintf(errmsg, "%lu rays, %4.2f%% done after %5.4f CPU hours\n", - nrays, pctdone, t/3600.0); + sprintf(errmsg, + "%lu rays, %4.2f%% after %.3fu %.3fs %.3fr hours on %s\n", + nrays, pctdone, u/3600., s/3600., + (tlastrept-tstart)/3600., myhostname()); eputs(errmsg); - tlastrept = time((long *)0); +#ifndef BSD + signal(SIGCONT, report); +#endif } #else report() /* report progress */ { - tlastrept = time((long *)0); - sprintf(errmsg, "%lu rays, %4.2f%% done after %5.4f hours\n", + tlastrept = time((time_t *)NULL); + sprintf(errmsg, "%lu rays, %4.2f%% after %5.4f hours\n", nrays, pctdone, (tlastrept-tstart)/3600.0); eputs(errmsg); - signal(SIGCONT, report); } #endif @@ -205,12 +240,19 @@ char *pout, *zout, *prvr; cp--; strcpy(cp, RFTEMPLATE); prvr = mktemp(fbuf2); - if (rename(fbuf, prvr) < 0 && errno != ENOENT) { - sprintf(errmsg, + if (rename(fbuf, prvr) < 0) + if (errno == ENOENT) { /* ghost file */ + sprintf(errmsg, + "new output file \"%s\"", + fbuf); + error(WARNING, errmsg); + prvr = NULL; + } else { /* serious error */ + sprintf(errmsg, "cannot rename \"%s\" to \"%s\"", fbuf, prvr); - error(SYSTEM, errmsg); - } + error(SYSTEM, errmsg); + } } } npicts = 0; /* render sequence */ @@ -349,6 +391,8 @@ char *zfile, *oldfile; fprtresolu(hres, vres, stdout); /* recover file and compute first */ i = salvage(oldfile); + if (i >= vres) + goto alldone; if (zfd != -1 && i > 0 && lseek(zfd, (long)i*hres*sizeof(float), 0) == -1) error(SYSTEM, "z-file seek error in render"); @@ -359,7 +403,8 @@ char *zfile, *oldfile; else #endif signal(SIGCONT, report); - ypos = vres-1 - i; + ypos = vres-1 - i; /* initialize sampling */ + init_drawsources(psample); fillscanline(scanbar[0], zbar[0], sampdens, hres, ypos, hstep); /* compute scanlines */ for (ypos -= ystep; ypos > -ystep; ypos -= ystep) { @@ -379,6 +424,8 @@ char *zfile, *oldfile; hres, ypos, hstep); /* fill bar */ fillscanbar(scanbar, zbar, hres, ypos, ystep); + /* add bitty sources */ + drawsources(scanbar, zbar, 0, hres, ypos, ystep); /* write it out */ #ifndef BSD signal(SIGCONT, SIG_IGN); /* don't interrupt writes */ @@ -395,7 +442,7 @@ char *zfile, *oldfile; goto writerr; /* record progress */ pctdone = 100.0*(vres-1-ypos)/vres; - if (ralrm > 0 && time((long *)0) >= tlastrept+ralrm) + if (ralrm > 0 && time((time_t *)NULL) >= tlastrept+ralrm) report(); #ifndef BSD else @@ -404,18 +451,19 @@ char *zfile, *oldfile; } /* clean up */ signal(SIGCONT, SIG_IGN); - if (zfd != -1) { - if (write(zfd, (char *)zbar[0], hres*sizeof(float)) + if (zfd != -1 && write(zfd, (char *)zbar[0], hres*sizeof(float)) < hres*sizeof(float)) - goto writerr; + goto writerr; + fwritescan(scanbar[0], hres, stdout); + if (fflush(stdout) == EOF) + goto writerr; +alldone: + if (zfd != -1) { if (close(zfd) == -1) goto writerr; for (i = 0; i <= psample; i++) free((char *)zbar[i]); } - fwritescan(scanbar[0], hres, stdout); - if (fflush(stdout) == EOF) - goto writerr; for (i = 0; i <= psample; i++) free((char *)scanbar[i]); if (sampdens != NULL) @@ -442,7 +490,7 @@ int xres, y, xstep; int bl = xstep, b = xstep; double z; register int i; - + z = pixvalue(scanline[0], 0, y); if (zline) zline[0] = z; /* zig-zag start for quincunx pattern */ @@ -458,7 +506,7 @@ int xres, y, xstep; b = fillsample(scanline, zline, 0, y, i, 0, b/2); else b = fillsample(scanline+i-xstep, - zline ? zline+i-xstep : NULL, + zline ? zline+i-xstep : (float *)NULL, i-xstep, y, xstep, 0, b/2); if (sd) *sd++ = nc & 1 ? bl : b; bl = b; @@ -476,19 +524,17 @@ int xres, y, ysize; float zline[MAXDIV+1]; int b = ysize; register int i, j; - + for (i = 0; i < xres; i++) { - copycolor(vline[0], scanbar[0][i]); copycolor(vline[ysize], scanbar[ysize][i]); if (zbar[0]) { zline[0] = zbar[0][i]; zline[ysize] = zbar[ysize][i]; } - - b = fillsample(vline, zbar[0] ? zline : NULL, + b = fillsample(vline, zbar[0] ? zline : (float *)NULL, i, y, 0, ysize, b/2); - + for (j = 1; j < ysize; j++) copycolor(scanbar[j][i], vline[j]); if (zbar[0]) @@ -511,25 +557,23 @@ int b; COLOR ctmp; int ncut; register int len; - + if (xlen > 0) /* x or y length is zero */ len = xlen; else len = ylen; - + if (len <= 1) /* limit recursion */ return(0); - - if (b > 0 - || (zline && 2.*fabs(zline[0]-zline[len]) > maxdiff*(zline[0]+zline[len])) + + if (b > 0 || + (zline && 2.*fabs(zline[0]-zline[len]) > maxdiff*(zline[0]+zline[len])) || bigdiff(colline[0], colline[len], maxdiff)) { - + z = pixvalue(colline[len>>1], x + (xlen>>1), y + (ylen>>1)); if (zline) zline[len>>1] = z; ncut = 1; - } else { /* interpolate */ - copycolor(colline[len>>1], colline[len]); ratio = (double)(len>>1) / len; scalecolor(colline[len>>1], ratio); @@ -543,8 +587,9 @@ int b; } /* recurse */ ncut += fillsample(colline, zline, x, y, xlen>>1, ylen>>1, (b-1)/2); - - ncut += fillsample(colline+(len>>1), zline ? zline+(len>>1) : NULL, + + ncut += fillsample(colline+(len>>1), + zline ? zline+(len>>1) : (float *)NULL, x+(xlen>>1), y+(ylen>>1), xlen-(xlen>>1), ylen-(ylen>>1), b/2); @@ -559,8 +604,8 @@ int x, y; /* pixel position */ { static RAY thisray; - if (viewray(thisray.rorg, thisray.rdir, &ourview, - (x+pixjitter())/hres, (y+pixjitter())/vres) < 0) { + if ((thisray.rmax = viewray(thisray.rorg, thisray.rdir, &ourview, + (x+pixjitter())/hres, (y+pixjitter())/vres)) < -FTINY) { setcolor(col, 0.0, 0.0, 0.0); return(0.0); } @@ -572,7 +617,7 @@ int x, y; /* pixel position */ rayvalue(&thisray); /* trace ray */ copycolor(col, thisray.rcol); /* return color */ - + return(thisray.rt); /* return distance */ } @@ -586,12 +631,12 @@ char *oldfile; int x, y; if (oldfile == NULL) - return(0); - + goto gotzip; + if ((fp = fopen(oldfile, "r")) == NULL) { sprintf(errmsg, "cannot open recover file \"%s\"", oldfile); error(WARNING, errmsg); - return(0); + goto gotzip; } #ifdef MSDOS setmode(fileno(fp), O_BINARY); @@ -600,10 +645,11 @@ char *oldfile; getheader(fp, NULL, NULL); /* get picture size */ if (!fscnresolu(&x, &y, fp)) { - sprintf(errmsg, "bad recover file \"%s\"", oldfile); + sprintf(errmsg, "bad recover file \"%s\" - not removed", + oldfile); error(WARNING, errmsg); fclose(fp); - return(0); + goto gotzip; } if (x != hres || y != vres) { @@ -627,6 +673,10 @@ char *oldfile; fclose(fp); unlink(oldfile); return(y); +gotzip: + if (fflush(stdout) == EOF) + error(SYSTEM, "error writing picture header"); + return(0); writerr: sprintf(errmsg, "write error during recovery of \"%s\"", oldfile); error(SYSTEM, errmsg);