ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/xshowtrace.c
Revision: 1.6
Committed: Fri Jul 26 14:14:03 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +2 -2 lines
Log Message:
changed command names and options

File Contents

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