--- ray/src/hd/rhpict.c 1999/03/05 17:02:41 3.2 +++ ray/src/hd/rhpict.c 1999/03/09 15:10:26 3.7 @@ -14,10 +14,13 @@ static char SCCSid[] = "$SunId$ SGI"; char *progname; /* our program name */ char *hdkfile; /* holodeck file name */ +char gargc; /* global argc */ +char **gargv; /* global argv */ VIEW myview = STDVIEW; /* current output view */ int xres = 512, yres = 512; /* max. horizontal and vertical resolution */ char *outspec = NULL; /* output file specification */ +double randfrac = -1.; /* random resampling fraction */ double pixaspect = 1.; /* pixel aspect ratio */ int seqstart = 0; /* sequence start frame */ double expval = 1.; /* exposure value */ @@ -36,6 +39,7 @@ char *argv[]; { int i, rval; + gargc = argc; gargv = argv; progname = argv[0]; /* get arguments */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { rval = getviewopt(&myview, argc-i, argv+i); @@ -50,9 +54,9 @@ char *argv[]; case 'p': /* pixel aspect/exposure */ if (badarg(argc-i-1,argv+i+1,"f")) goto userr; - if (argv[i][1] == 'a') + if (argv[i][2] == 'a') pixaspect = atof(argv[++i]); - else if (argv[i][1] == 'e') { + else if (argv[i][2] == 'e') { expval = atof(argv[++i]); if (argv[i][0] == '-' | argv[i][0] == '+') expval = pow(2., expval); @@ -74,13 +78,21 @@ char *argv[]; goto userr; outspec = argv[++i]; break; + case 'r': /* random sampling */ + if (badarg(argc-i-1,argv+i+1,"f")) + goto userr; + randfrac = atof(argv[++i]); + break; + case 's': /* smooth sampling */ + randfrac = -1.; + break; case 'S': /* sequence start */ if (badarg(argc-i-1,argv+i+1,"i")) goto userr; seqstart = atoi(argv[++i]); break; case 'v': /* view file */ - if (argv[i][1]!='f' || badarg(argc-i-1,argv+i+1,"s")) + if (argv[i][2]!='f' || badarg(argc-i-1,argv+i+1,"s")) goto userr; rval = viewfile(argv[++i], &myview, NULL); if (rval < 0) { @@ -98,9 +110,9 @@ char *argv[]; } } /* open holodeck file */ - if (i >= argc) + if (i != argc-1) goto userr; - hdkfile = argv[i++]; + hdkfile = argv[i]; initialize(); /* render picture(s) */ if (seqstart <= 0) @@ -111,7 +123,7 @@ char *argv[]; quit(0); /* all done! */ userr: fprintf(stderr, -"Usage: %s [-w][-pa pa][-pe ex][-x hr][-y vr][-S stfn][-o outp][view] input.hdk\n", +"Usage: %s [-w][-r rf][-pa pa][-pe ex][-x hr][-y vr][-S stfn][-o outp][view] input.hdk\n", progname); quit(1); } @@ -145,11 +157,13 @@ int fn; sprintf(errmsg, "error writing frame %d", fn); error(SYSTEM, errmsg); } +#ifdef DEBUG if (blist.nb > 0 & rval > 0) { - sprintf(errmsg, "%.1f%% unrendered pixels in frame %d", - 100.*rval/(hres*vres), fn); + sprintf(errmsg, "%d unrendered pixels in frame %d (%.1f%%)", + rval, fn, 100.*rval/(hres*vres)); error(WARNING, errmsg); } +#endif } @@ -169,7 +183,7 @@ int nb; bil[i].b = bl[i].bi; } hdloadbeams(bil, nb, pixBeam); - pixFlush(); + pixFinish(randfrac); free((char *)bil); } @@ -194,7 +208,7 @@ int fn; /* write header */ newheader("RADIANCE", stdout); printf("SOFTWARE= %s\n", VersionID); - printf("%s %s\n", progname, hdkfile); + printargs(gargc, gargv, stdout); if (fn) printf("FRAME=%d\n", fn); fputs(VIEWSTR, stdout); @@ -218,22 +232,29 @@ int fn; int endpicture() /* finish and write out pixels */ { - int nunrend = 0; - int v; + int lastr = -1, nunrend = 0; + int4 lastp, lastrp; + register int4 p; register double d; - register int p; /* compute final pixel values */ for (p = hres*vres; p--; ) { if (myweight[p] <= FTINY) { + if (lastr >= 0) + if (p/hres == lastp/hres) + copycolor(mypixel[p], mypixel[lastp]); + else + copycolor(mypixel[p], mypixel[lastrp]); nunrend++; continue; } d = expval/myweight[p]; scalecolor(mypixel[p], d); + if ((lastp=p)/hres != lastr) + lastr = (lastrp=p)/hres; } /* write each scanline */ - for (v = vres; v--; ) - if (fwritescan(mypixel+v*hres, hres, stdout) < 0) + for (p = vres; p--; ) + if (fwritescan(mypixel+p*hres, hres, stdout) < 0) return(-1); if (fflush(stdout) == EOF) return(-1);