Beispiel #1
0
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;
	}
}
Beispiel #2
0
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
}