Пример #1
0
void
uninit(void)			/* mark end of MGF file */
{
	puts("o");
	if (hasmult)
		puts("xf");
	puts("# End of data converted from RADIANCE scene input");
	lu_done(&rdispatch);
	lu_done(&rmats);
	lu_done(&vertab);
}
Пример #2
0
void
clrverts(void)			/* clear vertex table */
{
	register int	i;

	lu_done(&vertab);
	for (i = 0; i < NVERTS; i++)
		vert[i].lused = 0;
	lu_init(&vertab, NVERTS);
}
Пример #3
0
void
freemesh(MESH *ms)		/* free mesh data */
{
	MESH	mhead;
	MESH	*msp;
	
	if (ms == NULL)
		return;
	if (ms->nref <= 0)
		error(CONSISTENCY, "unreferenced mesh in freemesh");
	ms->nref--;
	if (ms->nref)		/* still in use */
		return;
				/* else remove from list */
	mhead.next = mlist;
	for (msp = &mhead; msp->next != NULL; msp = msp->next)
		if (msp->next == ms) {
			msp->next = ms->next;
			ms->next = NULL;
			break;
		}
	if (ms->next != NULL)	/* can't be in list anymore */
		error(CONSISTENCY, "unlisted mesh in freemesh");
	mlist = mhead.next;
				/* free mesh data */
	freestr(ms->name);
	octfree(ms->mcube.cutree);
	lu_done(&ms->lut);
	if (ms->npatches > 0) {
		MESHPATCH	*pp = ms->patch + ms->npatches;
		while (pp-- > ms->patch) {
			if (pp->j2tri != NULL)
				free((void *)pp->j2tri);
			if (pp->j1tri != NULL)
				free((void *)pp->j1tri);
			if (pp->tri != NULL)
				free((void *)pp->tri);
			if (pp->uv != NULL)
				free((void *)pp->uv);
			if (pp->norm != NULL)
				free((void *)pp->norm);
			if (pp->xyz != NULL)
				free((void *)pp->xyz);
		}
		free((void *)ms->patch);
	}
	if (ms->pseudo != NULL)
		free((void *)ms->pseudo);
	free((void *)ms);
}
Пример #4
0
/* Recover output if possible */
void
recover_output()
{
	off_t		lastout = -1;
	int		outvsiz, recsiz;
	char		*outvfmt;
	int		i, j;
	MODCONT		*mp;
	int		ofl;
	char		oname[1024];
	LUENT		*oent;
	STREAMOUT	sout;
	off_t		nvals;
	int		xr, yr;

	switch (outfmt) {
	case 'a':
		error(USER, "cannot recover ASCII output");
		return;
	case 'f':
		outvsiz = sizeof(float)*3;
		break;
	case 'd':
		outvsiz = sizeof(double)*3;
		break;
	case 'c':
		outvsiz = sizeof(COLR);
		break;
	default:
		error(INTERNAL, "botched output format");
		return;
	}
	outvfmt = formstr(outfmt);
						/* check modifier outputs */
	for (i = 0; i < nmods; i++) {
		mp = (MODCONT *)lu_find(&modconttab,modname[i])->data;
		if (mp->outspec == NULL)
			error(USER, "cannot recover from stdout");
		if (mp->outspec[0] == '!')
			error(USER, "cannot recover from command");
		for (j = 0; ; j++) {		/* check each bin's file */
			ofl = ofname(oname, mp->outspec, mp->modname, j);
			if (ofl < 0)
				error(USER, "bad output file specification");
			oent = lu_find(&ofiletab, oname);
			if (oent->data != NULL) {
				sout = *(STREAMOUT *)oent->data;
			} else {
				sout.reclen = 0;
				sout.outpipe = 0;
				sout.ofp = NULL;
			}
			if (sout.ofp != NULL) {	/* already open? */
				if (ofl & OF_BIN)
					continue;
				break;
			}
						/* open output */
			sout.ofp = fopen(oname, "rb+");
			if (sout.ofp == NULL) {
				if (j == mp->nbins)
					break;	/* assume end of modifier */
				sprintf(errmsg, "missing recover file '%s'",
						oname);
				error(WARNING, errmsg);
				break;
			}
			nvals = lseek(fileno(sout.ofp), 0, SEEK_END);
			if (nvals <= 0) {
				lastout = 0;	/* empty output, quit here */
				fclose(sout.ofp);
				break;
			}
			if (!sout.reclen) {
				if (!(ofl & OF_BIN)) {
					sprintf(errmsg,
						"need -bn to recover file '%s'",
							oname);
					error(USER, errmsg);
				}
				recsiz = outvsiz;
			} else
				recsiz = outvsiz * sout.reclen;

			lseek(fileno(sout.ofp), 0, SEEK_SET);
			if (header && checkheader(sout.ofp, outvfmt, NULL) != 1) {
				sprintf(errmsg, "format mismatch for '%s'",
						oname);
				error(USER, errmsg);
			}
			sout.xr = xres; sout.yr = yres;
			if ((sout.xr > 0) & (sout.yr > 0) &&
					(!fscnresolu(&xr, &yr, sout.ofp) ||
						(xr != sout.xr) |
						(yr != sout.yr))) {
				sprintf(errmsg, "resolution mismatch for '%s'",
						oname);
				error(USER, errmsg);
			}
			nvals = (nvals - (off_t)ftell(sout.ofp)) / recsiz;
			if ((lastout < 0) | (nvals < lastout))
				lastout = nvals;
			if (oent->key == NULL)	/* new entry */
				oent->key = strcpy((char *)
						malloc(strlen(oname)+1), oname);
			if (oent->data == NULL)
				oent->data = (char *)malloc(sizeof(STREAMOUT));
			*(STREAMOUT *)oent->data = sout;
			if (!(ofl & OF_BIN))
				break;		/* no bin separation */
		}
		if (!lastout) {			/* empty output */
			error(WARNING, "no previous data to recover");
			lu_done(&ofiletab);	/* reclose all outputs */
			return;
		}
		if (j > mp->nbins) {		/* check modifier size */
			sprintf(errmsg,
				"mismatched -bn setting for recovering '%s'",
					modname[i]);
			error(USER, errmsg);
		}
	}
	if (lastout < 0) {
		error(WARNING, "no output files to recover");
		return;
	}
	if (raysleft && lastout >= raysleft/accumulate) {
		error(WARNING, "output appears to be complete");
		/* XXX should read & discard input? */
		quit(0);
	}
						/* seek on all files */
	nvals = lastout * outvsiz;
	lu_doall(&ofiletab, &myseeko, &nvals);
						/* skip repeated input */
	lastout *= accumulate;
	for (nvals = 0; nvals < lastout; nvals++) {
		FVECT	vdummy;
		if (getvec(vdummy) < 0 || getvec(vdummy) < 0)
			error(USER, "unexpected EOF on input");
	}
	lastray = lastdone = (RNUMBER)lastout;
	if (raysleft)
		raysleft -= lastray;
}
Пример #5
0
void
flush_cache(void)			/* put out cached faces */
{
	int	VFSEPPOS = strchr(vlist[0],'\n') - vlist[0];
	int	donorms = 0;
	register struct face	*f;
	register int	i;

	if (nverts == 0)
		return;
					/* put out coordinates */
	printf("%sCoordinate3 {\n", tabs);
	indent(1);
	vlist[0][VFSEPPOS] = '\0';
	printf("%spoint [ %s", tabs, vlist[0]);
	for (i = 1; i < nverts; i++) {
		vlist[i][VFSEPPOS] = '\0';
		printf(",\n%s        %s", tabs, vlist[i]);
		if (strcmp(VFSEPPOS+1+vlist[i], VZVECT))
			donorms++;
	}
	indent(0);
	printf(" ]\n%s}\n", tabs);
	if (donorms) {			/* put out normals */
		printf("%sNormal {\n", tabs);
		indent(1);
		printf("%svector [ %s", tabs, VFSEPPOS+1+vlist[0]);
		for (i = 1; i < nverts; i++)
			printf(",\n%s         %s", tabs, VFSEPPOS+1+vlist[i]);
		indent(0);
		printf(" ]\n%s}\n", tabs);
	}
					/* put out faces */
	printf("%sIndexedFaceSet {\n", tabs);
	indent(1);
	f = flist;			/* coordinate indices */
	printf("%scoordIndex [ %d", tabs, f->vl[0]);
	for (i = 1; i < f->nv; i++)
		printf(", %d", f->vl[i]);
	for (f = f->next; f != NULL; f = f->next) {
		printf(", -1,\n%s             %d", tabs, f->vl[0]);
		for (i = 1; i < f->nv; i++)
			printf(", %d", f->vl[i]);
	}
	printf(" ]\n");
	if (donorms) {
		f = flist;			/* normal indices */
		printf("%snormalIndex [ %d", tabs, f->vl[0]);
		for (i = 1; i < f->nv; i++)
			printf(", %d", f->vl[i]);
		for (f = f->next; f != NULL; f = f->next) {
			printf(", -1,\n%s              %d", tabs, f->vl[0]);
			for (i = 1; i < f->nv; i++)
				printf(", %d", f->vl[i]);
		}
		printf(" ]\n");
	}
	indent(0);			/* close IndexedFaceSet */
	printf("%s}\n", tabs);
	indent(0);			/* close face group */
	printf("%s}\n", tabs);
	while ((f = flist) != NULL) {	/* free face list */
		flist = f->next;
		freeface(f);
	}
	lu_done(&vert_tab);		/* clear lookup table */
	nverts = 0;
}
Пример #6
0
void
rgl_matclear(void)			/* clean up materials */
{
	lu_done(&mtab);
	domats = 1;
}