ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/xshowtrace.c
Revision: 1.3
Committed: Mon Sep 24 12:21:06 1990 UTC (33 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -1 lines
Log Message:
added -f option to x11image command

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