ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/convertobj.c
Revision: 2.3
Committed: Thu Apr 23 22:35:27 2020 UTC (4 years ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.2: +12 -8 lines
Log Message:
Made error reporting and return value more consistent

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: convertobj.c,v 2.2 2020/04/23 03:19:48 greg Exp $";
3 #endif
4 /*
5 * convertobj.c
6 *
7 * Convert .OBJ scene to Radiance
8 *
9 * Created by Greg Ward on Thu Apr 22 2004.
10 */
11
12 #include "paths.h"
13 #include "rterror.h"
14 #include "objutil.h"
15
16 /* Callback to convert face to Radiance */
17 static int
18 radface(Scene *sc, Face *f, void *ptr)
19 {
20 static int fcnt = 0;
21 FILE *fp = (FILE *)ptr;
22 int i;
23
24 if (f->flags & FACE_DEGENERATE)
25 return(0);
26 fprintf(fp, "\n%s polygon %s.%d\n0\n0\n%d\n", sc->matname[f->mat],
27 sc->grpname[f->grp], ++fcnt, 3*f->nv);
28 for (i = 0; i < f->nv; i++) {
29 Vertex *vp = sc->vert + f->v[i].vid;
30 fprintf(fp, "\t%18.12g %18.12g %18.12g\n",
31 vp->p[0], vp->p[1], vp->p[2]);
32 }
33 return(1);
34 }
35
36 /* Convert indicated faces to Radiance, return # written or -1 on error */
37 int
38 toRadiance(Scene *sc, FILE *fp, int flreq, int flexc)
39 {
40 int n;
41
42 if (sc == NULL || sc->nfaces <= 0 || fp == NULL)
43 return(0);
44 /* write comments */
45 for (n = 0; n < sc->ndescr; n++)
46 fprintf(fp, "# %s\n", sc->descr[n]);
47 /* write faces */
48 n = foreachFace(sc, radface, flreq, flexc, (void *)fp);
49 if (fflush(fp) < 0) {
50 error(SYSTEM, "Error writing Radiance scene data");
51 return(-1);
52 }
53 return(n);
54 }
55
56 /* Convert faces to Radiance file, return # written or -1 on error */
57 int
58 writeRadiance(Scene *sc, const char *fspec, int flreq, int flexc)
59 {
60 extern char *progname;
61 FILE *fp;
62 int n;
63
64 if (sc == NULL || sc->nfaces <= 0 || fspec == NULL || !*fspec)
65 return(0);
66 #if POPEN_SUPPORT
67 if (fspec[0] == '!') {
68 if ((fp = popen(fspec+1, "w")) == NULL) {
69 sprintf(errmsg, "%s: cannot execute", fspec);
70 error(SYSTEM, errmsg);
71 return(-1);
72 }
73 } else
74 #endif
75 if ((fp = fopen(fspec, "w")) == NULL) {
76 sprintf(errmsg, "%s: cannot open for writing", fspec);
77 error(SYSTEM, errmsg);
78 return(-1);
79 }
80 /* start off header */
81 fprintf(fp, "# Radiance scene file converted from .OBJ by %s\n#\n",
82 progname);
83 n = toRadiance(sc, fp, flreq, flexc); /* write file */
84 #if POPEN_SUPPORT
85 if (fspec[0] == '!') {
86 if (pclose(fp)) {
87 sprintf(errmsg, "%s: error writing to command\n", fspec);
88 error(SYSTEM, errmsg);
89 return(-1);
90 }
91 } else
92 #endif
93 fclose(fp); /* close it (already flushed) */
94 return(n);
95 }