--- ray/src/util/ranimate.c 1998/06/03 16:37:51 2.27 +++ ray/src/util/ranimate.c 2003/05/27 15:30:04 2.34 @@ -1,20 +1,30 @@ -/* Copyright (c) 1996 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: ranimate.c,v 2.34 2003/05/27 15:30:04 greg Exp $"; #endif - /* * Radiance animation control program + * + * The main difference between this program and ranimove is that + * we have many optimizations here for camera motion in static + * environments, calling rpict and pinterp on multiple processors, + * where ranimove puts its emphasis on object motion, and does + * not use any external programs for image generation. + * + * See the ranimate(1) man page for further details. */ +#include "copyright.h" + #include "standard.h" #include -#include #include #include "view.h" #include "vars.h" #include "netproc.h" + /* default blur samples */ +#ifndef DEF_NBLUR +#define DEF_NBLUR 5 +#endif /* default remote shell */ #ifdef _AUX_SOURCE #define REMSH "remsh" @@ -31,7 +41,7 @@ static char SCCSid[] = "$SunId$ LBL"; #define EXPOSURE 6 /* how to compute exposure */ #define HOST 7 /* rendering host machine */ #define INTERP 8 /* # frames to interpolate */ -#define MBLUR 9 /* samples for motion blur */ +#define MBLUR 9 /* motion blur parameters */ #define NEXTANIM 10 /* next animation file */ #define OCTREE 11 /* octree file name */ #define OVERSAMP 12 /* # times to oversample image */ @@ -116,8 +126,9 @@ PSERVER *lastpserver; /* last process server with err VIEW *getview(); char *getexp(), *dirfile(); +int getblur(); -extern time_t fdate(), time(); +extern time_t time(); main(argc, argv) @@ -474,11 +485,7 @@ char *rfargs; sprintf(cp, ")[ \t]*=' > %s/radset.var", vval(DIRECTORY)); cp += 11; /* point to file name */ } - if (system(combuf)) { - fprintf(stderr, "%s: error executing rad command:\n\t%s\n", - progname, combuf); - quit(1); - } + system(combuf); /* ignore exit code */ if (pippt == NULL) { /* load variables and remove file */ loadvars(cp); unlink(cp); @@ -516,7 +523,7 @@ animate() /* run animation */ progname, vnam(INTERP)); vval(INTERP) = "0"; } - if (atoi(vval(MBLUR))) { /* can't handle this yet */ + if (strcmp(vval(MBLUR),"0")) { /* can't handle this */ if (!nowarn) fprintf(stderr, "%s: resetting %s=0 for animation\n", @@ -526,7 +533,7 @@ animate() /* run animation */ } /* figure # frames per batch */ d1 = mult*xres*mult*yres*4; /* space for orig. picture */ - if ((i=vint(INTERP)) || atoi(vval(MBLUR))) + if ((i=vint(INTERP)) || getblur(NULL) > 1) d1 += mult*xres*mult*yres*sizeof(float); /* Z-buffer */ d2 = xres*yres*4; /* space for final picture */ frames_batch = (i+1)*(vflt(DISKSPACE)*1048576.-d1)/(d1+i*d2); @@ -700,8 +707,10 @@ walkwait(first, last, vfn) /* walk-through frames */ int first, last; char *vfn; { + double blurf; + int nblur = getblur(&blurf); char combuf[2048]; - char *inspoint; + register char *inspoint; register int i; if (!noaction && vint(INTERP)) /* create dummy frames */ @@ -712,13 +721,20 @@ char *vfn; close(open(combuf, O_RDONLY|O_CREAT, 0666)); } /* create command */ - sprintf(combuf, "rpict%s%s -w0", rendopt, - viewopt(getview(first>1 ? first-1 : 1))); - if (vint(INTERP) || atoi(vval(MBLUR))) - sprintf(combuf+strlen(combuf), " -z %s.zbf", vval(BASENAME)); - sprintf(combuf+strlen(combuf), " -o %s.unf %s -S %d", + sprintf(combuf, "rpict%s -w0", rendopt); + inspoint = combuf; + while (*inspoint) inspoint++; + if (nblur) { + sprintf(inspoint, " -pm %.3f", blurf/nblur); + while (*inspoint) inspoint++; + } + if (nblur > 1 || vint(INTERP)) { + sprintf(inspoint, " -z %s.zbf", vval(BASENAME)); + while (*inspoint) inspoint++; + } + sprintf(inspoint, " -o %s.unf %s -S %d", vval(BASENAME), rresopt, first); - inspoint = combuf + strlen(combuf); + while (*inspoint) inspoint++; sprintf(inspoint, " %s < %s", vval(OCTREE), vfn); /* run in parallel */ i = (last-first+1)/(vint(INTERP)+1); @@ -744,6 +760,8 @@ int frame; { static int *rfrm; /* list of recovered frames */ static int nrfrms = 0; + double blurf; + int nblur = getblur(&blurf); char combuf[2048]; char fname[128]; register char *cp; @@ -759,8 +777,13 @@ int frame; vval(ANIMATE), frame, rendopt); else sprintf(combuf, "rpict%s -w0", rendopt); - cp = combuf + strlen(combuf); - if (vint(INTERP) || atoi(vval(MBLUR))) { + cp = combuf; + while (*cp) cp++; + if (nblur) { + sprintf(cp, " -pm %.3f", blurf/nblur); + while (*cp) cp++; + } + if (nblur > 1 || vint(INTERP)) { sprintf(cp, " -z %s.zbf", fname); while (*cp) cp++; } @@ -774,7 +797,7 @@ int frame; return(1); /* add frame to recovered list */ if (nrfrms) - rfrm = (int *)realloc((char *)rfrm, (nrfrms+1)*sizeof(int)); + rfrm = (int *)realloc((void *)rfrm, (nrfrms+1)*sizeof(int)); else rfrm = (int *)malloc(sizeof(int)); if (rfrm == NULL) { @@ -853,12 +876,14 @@ int rvr; { extern int frecover(); static int iter = 0; + double blurf; + int nblur = getblur(&blurf); char fnbefore[128], fnafter[128], *fbase; char combuf[1024], fname0[128], fname1[128]; int usepinterp, usepfilt, nora_rgbe; int frseq[2]; /* check what is needed */ - usepinterp = atoi(vval(MBLUR)); + usepinterp = (nblur > 1); usepfilt = pfiltalways | ep==NULL; if (ep != NULL && !strcmp(ep, "1")) ep = "+0"; @@ -903,7 +928,7 @@ int rvr; if (usepinterp) { /* using pinterp */ if (rvr == 2 && recover(frseq[1])) /* recover after? */ return(1); - if (atoi(vval(MBLUR))) { + if (nblur > 1) { /* with pmblur */ sprintf(fname0, "%s/vw0%c", vval(DIRECTORY), 'a'+(iter%26)); sprintf(fname1, "%s/vw1%c", vval(DIRECTORY), @@ -930,9 +955,8 @@ int rvr; putc('\n', fp); fclose(fp); } sprintf(combuf, - "(pmblur %s %d %s %s; rm -f %s %s) | pinterp -B", - *sskip(vval(MBLUR)) ? sskip2(vval(MBLUR),1) : "1", - atoi(vval(MBLUR)), + "(pmblur %.3f %d %s %s; rm -f %s %s) | pinterp -B -a", + blurf, nblur, fname0, fname1, fname0, fname1); iter++; } else /* no blurring */ @@ -946,7 +970,7 @@ int rvr; if (usepfilt) sprintf(combuf+strlen(combuf), " %s", rresopt); else - sprintf(combuf+strlen(combuf), " %s -e %s", + sprintf(combuf+strlen(combuf), " -a %s -e %s", fresopt, ep); sprintf(combuf+strlen(combuf), " %s.unf %s.zbf", fnbefore, fnbefore); @@ -1070,7 +1094,7 @@ int n; if (n == 0) { /* signal to close file */ if (expfp != NULL) { fclose(expfp); - free((char *)exppos); + free((void *)exppos); expfp = NULL; } return(NULL); @@ -1376,4 +1400,33 @@ register char *path; } else df[0] = '\0'; return(path+psep+1); +} + + +int +getblur(double *bf) /* get # blur samples (and fraction) */ +{ + double blurf; + int nblur; + char *s; + + if (!vdef(MBLUR)) { + if (bf != NULL) + *bf = 0.0; + return(0); + } + blurf = atof(vval(MBLUR)); + if (blurf < 0.0) + blurf = 0.0; + if (bf != NULL) + *bf = blurf; + if (blurf <= FTINY) + return(0); + s = sskip(vval(MBLUR)); + if (!*s) + return(DEF_NBLUR); + nblur = atoi(s); + if (nblur <= 0) + return(1); + return(nblur); }