ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/xshowtrace.c
Revision: 2.7
Committed: Sat Feb 22 02:07:28 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.6: +2 -6 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

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