void setparam( /* get/set program parameter */ char *s ) { int prev_newp = newparam; char buf[128]; if (s[0] == '\0') { (*dev->comout)( "aa ab ad ar as av aw b bv dc dv dj ds dt i lr lw me ma mg ms ps pt ss st u: "); (*dev->comin)(buf, NULL); s = buf; } switch (s[0]) { case 'u': /* uncorrelated sampling */ getparam(s+1, "uncorrelated sampling", 'b', (void *)&rand_samp); break; case 'l': /* limit */ switch (s[1]) { case 'w': /* weight */ getparam(s+2, "limit weight", 'r', (void *)&minweight); break; case 'r': /* reflection */ getparam(s+2, "limit reflection", 'i', (void *)&maxdepth); break; default: goto badparam; } break; case 'd': /* direct */ switch (s[1]) { case 'j': /* jitter */ getparam(s+2, "direct jitter", 'r', (void *)&dstrsrc); break; case 'c': /* certainty */ getparam(s+2, "direct certainty", 'r', (void *)&shadcert); break; case 't': /* threshold */ getparam(s+2, "direct threshold", 'r', (void *)&shadthresh); break; case 'v': /* visibility */ getparam(s+2, "direct visibility", 'b', (void *)&directvis); break; case 's': /* sampling */ getparam(s+2, "direct sampling", 'r', (void *)&srcsizerat); break; default: goto badparam; } break; case 'b': /* back faces or black and white */ switch (s[1]) { case 'v': /* back face visibility */ getparam(s+2, "back face visibility", 'b', (void *)&backvis); break; case '\0': /* black and white */ case ' ': case 'y': case 'Y': case 't': case 'T': case '1': case '+': case 'n': case 'N': case 'f': case 'F': case '0': case '-': getparam(s+1, "black and white", 'b', (void *)&greyscale); newparam = prev_newp; break; default: goto badparam; } break; case 'i': /* irradiance */ getparam(s+1, "irradiance", 'b', (void *)&do_irrad); break; case 'a': /* ambient */ switch (s[1]) { case 'v': /* value */ getparam(s+2, "ambient value", 'C', (void *)ambval); break; case 'w': /* weight */ getparam(s+2, "ambient value weight", 'i', (void *)&ambvwt); break; case 'a': /* accuracy */ if (getparam(s+2, "ambient accuracy", 'r', (void *)&ambacc)) setambacc(ambacc); break; case 'd': /* divisions */ getparam(s+2, "ambient divisions", 'i', (void *)&ambdiv); break; case 's': /* samples */ getparam(s+2, "ambient super-samples", 'i', (void *)&ambssamp); break; case 'b': /* bounces */ getparam(s+2, "ambient bounces", 'i', (void *)&ambounce); break; case 'r': if (getparam(s+2, "ambient resolution", 'i', (void *)&ambres)) setambres(ambres); break; default: goto badparam; } break; case 'm': /* medium */ switch (s[1]) { case 'e': /* extinction coefficient */ getparam(s+2, "extinction coefficient", 'C', (void *)cextinction); break; case 'a': /* scattering albedo */ getparam(s+2, "scattering albedo", 'C', (void *)salbedo); break; case 'g': /* scattering eccentricity */ getparam(s+2, "scattering eccentricity", 'r', (void *)&seccg); break; case 's': /* sampling distance */ getparam(s+2, "mist sampling distance", 'r', (void *)&ssampdist); break; default: goto badparam; } break; case 'p': /* pixel */ switch (s[1]) { case 's': /* sample */ if (getparam(s+2, "pixel sample", 'i', (void *)&psample)) pdepth = 0; break; case 't': /* threshold */ if (getparam(s+2, "pixel threshold", 'r', (void *)&maxdiff)) pdepth = 0; break; default: goto badparam; } newparam = prev_newp; break; case 's': /* specular */ switch (s[1]) { case 's': /* sampling */ getparam(s+2, "specular sampling", 'r', (void *)&specjitter); break; case 't': /* threshold */ getparam(s+2, "specular threshold", 'r', (void *)&specthresh); break; default: goto badparam; } break; case '\0': /* nothing */ break; default:; badparam: *sskip(s) = '\0'; sprintf(errmsg, "%s: unknown variable", s); error(COMMAND, errmsg); break; } }
extern void setambient(void) /* initialize calculation */ { int readonly = 0; long flen; AMBVAL amb; /* make sure we're fresh */ ambdone(); /* init ambient limits */ setambres(ambres); setambacc(ambacc); if (ambfile == NULL || !ambfile[0]) return; if (ambacc <= FTINY) { sprintf(errmsg, "zero ambient accuracy so \"%s\" not opened", ambfile); error(WARNING, errmsg); return; } /* open ambient file */ if ((ambfp = fopen(ambfile, "r+")) == NULL) readonly = (ambfp = fopen(ambfile, "r")) != NULL; if (ambfp != NULL) { initambfile(0); /* file exists */ lastpos = ftell(ambfp); while (readambval(&amb, ambfp)) avinsert(avstore(&amb)); nambshare = nambvals; /* share loaded values */ if (readonly) { sprintf(errmsg, "loaded %u values from read-only ambient file", nambvals); error(WARNING, errmsg); fclose(ambfp); /* close file so no writes */ ambfp = NULL; return; /* avoid ambsync() */ } /* align file pointer */ lastpos += (long)nambvals*AMBVALSIZ; flen = lseek(fileno(ambfp), (off_t)0, SEEK_END); if (flen != lastpos) { sprintf(errmsg, "ignoring last %ld values in ambient file (corrupted)", (flen - lastpos)/AMBVALSIZ); error(WARNING, errmsg); fseek(ambfp, lastpos, SEEK_SET); #ifndef _WIN32 /* XXX we need a replacement for that one */ ftruncate(fileno(ambfp), (off_t)lastpos); #endif } } else if ((ambfp = fopen(ambfile, "w+")) != NULL) { initambfile(1); /* else create new file */ fflush(ambfp); lastpos = ftell(ambfp); } else { sprintf(errmsg, "cannot open ambient file \"%s\"", ambfile); error(SYSTEM, errmsg); } #ifdef F_SETLKW aflock(F_UNLCK); /* release file */ #endif }