ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/sceneio.c
Revision: 2.1
Committed: Fri Mar 14 21:27:46 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Log Message:
Added -a option to obj2mesh to incorporate materials in mesh

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2     static const char RCSid[] = "$Id$";
3     #endif
4     /*
5     * Portable, binary Radiance i/o routines.
6     *
7     * Called from octree and mesh i/o routines.
8     */
9    
10     #include "copyright.h"
11     #include "standard.h"
12     #include "octree.h"
13     #include "object.h"
14     #include "otypes.h"
15    
16     static OBJECT object0; /* zeroeth object */
17     static short otypmap[NUMOTYPE+32]; /* object type map */
18    
19    
20     static int
21     getobj(fp, objsiz) /* get next object */
22     FILE *fp;
23     int objsiz;
24     {
25     char sbuf[MAXSTR];
26     int obj;
27     register int i;
28     register long m;
29     register OBJREC *objp;
30    
31     i = getint(1, fp);
32     if (i == -1)
33     return(OVOID); /* terminator */
34     if ((obj = newobject()) == OVOID)
35     error(SYSTEM, "out of object space");
36     objp = objptr(obj);
37     if ((objp->otype = otypmap[i]) < 0)
38     error(USER, "reference to unknown type");
39     if ((m = getint(objsiz, fp)) != OVOID) {
40     m += object0;
41     if ((OBJECT)m != m)
42     error(INTERNAL, "too many objects in getobj");
43     }
44     objp->omod = m;
45     objp->oname = savqstr(getstr(sbuf, fp));
46     if ((objp->oargs.nsargs = getint(2, fp)) > 0) {
47     objp->oargs.sarg = (char **)malloc
48     (objp->oargs.nsargs*sizeof(char *));
49     if (objp->oargs.sarg == NULL)
50     goto memerr;
51     for (i = 0; i < objp->oargs.nsargs; i++)
52     objp->oargs.sarg[i] = savestr(getstr(sbuf, fp));
53     } else
54     objp->oargs.sarg = NULL;
55     #ifdef IARGS
56     if ((objp->oargs.niargs = getint(2, fp)) > 0) {
57     objp->oargs.iarg = (long *)malloc
58     (objp->oargs.niargs*sizeof(long));
59     if (objp->oargs.iarg == NULL)
60     goto memerr;
61     for (i = 0; i < objp->oargs.niargs; i++)
62     objp->oargs.iarg[i] = getint(4, fp);
63     } else
64     objp->oargs.iarg = NULL;
65     #endif
66     if ((objp->oargs.nfargs = getint(2, fp)) > 0) {
67     objp->oargs.farg = (FLOAT *)malloc
68     (objp->oargs.nfargs*sizeof(FLOAT));
69     if (objp->oargs.farg == NULL)
70     goto memerr;
71     for (i = 0; i < objp->oargs.nfargs; i++)
72     objp->oargs.farg[i] = getflt(fp);
73     } else
74     objp->oargs.farg = NULL;
75     if (feof(fp))
76     error(SYSTEM, "unexpected EOF in getobj");
77     /* initialize */
78     objp->os = NULL;
79     /* insert */
80     insertobject(obj);
81     return(obj);
82     memerr:
83     error(SYSTEM, "out of memory in getobj");
84     }
85    
86    
87     void
88     readscene(fp, objsiz) /* read binary scene description */
89     FILE *fp;
90     int objsiz;
91     {
92     char sbuf[32];
93     int i;
94     /* record starting object */
95     object0 = nobjects;
96     /* read type map */
97     for (i = 0; getstr(sbuf, fp) != NULL && sbuf[0]; i++)
98     if ((otypmap[i] = otype(sbuf)) < 0) {
99     sprintf(errmsg, "unknown object type \"%s\"",
100     sbuf);
101     error(WARNING, errmsg);
102     }
103     /* read objects */
104     while (getobj(fp, objsiz) != OVOID)
105     ;
106     }
107    
108    
109     static void
110     putobj(o, fp) /* write out object */
111     FILE *fp;
112     register OBJREC *o;
113     {
114     register int i;
115    
116     if (o == NULL) { /* terminator */
117     putint(-1L, 1, fp);
118     return;
119     }
120     putint((long)o->otype, 1, fp);
121     putint((long)o->omod, sizeof(OBJECT), fp);
122     putstr(o->oname, fp);
123     putint((long)o->oargs.nsargs, 2, fp);
124     for (i = 0; i < o->oargs.nsargs; i++)
125     putstr(o->oargs.sarg[i], fp);
126     #ifdef IARGS
127     putint((long)o->oargs.niargs, 2, fp);
128     for (i = 0; i < o->oargs.niargs; i++)
129     putint((long)o->oargs.iarg[i], 4, fp);
130     #endif
131     putint((long)o->oargs.nfargs, 2, fp);
132     for (i = 0; i < o->oargs.nfargs; i++)
133     putflt(o->oargs.farg[i], fp);
134     }
135    
136    
137     void
138     writescene(firstobj, nobjs, fp) /* write binary scene description */
139     OBJECT firstobj, nobjs;
140     FILE *fp;
141     {
142     int i;
143     /* write out type list */
144     for (i = 0; i < NUMOTYPE; i++)
145     putstr(ofun[i].funame, fp);
146     putstr("", fp);
147     /* write objects */
148     for (i = firstobj; i < firstobj+nobjs; i++)
149     putobj(objptr(i), fp);
150     putobj(NULL, fp); /* terminator */
151     if (ferror(fp))
152     error(SYSTEM, "write error in writescene");
153     }