ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/xshowtrace.c
Revision: 1.1
Committed: Sat Sep 22 10:53:57 1990 UTC (33 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

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