static void setivar( /* set an intermediate variable */ char *vname, char *fname, char *definition ) { IVAR ivbeg; register IVAR *iv; scompile(definition, fname, 0); /* compile the string */ ivbeg.next = ivhead; for (iv = &ivbeg; iv->next != NULL; iv = iv->next) if (!strcmp(vname, iv->next->name)) { iv = iv->next; freestr(iv->dfn); iv->dfn = savestr(definition); return; } iv->next = (IVAR *)emalloc(sizeof(IVAR)); iv = iv->next; iv->name = savestr(vname); iv->dfn = savestr(definition); iv->next = NULL; ivhead = ivbeg.next; }
int main(int argc, char *argv[]) { #define check(ol,al) if (argv[i][ol] || \ badarg(argc-i-1,argv+i+1,al)) \ goto badopt #define bool(olen,var) switch (argv[i][olen]) { \ case '\0': var = !var; break; \ case 'y': case 'Y': case 't': case 'T': \ case '+': case '1': var = 1; break; \ case 'n': case 'N': case 'f': case 'F': \ case '-': case '0': var = 0; break; \ default: goto badopt; } char *curout = NULL; char *binval = NULL; int bincnt = 0; int rval; int i; /* global program name */ progname = argv[0] = fixargv0(argv[0]); gargv = argv; gargc = argc; /* initialize calcomp routines early */ initfunc(); setcontext(RCCONTEXT); /* option city */ for (i = 1; i < argc; i++) { /* expand arguments */ while ((rval = expandarg(&argc, &argv, i)) > 0) ; if (rval < 0) { sprintf(errmsg, "cannot expand '%s'", argv[i]); error(SYSTEM, errmsg); } if (argv[i] == NULL || argv[i][0] != '-') break; /* break from options */ if (!strcmp(argv[i], "-version")) { puts(VersionID); quit(0); } if (!strcmp(argv[i], "-defaults") || !strcmp(argv[i], "-help")) { override_options(); printdefaults(); quit(0); } rval = getrenderopt(argc-i, argv+i); if (rval >= 0) { i += rval; continue; } switch (argv[i][1]) { case 'n': /* number of cores */ check(2,"i"); nproc = atoi(argv[++i]); if (nproc <= 0) error(USER, "bad number of processes"); break; case 'V': /* output contributions */ bool(2,contrib); break; case 'x': /* x resolution */ check(2,"i"); xres = atoi(argv[++i]); break; case 'y': /* y resolution */ check(2,"i"); yres = atoi(argv[++i]); break; case 'w': /* warnings */ rval = (erract[WARNING].pf != NULL); bool(2,rval); if (rval) erract[WARNING].pf = wputs; else erract[WARNING].pf = NULL; break; case 'e': /* expression */ check(2,"s"); scompile(argv[++i], NULL, 0); break; case 'l': /* limit distance */ if (argv[i][2] != 'd') goto badopt; bool(3,lim_dist); break; case 'I': /* immed. irradiance */ bool(2,imm_irrad); break; case 'f': /* file or force or format */ if (!argv[i][2]) { check(2,"s"); loadfunc(argv[++i]); break; } if (argv[i][2] == 'o') { bool(3,force_open); break; } setformat(argv[i]+2); break; case 'o': /* output */ check(2,"s"); curout = argv[++i]; break; case 'c': /* input rays per output */ check(2,"i"); accumulate = atoi(argv[++i]); break; case 'r': /* recover output */ bool(2,recover); break; case 'h': /* header output */ bool(2,header); break; case 'b': /* bin expression/count */ if (argv[i][2] == 'n') { check(3,"s"); bincnt = (int)(eval(argv[++i]) + .5); break; } check(2,"s"); binval = argv[++i]; break; case 'm': /* modifier name */ check(2,"s"); addmodifier(argv[++i], curout, binval, bincnt); break; case 'M': /* modifier file */ check(2,"s"); addmodfile(argv[++i], curout, binval, bincnt); break; default: goto badopt; } } if (nmods <= 0) error(USER, "missing required modifier argument"); /* override some option settings */ override_options(); /* initialize object types */ initotypes(); /* initialize urand */ if (rand_samp) { srandom((long)time(0)); initurand(0); } else { srandom(0L); initurand(2048); } /* set up signal handling */ sigdie(SIGINT, "Interrupt"); #ifdef SIGHUP sigdie(SIGHUP, "Hangup"); #endif sigdie(SIGTERM, "Terminate"); #ifdef SIGPIPE sigdie(SIGPIPE, "Broken pipe"); #endif #ifdef SIGALRM sigdie(SIGALRM, "Alarm clock"); #endif #ifdef SIGXCPU sigdie(SIGXCPU, "CPU limit exceeded"); sigdie(SIGXFSZ, "File size exceeded"); #endif #ifdef NICE nice(NICE); /* lower priority */ #endif /* get octree */ if (i == argc) octname = NULL; else if (i == argc-1) octname = argv[i]; else goto badopt; if (octname == NULL) error(USER, "missing octree argument"); readoct(octname, ~(IO_FILES|IO_INFO), &thescene, NULL); nsceneobjs = nobjects; marksources(); /* find and mark sources */ setambient(); /* initialize ambient calculation */ rcontrib(); /* trace ray contributions (loop) */ ambsync(); /* flush ambient file */ quit(0); /* exit clean */ badopt: fprintf(stderr, "Usage: %s [-n nprocs][-V][-r][-e expr][-f source][-o ospec][-b binv][-bn N] {-m mod | -M file} [rtrace options] octree\n", progname); sprintf(errmsg, "command line error at '%s'", argv[i]); error(USER, errmsg); return(1); /* pro forma return */ #undef check #undef bool }
void setmgvar( /* set a variable */ char *fname, FILE *fp, char *string ) { char name[128]; FILE *fp2; register int i; register char *s; register VARIABLE *vp; if (!strncmp(string, "include=", 8)) { /* include file */ if ((s = findfile(string+8, libpath)) == NULL) { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: File not found: %s\n", progname, fname, string+8); quit(1); } strcpy(name, s); mgload(name); return; } s = string; i = 0; while (i < sizeof(name)-1 && isid(*s)) name[i++] = *s++; name[i] = '\0'; vp = vlookup(name); if (vp != NULL) { undefine(vp); switch (vp->type) { case REAL: case FUNCTION: if ((*s == '(') != (vp->type == FUNCTION)) { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: Bad %s declaration: %s\n", progname, fname, vp->type == FUNCTION ? "function" : "variable", name); quit(1); } scompile(string, fname, 0); vp->v.dfn = savestr(string); break; case STRING: if (*s++ != '=') { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: Missing '='\n", progname, fname); quit(1); } vp->v.s = savestr(s); break; case DATA: if (*s++ != '=') { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: Missing '='\n", progname, fname); quit(1); } if (!*s) { loaddata(fname, fp, &vp->v.d); } else if (*s == '!') { if ((fp2 = popen(s+1, "r")) == NULL) { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: Cannot execute: %s\n", progname, fname, s+1); quit(1); } loaddata(s, fp2, &vp->v.d); pclose(fp2); } else { if ((fp2 = fopen(s, "r")) == NULL) { fprintf(stderr, "%s\n", string); fprintf(stderr, "%s: %s: Data file not found: %s\n", progname, fname, s); quit(1); } loaddata(s, fp2, &vp->v.d); fclose(fp2); } break; } vp->flags |= DEFINED; } else setivar(name, fname, string); /* intermediate */ }
/* Read in BSDF and interpolate as Klems matrix representation */ int main(int argc, char *argv[]) { int dofwd = 0, dobwd = 1; char buf[2048]; char *cp; int i, na; progname = argv[0]; esupport |= E_VARIABLE|E_FUNCTION|E_RCONST; esupport &= ~(E_INCHAN|E_OUTCHAN); scompile("PI:3.14159265358979323846", NULL, 0); biggerlib(); for (i = 1; i < argc && (argv[i][0] == '-') | (argv[i][0] == '+'); i++) switch (argv[i][1]) { /* get options */ case 'n': npsamps = atoi(argv[++i]); if (npsamps <= 0) goto userr; break; case 'e': scompile(argv[++i], NULL, 0); single_plane_incident = 0; break; case 'f': if (!argv[i][2]) { if (strchr(argv[++i], '=') != NULL) { add_wbsdf("-f", 1); add_wbsdf(argv[i], 1); } else { char *fpath = getpath(argv[i], getrlibpath(), 0); if (fpath == NULL) { fprintf(stderr, "%s: cannot find file '%s'\n", argv[0], argv[i]); return(1); } fcompile(fpath); single_plane_incident = 0; } } else dofwd = (argv[i][0] == '+'); break; case 'b': dobwd = (argv[i][0] == '+'); break; case 'h': kbasis = klems_half; add_wbsdf("-a", 1); add_wbsdf("kh", 1); break; case 'q': kbasis = klems_quarter; add_wbsdf("-a", 1); add_wbsdf("kq", 1); break; case 'l': lobe_lim = atoi(argv[++i]); break; case 'p': do_prog = atoi(argv[i]+2); break; case 'C': add_wbsdf(argv[i], 1); add_wbsdf(argv[++i], 1); break; default: goto userr; } if (kbasis == klems_full) { /* default (full) basis? */ add_wbsdf("-a", 1); add_wbsdf("kf", 1); } strcpy(buf, "File produced by: "); if (convert_commandline(buf+18, sizeof(buf)-18, argv) != NULL) { add_wbsdf("-C", 1); add_wbsdf(buf, 0); } if (single_plane_incident >= 0) { /* function-based BSDF? */ if (i != argc-1 || fundefined(argv[i]) < 3) { fprintf(stderr, "%s: need single function with 6 arguments: bsdf(ix,iy,iz,ox,oy,oz)\n", progname); fprintf(stderr, "\tor 3 arguments using Dx,Dy,Dz: bsdf(ix,iy,iz)\n"); goto userr; } ++eclock; if (dofwd) { input_orient = -1; output_orient = -1; prog_start("Evaluating outside reflectance"); eval_function(argv[i]); output_orient = 1; prog_start("Evaluating outside->inside transmission"); eval_function(argv[i]); } if (dobwd) { input_orient = 1; output_orient = 1; prog_start("Evaluating inside reflectance"); eval_function(argv[i]); output_orient = -1; prog_start("Evaluating inside->outside transmission"); eval_function(argv[i]); } return(wrap_up()); } /* XML input? */ if (i == argc-1 && (cp = argv[i]+strlen(argv[i])-4) > argv[i] && !strcasecmp(cp, ".xml")) { eval_bsdf(argv[i]); /* load & resample BSDF */ return(wrap_up()); } if (i < argc) { /* open input files if given */ int nbsdf = 0; for ( ; i < argc; i++) { /* interpolate each component */ char pbuf[256]; FILE *fpin = fopen(argv[i], "rb"); if (fpin == NULL) { fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n", progname, argv[i]); return(1); } if (!load_bsdf_rep(fpin)) return(1); fclose(fpin); sprintf(pbuf, "Interpolating component '%s'", argv[i]); prog_start(pbuf); eval_rbf(); } return(wrap_up()); } SET_FILE_BINARY(stdin); /* load from stdin */ if (!load_bsdf_rep(stdin)) return(1); prog_start("Interpolating from standard input"); eval_rbf(); /* resample dist. */ return(wrap_up()); userr: fprintf(stderr, "Usage: %s [-n spp][-h|-q][-l maxlobes] [bsdf.sir ..] > bsdf.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q] bsdf_in.xml > bsdf_out.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q][{+|-}for[ward]][{+|-}b[ackward]][-e expr][-f file] bsdf_func > bsdf.xml\n", progname); return(1); }
int main( int argc, char *argv[] ) { int i; esupport |= E_VARIABLE|E_FUNCTION|E_INCHAN|E_OUTCHAN|E_RCONST; esupport &= ~(E_REDEFW); #ifdef BIGGERLIB biggerlib(); #endif varset("PI", ':', 3.14159265358979323846); funset("in", 1, '=', &l_in); for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'b': blnkeq = !blnkeq; break; case 'l': igneol = !igneol; break; case 'p': passive = !passive; break; case 't': sepchar = argv[i][2]; break; case 's': svpreset(argv[++i]); break; case 'f': fcompile(argv[++i]); break; case 'e': scompile(argv[++i], NULL, 0); break; case 'n': noinput = 1; break; case 'i': switch (argv[i][2]) { case '\0': itype = 'a'; nbicols = 0; readfmt(argv[++i], 0); break; case 'a': itype = 'a'; nbicols = 0; break; case 'd': case 'D': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(double) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; case 'f': case 'F': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(float) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; default: goto userr; } break; case 'o': switch (argv[i][2]) { case '\0': otype = 'a'; readfmt(argv[++i], 1); break; case 'a': otype = 'a'; break; case 'd': case 'D': case 'f': case 'F': otype = argv[i][2]; break; default: goto userr; } break; case 'w': nowarn = !nowarn; break; case 'u': unbuff = !unbuff; break; default:; userr: eputs("Usage: "); eputs(argv[0]); eputs(" [-b][-l][-n][-p][-w][-u][-tS][-s svar=sval][-e expr][-f source][-i infmt][-o outfmt] [file]\n"); quit(1); } if (otype != 'a') SET_FILE_BINARY(stdout); if (noinput) { /* produce a single output record */ if (i < argc) { eputs(argv[0]); eputs(": file argument(s) incompatible with -n\n"); quit(1); } eclock++; putout(); quit(0); } if (itype != 'a') SET_FILE_BINARY(stdin); if (blnkeq) /* for efficiency */ nbsynch(); if (i == argc) /* from stdin */ execute(NULL); else /* from one or more files */ for ( ; i < argc; i++) execute(argv[i]); quit(0); return 0; /* pro forma return */ }
/* Read in BSDF and interpolate as Klems matrix representation */ int main(int argc, char *argv[]) { int dofwd = 0, dobwd = 1; char *cp; int i, na; progname = argv[0]; esupport |= E_VARIABLE|E_FUNCTION|E_RCONST; esupport &= ~(E_INCHAN|E_OUTCHAN); scompile("PI:3.14159265358979323846", NULL, 0); biggerlib(); for (i = 1; i < argc && (argv[i][0] == '-') | (argv[i][0] == '+'); i++) switch (argv[i][1]) { /* get options */ case 'n': npsamps = atoi(argv[++i]); if (npsamps <= 0) goto userr; break; case 'e': scompile(argv[++i], NULL, 0); single_plane_incident = 0; break; case 'f': if (!argv[i][2]) { fcompile(argv[++i]); single_plane_incident = 0; } else dofwd = (argv[i][0] == '+'); break; case 'b': dobwd = (argv[i][0] == '+'); break; case 'h': kbasis = "LBNL/Klems Half"; break; case 'q': kbasis = "LBNL/Klems Quarter"; break; default: goto userr; } if (single_plane_incident >= 0) { /* function-based BSDF? */ if (i != argc-1 || fundefined(argv[i]) != 6) { fprintf(stderr, "%s: need single function with 6 arguments: bsdf(ix,iy,iz,ox,oy,oz)\n", progname); fprintf(stderr, "\tor 3 arguments using Dx,Dy,Dz: bsdf(ix,iy,iz)\n", progname); goto userr; } ++eclock; xml_header(argc, argv); /* start XML output */ xml_prologue(NULL); if (dofwd) { input_orient = -1; output_orient = -1; eval_function(argv[i]); /* outside reflectance */ output_orient = 1; eval_function(argv[i]); /* outside -> inside */ } if (dobwd) { input_orient = 1; output_orient = 1; eval_function(argv[i]); /* inside reflectance */ output_orient = -1; eval_function(argv[i]); /* inside -> outside */ } xml_epilogue(); /* finish XML output & exit */ return(0); } /* XML input? */ if (i == argc-1 && (cp = argv[i]+strlen(argv[i])-4) > argv[i] && !strcasecmp(cp, ".xml")) { xml_header(argc, argv); /* start XML output */ eval_bsdf(argv[i]); /* load & resample BSDF */ xml_epilogue(); /* finish XML output & exit */ return(0); } if (i < argc) { /* open input files if given */ int nbsdf = 0; for ( ; i < argc; i++) { /* interpolate each component */ FILE *fpin = fopen(argv[i], "rb"); if (fpin == NULL) { fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n", progname, argv[i]); return(1); } if (!load_bsdf_rep(fpin)) return(1); fclose(fpin); if (!nbsdf++) { /* start XML on first dist. */ xml_header(argc, argv); xml_prologue(NULL); } eval_rbf(); } xml_epilogue(); /* finish XML output & exit */ return(0); } SET_FILE_BINARY(stdin); /* load from stdin */ if (!load_bsdf_rep(stdin)) return(1); xml_header(argc, argv); /* start XML output */ xml_prologue(NULL); eval_rbf(); /* resample dist. */ xml_epilogue(); /* finish XML output & exit */ return(0); userr: fprintf(stderr, "Usage: %s [-n spp][-h|-q][bsdf.sir ..] > bsdf.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q] bsdf_in.xml > bsdf_out.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q][{+|-}for[ward]][{+|-}b[ackward]][-e expr][-f file] bsdf_func > bsdf.xml\n", progname); return(1); }
int main( int argc, char *argv[] ) { int original; double f; int a; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; /* scan options */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': case 'y': a++; continue; case 'w': nowarn = !nowarn; continue; case 'h': echoheader = !echoheader; continue; case 'f': case 'e': a++; continue; } break; } newheader("RADIANCE", stdout); /* start header */ fputnow(stdout); /* process files */ for (nfiles = 0; nfiles < MAXINP; nfiles++) { setcolor(input[nfiles].coef, 1.0, 1.0, 1.0); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); input[nfiles].vw = stdview; input[nfiles].pa = 1.0; } nfiles = 0; original = 0; for ( ; a < argc; a++) { if (nfiles >= MAXINP) { eputs(argv[0]); eputs(": too many picture files\n"); quit(1); } if (argv[a][0] == '-') switch (argv[a][1]) { case '\0': input[nfiles].name = StandardInput; input[nfiles].fp = stdin; break; case 'o': original++; continue; case 's': f = atof(argv[++a]); scalecolor(input[nfiles].coef, f); continue; case 'c': colval(input[nfiles].coef,RED)*=atof(argv[++a]); colval(input[nfiles].coef,GRN)*=atof(argv[++a]); colval(input[nfiles].coef,BLU)*=atof(argv[++a]); continue; default: goto usage; } else { if (argv[a][0] == '!') { input[nfiles].name = Command; input[nfiles].fp = popen(argv[a]+1, "r"); } else { input[nfiles].name = argv[a]; input[nfiles].fp = fopen(argv[a], "r"); } if (input[nfiles].fp == NULL) { perror(argv[a]); quit(1); } } checkfile(); if (original) { colval(input[nfiles].coef,RED) /= colval(input[nfiles].expos,RED); colval(input[nfiles].coef,GRN) /= colval(input[nfiles].expos,GRN); colval(input[nfiles].coef,BLU) /= colval(input[nfiles].expos,BLU); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); } nfiles++; original = 0; } init(); /* set constants */ /* go back and get expressions */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': varset(vxres, ':', eval(argv[++a])); continue; case 'y': varset(vyres, ':', eval(argv[++a])); continue; case 'w': continue; case 'h': continue; case 'f': fcompile(argv[++a]); continue; case 'e': scompile(argv[++a], NULL, 0); continue; } break; } /* set/get output resolution */ if (!vardefined(vxres)) varset(vxres, ':', (double)xmax); if (!vardefined(vyres)) varset(vyres, ':', (double)ymax); xres = varvalue(vxres) + .5; yres = varvalue(vyres) + .5; if (xres <= 0 || yres <= 0) { eputs(argv[0]); eputs(": illegal output resolution\n"); quit(1); } /* complete header */ printargs(argc, argv, stdout); if (strcmp(ourfmt, PICFMT)) fputformat(ourfmt, stdout); /* print format if known */ putchar('\n'); fprtresolu(xres, yres, stdout); /* combine pictures */ combine(); quit(0); usage: eputs("Usage: "); eputs(argv[0]); eputs( " [-w][-h][-x xr][-y yr][-e expr][-f file] [ [-o][-s f][-c r g b] hdr ..]\n"); quit(1); return 1; /* pro forma return */ }