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); }
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); }
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); }
/* 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; }
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; }
void rgl_matclear(void) /* clean up materials */ { lu_done(&mtab); domats = 1; }