ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/xshowtrace.c
Revision: 2.12
Committed: Sat Jul 30 22:02:29 2005 UTC (18 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad4R1, rad4R0, rad3R8, rad3R9
Changes since 2.11: +2 -2 lines
Log Message:
Fixed usage message

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: xshowtrace.c,v 2.11 2005/04/19 18:44:22 greg Exp $";
3 #endif
4 /*
5 * Display an image and watch the rays get traced.
6 *
7 * 9/21/90 Greg Ward
8 */
9
10 #include <X11/Xlib.h>
11
12 #include "standard.h"
13 #include "paths.h"
14 #include "view.h"
15
16 #define MAXDEPTH 32 /* ridiculous ray tree depth */
17
18 #ifdef SMLFLT
19 #define sscanvec(s,v) (sscanf(s,"%f %f %f",v,v+1,v+2)==3)
20 #else
21 #define sscanvec(s,v) (sscanf(s,"%lf %lf %lf",v,v+1,v+2)==3)
22 #endif
23
24 char rtcom[64] = "rtrace -h- -otp -fa -x 1";
25 char xicom[] = "ximage -c 256";
26
27 VIEW ourview = STDVIEW; /* view for picture */
28 RESOLU ourres; /* picture resolution */
29
30 char *progname; /* program name */
31
32 char *picture; /* picture name */
33
34 FILE *pin; /* input stream */
35
36 Display *theDisplay = NULL; /* connection to server */
37
38 struct node { /* ray tree node */
39 int ipt[2];
40 struct node *sister;
41 struct node *daughter;
42 };
43
44 #define newnode() (struct node *)calloc(1, sizeof(struct node))
45
46 int slow = 0; /* slow trace? */
47
48 void mainloop(void);
49 static void freetree(struct node *tp);
50 static void tracerays(struct node *tp);
51 static int strtoipt(int ipt[2], char *str);
52 static void setvec(int ipt[2]);
53 static void vector(int ip1[2], int ip2[2]);
54
55
56 int
57 main( /* takes both the octree and the image */
58 int argc,
59 char *argv[]
60 )
61 {
62 int i;
63 char combuf[PATH_MAX];
64
65 progname = argv[0];
66 for (i = 1; i < argc-2; i++)
67 if (!strcmp(argv[i], "-s"))
68 slow++;
69 else if (!strcmp(argv[i], "-T"))
70 strcat(rtcom, " -oTp");
71 else
72 break;
73 if (i > argc-2) {
74 fprintf(stderr, "Usage: %s [-s][-T] [rtrace args] octree picture\n",
75 progname);
76 exit(1);
77 }
78 picture = argv[argc-1];
79 /* get the viewing parameters */
80 if (viewfile(picture, &ourview, &ourres) <= 0 ||
81 setview(&ourview) != NULL) {
82 fprintf(stderr, "%s: cannot get view from \"%s\"\n",
83 progname, picture);
84 exit(1);
85 }
86 /* open the display */
87 if ((theDisplay = XOpenDisplay(NULL)) == NULL) {
88 fprintf(stderr,
89 "%s: cannot open display; DISPLAY variable set?\n",
90 progname);
91 exit(1);
92 }
93 /* build input command */
94 sprintf(combuf, "%s \"%s\" | %s", xicom, picture, rtcom);
95 for ( ; i < argc-1; i++) {
96 strcat(combuf, " ");
97 strcat(combuf, argv[i]);
98 }
99 /* start the damn thing */
100 if ((pin = popen(combuf, "r")) == NULL)
101 exit(1);
102 /* loop on input */
103 mainloop();
104 /* close pipe and exit */
105 pclose(pin);
106 exit(0);
107 }
108
109
110 void
111 mainloop(void) /* get and process input */
112 {
113 static struct node *sis[MAXDEPTH];
114 register struct node *newp;
115 char buf[128];
116 int level;
117 register int i;
118
119 level = 0;
120 while (fgets(buf, sizeof(buf), pin) != NULL) {
121 if ((newp = newnode()) == NULL) {
122 fprintf(stderr, "%s: memory error\n", progname);
123 return;
124 }
125 for (i = 0; buf[i] == '\t'; i++)
126 ;
127 if (strtoipt(newp->ipt, buf+i) < 0) {
128 fprintf(stderr, "%s: bad read\n", progname);
129 return;
130 }
131 newp->sister = sis[i];
132 sis[i] = newp;
133 if (i < level) {
134 newp->daughter = sis[level];
135 sis[level] = NULL;
136 }
137 level = i;
138 if (i == 0) {
139 setvec(sis[0]->ipt);
140 tracerays(sis[0]);
141 freetree(sis[0]);
142 sis[0] = NULL;
143 if (!slow)
144 XFlush(theDisplay);
145 }
146 }
147 }
148
149
150 static void
151 freetree( /* free a trace tree */
152 struct node *tp
153 )
154 {
155 register struct node *kid, *k2;
156
157 for (kid = tp->daughter; kid != NULL; kid = k2) {
158 k2 = kid->sister;
159 freetree(kid);
160 }
161 free((void *)tp);
162 }
163
164
165 static void
166 tracerays( /* trace a ray tree */
167 struct node *tp
168 )
169 {
170 register struct node *kid;
171
172 for (kid = tp->daughter; kid != NULL; kid = kid->sister) {
173 vector(tp->ipt, kid->ipt);
174 tracerays(kid);
175 }
176 }
177
178
179 static int
180 strtoipt( /* convert string x y z to image point */
181 int ipt[2],
182 char *str
183 )
184 {
185 FVECT im_pt, pt;
186
187 if (!sscanvec(str, pt))
188 return(-1);
189 if (DOT(pt,pt) <= FTINY) /* origin is really infinity */
190 ipt[0] = ipt[1] = -1; /* null vector */
191 else {
192 viewloc(im_pt, &ourview, pt);
193 loc2pix(ipt, &ourres, im_pt[0], im_pt[1]);
194 }
195 return(0);
196 }
197
198
199 #define rwind RootWindow(theDisplay,ourScreen)
200 #define ourScreen DefaultScreen(theDisplay)
201
202 GC vecGC = 0;
203 Window gwind = 0;
204 int xoff, yoff;
205
206
207 static void
208 setvec( /* set up vector drawing for pick */
209 int ipt[2]
210 )
211 {
212 extern Window xfindwind();
213 XWindowAttributes wa;
214 XColor xc;
215 XGCValues gcv;
216 int rx, ry, wx, wy;
217 Window rw, cw;
218 unsigned int pm;
219 /* compute pointer location */
220 if (gwind == 0) {
221 register char *wn;
222 for (wn = picture; *wn; wn++);
223 while (wn > picture && wn[-1] != '/') wn--;
224 if ((gwind = xfindwind(theDisplay, rwind, wn, 4)) == 0) {
225 fprintf(stderr, "%s: cannot find display window!\n",
226 progname);
227 exit(1);
228 }
229 }
230 XQueryPointer(theDisplay, gwind, &rw, &cw, &rx, &ry, &wx, &wy, &pm);
231 xoff = wx - ipt[0];
232 yoff = wy - ipt[1];
233 /* set graphics context */
234 if (vecGC == 0) {
235 XGetWindowAttributes(theDisplay, gwind, &wa);
236 xc.red = 65535; xc.green = 0; xc.blue = 0;
237 xc.flags = DoRed|DoGreen|DoBlue;
238 if (XAllocColor(theDisplay, wa.colormap, &xc)) {
239 gcv.foreground = xc.pixel;
240 vecGC = XCreateGC(theDisplay,gwind,GCForeground,&gcv);
241 } else {
242 gcv.function = GXinvert;
243 vecGC = XCreateGC(theDisplay,gwind,GCFunction,&gcv);
244 }
245 }
246 }
247
248
249 static void
250 vector( /* draw a vector */
251 int ip1[2],
252 int ip2[2]
253 )
254 {
255 if (ip2[0] == -1 && ip2[1] == -1)
256 return; /* null vector */
257 XDrawLine(theDisplay, gwind, vecGC,
258 ip1[0]+xoff, ip1[1]+yoff,
259 ip2[0]+xoff, ip2[1]+yoff);
260 if (slow) {
261 XFlush(theDisplay);
262 sleep(1);
263 }
264 }