ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rview.c
Revision: 2.29
Committed: Thu Aug 21 07:05:59 2008 UTC (15 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.28: +64 -172 lines
Log Message:
Added -n option to rvu for multiple rendering processes

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.29 static const char RCSid[] = "$Id: rview.c,v 2.28 2005/06/13 20:07:56 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * rview.c - routines and variables for interactive view generation.
6     *
7 greg 2.18 * External symbols declared in rpaint.h
8     */
9    
10 greg 2.19 #include "copyright.h"
11 greg 1.1
12 schorsch 2.20 #include <signal.h>
13     #include <ctype.h>
14    
15 greg 1.15 #include "ray.h"
16 greg 1.1 #include "rpaint.h"
17    
18 greg 2.8 #define CTRL(c) ((c)-'@')
19 greg 1.1
20    
21 greg 2.18 void
22 greg 2.29 devopen( /* open device driver */
23     char *dname
24     )
25 greg 1.1 {
26 greg 1.6 extern char *progname, *octname;
27 greg 1.7 char *id;
28 greg 2.29 int i;
29 greg 1.6
30 greg 1.7 id = octname!=NULL ? octname : progname;
31 greg 1.1 /* check device table */
32     for (i = 0; devtable[i].name; i++)
33 schorsch 2.23 if (!strcmp(dname, devtable[i].name)) {
34 greg 1.7 if ((dev = (*devtable[i].init)(dname, id)) == NULL) {
35 greg 1.1 sprintf(errmsg, "cannot initialize %s", dname);
36     error(USER, errmsg);
37     } else
38     return;
39 schorsch 2.23 }
40 greg 1.1 /* not there, try exec */
41 greg 1.7 if ((dev = comm_init(dname, id)) == NULL) {
42 greg 1.1 sprintf(errmsg, "cannot start device \"%s\"", dname);
43     error(USER, errmsg);
44     }
45     }
46    
47    
48 greg 2.18 void
49 greg 2.29 devclose(void) /* close our device */
50 greg 1.1 {
51     if (dev != NULL)
52     (*dev->close)();
53     dev = NULL;
54     }
55    
56    
57 greg 2.18 void
58 greg 2.29 printdevices(void) /* print list of output devices */
59 greg 1.1 {
60 greg 2.29 int i;
61 greg 1.1
62     for (i = 0; devtable[i].name; i++)
63     printf("%-16s # %s\n", devtable[i].name, devtable[i].descrip);
64     }
65    
66    
67 greg 2.18 void
68 greg 2.29 rview(void) /* do a view */
69 greg 1.1 {
70     char buf[32];
71    
72 greg 2.18 devopen(dvcname); /* open device */
73 greg 2.29 newimage(NULL); /* start image */
74 greg 1.14
75 greg 1.1 for ( ; ; ) { /* quit in command() */
76 greg 1.14 while (hresolu <= 1<<pdepth && vresolu <= 1<<pdepth)
77 greg 1.1 command("done: ");
78 greg 1.14 errno = 0;
79     if (hresolu <= psample<<pdepth && vresolu <= psample<<pdepth) {
80 greg 1.1 sprintf(buf, "%d sampling...\n", 1<<pdepth);
81     (*dev->comout)(buf);
82     rsample();
83     } else {
84     sprintf(buf, "%d refining...\n", 1<<pdepth);
85     (*dev->comout)(buf);
86 greg 2.29 refine(&ptrunk, pdepth+1);
87 greg 1.1 }
88 greg 2.29 if (waitrays() < 0)
89     quit(1);
90     if (dev->inpready) /* noticed some input */
91 greg 1.1 command(": ");
92 greg 1.14 else /* finished this depth */
93 greg 1.1 pdepth++;
94     }
95     }
96    
97    
98 greg 2.18 void
99 greg 2.29 command( /* get/execute command */
100     char *prompt
101     )
102 greg 1.1 {
103 greg 2.8 #define badcom(s) strncmp(s, inpbuf, args-inpbuf-1)
104 greg 1.1 char inpbuf[256];
105     char *args;
106     again:
107 greg 1.10 (*dev->comin)(inpbuf, prompt); /* get command + arguments */
108 greg 1.1 for (args = inpbuf; *args && *args != ' '; args++)
109     ;
110     if (*args) *args++ = '\0';
111     else *++args = '\0';
112    
113     switch (inpbuf[0]) {
114 greg 2.27 case 'f': /* new frame (|focus|free) */
115 greg 2.10 if (badcom("frame")) {
116 greg 2.27 if (badcom("focus")) {
117     if (badcom("free"))
118     goto commerr;
119     free_objmem();
120     break;
121     }
122     getfocus(args);
123 greg 2.10 break;
124     }
125 greg 1.1 getframe(args);
126     break;
127     case 'v': /* view */
128     if (badcom("view"))
129     goto commerr;
130     getview(args);
131     break;
132     case 'l': /* last view */
133     if (badcom("last"))
134     goto commerr;
135     lastview(args);
136 greg 2.11 break;
137     case 'V': /* save view */
138     if (badcom("V"))
139     goto commerr;
140     saveview(args);
141     break;
142     case 'L': /* load view */
143     if (badcom("L"))
144     goto commerr;
145     loadview(args);
146 greg 1.1 break;
147     case 'e': /* exposure */
148     if (badcom("exposure"))
149     goto commerr;
150     getexposure(args);
151     break;
152     case 's': /* set a parameter */
153 greg 2.13 if (badcom("set")) {
154     #ifdef SIGTSTP
155     if (!badcom("stop"))
156     goto dostop;
157     #endif
158 greg 1.1 goto commerr;
159 greg 2.13 }
160 greg 1.1 setparam(args);
161     break;
162     case 'n': /* new picture */
163     if (badcom("new"))
164     goto commerr;
165 greg 2.29 newimage(args);
166 greg 1.1 break;
167     case 't': /* trace a ray */
168     if (badcom("trace"))
169     goto commerr;
170     traceray(args);
171     break;
172     case 'a': /* aim camera */
173     if (badcom("aim"))
174     goto commerr;
175     getaim(args);
176     break;
177 greg 2.10 case 'm': /* move camera (or memstats) */
178 greg 1.1 if (badcom("move"))
179 greg 2.8 #ifdef MSTATS
180 greg 2.2 {
181     if (badcom("memory"))
182     goto commerr;
183     printmemstats(stderr);
184     break;
185     }
186     #else
187 greg 1.1 goto commerr;
188 greg 2.2 #endif
189 greg 1.1 getmove(args);
190     break;
191 greg 1.8 case 'r': /* rotate/repaint */
192     if (badcom("rotate")) {
193 greg 2.13 if (badcom("repaint")) {
194     if (badcom("redraw"))
195     goto commerr;
196     redraw();
197     break;
198     }
199 greg 1.8 getrepaint(args);
200     break;
201     }
202 greg 1.1 getrotate(args);
203     break;
204     case 'p': /* pivot view */
205 greg 2.13 if (badcom("pivot")) {
206     if (badcom("pause"))
207     goto commerr;
208     goto again;
209     }
210 greg 1.1 getpivot(args);
211     break;
212 greg 2.4 case CTRL('R'): /* redraw */
213 greg 1.1 redraw();
214     break;
215     case 'w': /* write */
216     if (badcom("write"))
217     goto commerr;
218     writepict(args);
219     break;
220     case 'q': /* quit */
221     if (badcom("quit"))
222     goto commerr;
223     quit(0);
224 greg 2.4 case CTRL('C'): /* interrupt */
225 greg 1.1 goto again;
226 greg 2.8 #ifdef SIGTSTP
227 greg 2.13 case CTRL('Z'):; /* stop */
228     dostop:
229 greg 1.1 devclose();
230     kill(0, SIGTSTP);
231     /* pc stops here */
232 greg 2.18 devopen(dvcname);
233 greg 1.1 redraw();
234     break;
235     #endif
236     case '\0': /* continue */
237     break;
238     default:;
239     commerr:
240     if (iscntrl(inpbuf[0]))
241     sprintf(errmsg, "^%c: unknown control",
242     inpbuf[0]|0100);
243     else
244     sprintf(errmsg, "%s: unknown command", inpbuf);
245     error(COMMAND, errmsg);
246     break;
247     }
248 greg 2.8 #undef badcom
249 greg 1.1 }
250    
251    
252 greg 2.18 void
253 greg 2.29 rsample(void) /* sample the image */
254 greg 1.1 {
255     int xsiz, ysiz, y;
256     PNODE *p;
257 greg 2.29 PNODE **pl;
258     int x;
259 greg 1.1 /*
260     * We initialize the bottom row in the image at our current
261 greg 2.8 * resolution. During sampling, we check super-pixels to the
262 greg 1.1 * right and above by calling bigdiff(). If there is a significant
263     * difference, we subsample the super-pixels. The testing process
264     * includes initialization of the next row.
265     */
266 greg 2.12 xsiz = (((long)(pframe.r-pframe.l)<<pdepth)+hresolu-1) / hresolu;
267     ysiz = (((long)(pframe.u-pframe.d)<<pdepth)+vresolu-1) / vresolu;
268 greg 1.1 pl = (PNODE **)malloc(xsiz*sizeof(PNODE *));
269 greg 2.29 if (pl == NULL)
270 greg 1.14 return;
271 greg 1.1 /*
272     * Initialize the bottom row.
273     */
274 greg 2.29 pl[0] = findrect(pframe.l, pframe.d, &ptrunk, pdepth);
275 greg 1.1 for (x = 1; x < xsiz; x++) {
276 greg 1.9 pl[x] = findrect(pframe.l+((x*hresolu)>>pdepth),
277 greg 2.29 pframe.d, &ptrunk, pdepth);
278 greg 1.1 }
279     /* sample the image */
280     for (y = 0; /* y < ysiz */ ; y++) {
281     for (x = 0; x < xsiz-1; x++) {
282 greg 1.20 if (dev->inpready || errno == ENOMEM)
283 greg 1.1 goto escape;
284     /*
285     * Test super-pixel to the right.
286     */
287     if (pl[x] != pl[x+1] && bigdiff(pl[x]->v,
288     pl[x+1]->v, maxdiff)) {
289 greg 2.29 refine(pl[x], 1);
290     refine(pl[x+1], 1);
291 greg 1.1 }
292     }
293     if (y >= ysiz-1)
294     break;
295     for (x = 0; x < xsiz; x++) {
296 greg 1.20 if (dev->inpready || errno == ENOMEM)
297 greg 1.1 goto escape;
298     /*
299     * Find super-pixel at this position in next row.
300     */
301 greg 1.9 p = findrect(pframe.l+((x*hresolu)>>pdepth),
302     pframe.d+(((y+1)*vresolu)>>pdepth),
303 greg 2.29 &ptrunk, pdepth);
304 greg 1.1 /*
305     * Test super-pixel in next row.
306     */
307     if (pl[x] != p && bigdiff(pl[x]->v, p->v, maxdiff)) {
308 greg 2.29 refine(pl[x], 1);
309     refine(p, 1);
310 greg 1.1 }
311     /*
312     * Copy into super-pixel array.
313     */
314     pl[x] = p;
315     }
316     }
317     escape:
318 greg 2.18 free((void *)pl);
319 greg 1.1 }
320    
321    
322     int
323 greg 2.29 refine( /* refine a node */
324     PNODE *p,
325     int pd
326     )
327 greg 1.1 {
328     int growth;
329     int mx, my;
330     int i;
331    
332     if (dev->inpready) /* quit for input */
333     return(0);
334    
335     if (pd <= 0) /* depth limit */
336     return(0);
337    
338 greg 2.29 mx = (p->xmin + p->xmax) >> 1;
339     my = (p->ymin + p->ymax) >> 1;
340 greg 1.1 growth = 0;
341    
342     if (p->kid == NULL) { /* subdivide */
343    
344     if ((p->kid = newptree()) == NULL)
345 greg 1.20 return(0);
346 greg 2.29
347     p->kid[UR].xmin = mx;
348     p->kid[UR].ymin = my;
349     p->kid[UR].xmax = p->xmax;
350     p->kid[UR].ymax = p->ymax;
351     p->kid[UL].xmin = p->xmin;
352     p->kid[UL].ymin = my;
353     p->kid[UL].xmax = mx;
354     p->kid[UL].ymax = p->ymax;
355     p->kid[DR].xmin = mx;
356     p->kid[DR].ymin = p->ymin;
357     p->kid[DR].xmax = p->xmax;
358     p->kid[DR].ymax = my;
359     p->kid[DL].xmin = p->xmin;
360     p->kid[DL].ymin = p->ymin;
361     p->kid[DL].xmax = mx;
362     p->kid[DL].ymax = my;
363 greg 1.1 /*
364     * The following paint order can leave a black pixel
365 greg 2.7 * if redraw() is called in (*dev->paintr)().
366 greg 1.1 */
367     if (p->x >= mx && p->y >= my)
368     pcopy(p, p->kid+UR);
369 greg 2.29 else if (paint(p->kid+UR) < 0)
370     quit(1);
371 greg 1.1 if (p->x < mx && p->y >= my)
372     pcopy(p, p->kid+UL);
373 greg 2.29 else if (paint(p->kid+UL) < 0)
374     quit(1);
375 greg 1.1 if (p->x >= mx && p->y < my)
376     pcopy(p, p->kid+DR);
377 greg 2.29 else if (paint(p->kid+DR) < 0)
378     quit(1);
379 greg 1.1 if (p->x < mx && p->y < my)
380     pcopy(p, p->kid+DL);
381 greg 2.29 else if (paint(p->kid+DL) < 0)
382     quit(1);
383 greg 1.1
384     growth++;
385     }
386     /* do children */
387     if (mx > pframe.l) {
388     if (my > pframe.d)
389 greg 2.29 growth += refine(p->kid+DL, pd-1);
390 greg 1.1 if (my < pframe.u)
391 greg 2.29 growth += refine(p->kid+UL, pd-1);
392 greg 1.1 }
393     if (mx < pframe.r) {
394     if (my > pframe.d)
395 greg 2.29 growth += refine(p->kid+DR, pd-1);
396 greg 1.1 if (my < pframe.u)
397 greg 2.29 growth += refine(p->kid+UR, pd-1);
398 greg 1.1 }
399     /* recompute sum */
400     if (growth) {
401     setcolor(p->v, 0.0, 0.0, 0.0);
402     for (i = 0; i < 4; i++)
403     addcolor(p->v, p->kid[i].v);
404     scalecolor(p->v, 0.25);
405     }
406     return(growth);
407     }