ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/writeoct.c
Revision: 2.6
Committed: Thu Apr 29 14:36:49 2004 UTC (20 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6, rad3R6P1
Changes since 2.5: +4 -1 lines
Log Message:
Added macros to avoid flockfile(3) overhead

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: writeoct.c,v 2.5 2004/03/27 12:41:45 schorsch Exp $";
3 #endif
4 /*
5 * writeoct.c - routines for writing octree information to stdout.
6 *
7 * 7/30/85
8 */
9
10 #include "standard.h"
11
12 #include "octree.h"
13 #include "object.h"
14 #include "oconv.h"
15
16 #ifdef putc_unlocked /* avoid horrendous overhead of flockfile */
17 #define putc putc_unlocked
18 #endif
19
20 static void oputstr(char *s);
21 static void putfullnode(OCTREE fn);
22 static void oputint(long i, int siz);
23 static void oputflt(double f);
24 static void puttree(OCTREE ot);
25
26
27 void
28 writeoct( /* write octree structures to stdout */
29 int store,
30 CUBE *scene,
31 char *ofn[]
32 )
33 {
34 char sbuf[64];
35 int i;
36 /* write format number */
37 oputint((long)(OCTMAGIC+sizeof(OBJECT)), 2);
38
39 if (!(store & IO_BOUNDS))
40 return;
41 /* write boundaries */
42 for (i = 0; i < 3; i++) {
43 sprintf(sbuf, "%.12g", scene->cuorg[i]);
44 oputstr(sbuf);
45 }
46 sprintf(sbuf, "%.12g", scene->cusize);
47 oputstr(sbuf);
48 /* write object file names */
49 if (store & IO_FILES)
50 for (i = 0; ofn[i] != NULL; i++)
51 oputstr(ofn[i]);
52 oputstr("");
53 /* write number of objects */
54 oputint((long)nobjects, sizeof(OBJECT));
55
56 if (!(store & IO_TREE))
57 return;
58 /* write the octree */
59 puttree(scene->cutree);
60
61 if (store & IO_FILES || !(store & IO_SCENE))
62 return;
63 /* write the scene */
64 writescene(0, nobjects, stdout);
65 }
66
67
68 static void
69 oputstr( /* write null-terminated string to stdout */
70 register char *s
71 )
72 {
73 putstr(s, stdout);
74 if (ferror(stdout))
75 error(SYSTEM, "write error in putstr");
76 }
77
78
79 static void
80 putfullnode( /* write out a full node */
81 OCTREE fn
82 )
83 {
84 OBJECT oset[MAXSET+1];
85 register int i;
86
87 objset(oset, fn);
88 for (i = 0; i <= oset[0]; i++)
89 oputint((long)oset[i], sizeof(OBJECT));
90 }
91
92
93 static void
94 oputint( /* write a siz-byte integer to stdout */
95 register long i,
96 register int siz
97 )
98 {
99 putint(i, siz, stdout);
100 if (ferror(stdout))
101 error(SYSTEM, "write error in putint");
102 }
103
104
105 static void
106 oputflt( /* put out floating point number */
107 double f
108 )
109 {
110 putflt(f, stdout);
111 if (ferror(stdout))
112 error(SYSTEM, "write error in putflt");
113 }
114
115
116 static void
117 puttree( /* write octree to stdout in pre-order form */
118 register OCTREE ot
119 )
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 }