ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/writeoct.c
Revision: 2.1
Committed: Tue Nov 12 17:00:58 1991 UTC (32 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +0 -0 lines
Log Message:
updated revision number for release 2.0

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1986 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * writeoct.c - routines for writing octree information to stdout.
9     *
10     * 7/30/85
11     */
12    
13     #include "standard.h"
14    
15     #include "octree.h"
16    
17     #include "object.h"
18    
19     #include "otypes.h"
20    
21 greg 1.6 static int putint(), putstr(), puttree(), putobj();
22    
23 greg 1.1
24     writeoct(store, scene, ofn) /* write octree structures to stdout */
25     int store;
26     CUBE *scene;
27     char *ofn[];
28     {
29     char sbuf[64];
30     register int i;
31     /* write format number */
32 greg 1.5 putint((long)(OCTMAGIC+sizeof(OBJECT)), 2);
33 greg 1.1
34     if (!(store & IO_BOUNDS))
35     return;
36     /* write boundaries */
37     for (i = 0; i < 3; i++) {
38     sprintf(sbuf, "%.12g", scene->cuorg[i]);
39     putstr(sbuf);
40     }
41     sprintf(sbuf, "%.12g", scene->cusize);
42     putstr(sbuf);
43     /* write object file names */
44     if (store & IO_FILES)
45     for (i = 0; ofn[i] != NULL; i++)
46     putstr(ofn[i]);
47     putstr("");
48 greg 1.3 /* write number of objects */
49     putint((long)nobjects, sizeof(OBJECT));
50 greg 1.1
51     if (!(store & IO_TREE))
52     return;
53     /* write the octree */
54     puttree(scene->cutree);
55    
56     if (store & IO_FILES || !(store & IO_SCENE))
57     return;
58     /* write the scene */
59     for (i = 0; i < NUMOTYPE; i++)
60     putstr(ofun[i].funame);
61     putstr("");
62     for (i = 0; i < nobjects; i++)
63     putobj(objptr(i));
64     putobj(NULL);
65     }
66    
67    
68     static
69     putstr(s) /* write null-terminated string to stdout */
70     register char *s;
71     {
72     do
73     putc(*s, stdout);
74     while (*s++);
75     if (ferror(stdout))
76     error(SYSTEM, "write error in putstr");
77     }
78    
79    
80     static
81     putfullnode(fn) /* write out a full node */
82     OCTREE fn;
83     {
84     OBJECT oset[MAXSET+1];
85     register int i;
86    
87     objset(oset, fn);
88     for (i = 0; i <= oset[0]; i++)
89     putint((long)oset[i], sizeof(OBJECT));
90     }
91    
92    
93     static
94     putint(i, siz) /* write a siz-byte integer to stdout */
95     register long i;
96     register int siz;
97     {
98     while (siz--)
99 greg 1.2 putc(i>>(siz<<3) & 0xff, stdout);
100 greg 1.1 if (ferror(stdout))
101     error(SYSTEM, "write error in putint");
102     }
103    
104    
105     static
106     putflt(f) /* put out floating point number */
107     double f;
108     {
109     extern double frexp();
110     int e;
111    
112 greg 1.2 putint((long)(frexp(f,&e)*0x7fffffff), 4);
113 greg 1.4 putint((long)e, 1);
114 greg 1.1 }
115    
116    
117     static
118     puttree(ot) /* write octree to stdout in pre-order form */
119     register OCTREE ot;
120     {
121     register int i;
122    
123     if (istree(ot)) {
124     putc(OT_TREE, stdout); /* indicate tree */
125     for (i = 0; i < 8; i++) /* write tree */
126     puttree(octkid(ot, i));
127     } else if (isfull(ot)) {
128     putc(OT_FULL, stdout); /* indicate fullnode */
129     putfullnode(ot); /* write fullnode */
130     } else
131     putc(OT_EMPTY, stdout); /* indicate empty */
132     }
133    
134    
135     static
136     putobj(o) /* write out object */
137     register OBJREC *o;
138     {
139     register int i;
140    
141     if (o == NULL) { /* terminator */
142     putint(-1L, 1);
143     return;
144     }
145     putint((long)o->otype, 1);
146     putint((long)o->omod, sizeof(OBJECT));
147     putstr(o->oname);
148     putint((long)o->oargs.nsargs, 2);
149     for (i = 0; i < o->oargs.nsargs; i++)
150     putstr(o->oargs.sarg[i]);
151     #ifdef IARGS
152 greg 1.4 putint((long)o->oargs.niargs, 2);
153 greg 1.1 for (i = 0; i < o->oargs.niargs; i++)
154 greg 1.4 putint((long)o->oargs.iarg[i], 4);
155 greg 1.1 #endif
156     putint((long)o->oargs.nfargs, 2);
157     for (i = 0; i < o->oargs.nfargs; i++)
158     putflt(o->oargs.farg[i]);
159     }