--- ray/src/rt/rview.c 1992/09/21 12:08:00 2.8 +++ ray/src/rt/rview.c 2003/07/02 01:15:20 2.21 @@ -1,30 +1,39 @@ -/* Copyright (c) 1992 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: rview.c,v 2.21 2003/07/02 01:15:20 greg Exp $"; #endif - /* * rview.c - routines and variables for interactive view generation. * - * 3/24/87 + * External symbols declared in rpaint.h */ -#include "ray.h" +#include "copyright.h" -#include "rpaint.h" - #include - #include -VIEW ourview = STDVIEW; /* viewing parameters */ -int hresolu, vresolu; /* image resolution */ +#include "platform.h" +#include "ray.h" +#include "rpaint.h" + +CUBE thescene; /* our scene */ +OBJECT nsceneobjs; /* number of objects in our scene */ + int dimlist[MAXDIM]; /* sampling dimensions */ int ndims = 0; /* number of sampling dimensions */ int samplendx = 0; /* index for this sample */ +extern void ambnotify(); +void (*addobjnotify[])() = {ambnotify, NULL}; + +VIEW ourview = STDVIEW; /* viewing parameters */ +int hresolu, vresolu; /* image resolution */ + +void (*trace)() = NULL; /* trace call */ + +int do_irrad = 0; /* compute irradiance? */ + int psample = 8; /* pixel sample size */ double maxdiff = .15; /* max. sample difference */ @@ -35,16 +44,25 @@ double shadthresh = .1; /* shadow threshold */ double shadcert = .25; /* shadow certainty */ int directrelay = 0; /* number of source relays */ int vspretest = 128; /* virtual source pretest density */ -int directinvis = 0; /* sources invisible? */ +int directvis = 1; /* sources visible? */ double srcsizerat = 0.; /* maximum ratio source size/dist. */ +COLOR cextinction = BLKCOLOR; /* global extinction coefficient */ +COLOR salbedo = BLKCOLOR; /* global scattering albedo */ +double seccg = 0.; /* global scattering eccentricity */ +double ssampdist = 0.; /* scatter sampling distance */ + double specthresh = .3; /* specular sampling threshold */ double specjitter = 1.; /* specular sampling jitter */ +int backvis = 1; /* back face visibility */ + int maxdepth = 4; /* maximum recursion depth */ double minweight = 1e-2; /* minimum ray weight */ +char *ambfile = NULL; /* ambient file name */ COLOR ambval = BLKCOLOR; /* ambient value */ +int ambvwt = 0; /* initial weight for ambient value */ double ambacc = 0.2; /* ambient accuracy */ int ambres = 8; /* ambient resolution */ int ambdiv = 32; /* ambient divisions */ @@ -54,10 +72,12 @@ char *amblist[128]; /* ambient include/exclude list int ambincl = -1; /* include == 1, exclude == 0 */ int greyscale = 0; /* map colors to brightness? */ -char *devname = dev_default; /* output device name */ +char *dvcname = dev_default; /* output device name */ struct driver *dev = NULL; /* driver functions */ +char rifname[128]; /* rad input file name */ + VIEW oldview; /* previous view parameters */ PNODE ptrunk; /* the base of our image */ @@ -71,14 +91,20 @@ static char *reserve_mem = NULL; /* pre-allocated res #define CTRL(c) ((c)-'@') +void quit(code) /* quit program */ int code; { +#ifdef MSTATS + if (code == 2 && errno == ENOMEM) + printmemstats(stderr); +#endif devclose(); exit(code); } +void devopen(dname) /* open device driver */ char *dname; { @@ -95,16 +121,15 @@ char *dname; error(USER, errmsg); } else return; -#ifndef NIX /* not there, try exec */ if ((dev = comm_init(dname, id)) == NULL) { sprintf(errmsg, "cannot start device \"%s\"", dname); error(USER, errmsg); } -#endif } +void devclose() /* close our device */ { if (dev != NULL) @@ -113,6 +138,7 @@ devclose() /* close our device */ } +void printdevices() /* print list of output devices */ { register int i; @@ -122,11 +148,12 @@ printdevices() /* print list of output devices */ } +void rview() /* do a view */ { char buf[32]; - devopen(devname); /* open device */ + devopen(dvcname); /* open device */ newimage(); /* start image (calls fillreserves) */ for ( ; ; ) { /* quit in command() */ @@ -154,14 +181,16 @@ rview() /* do a view */ } +void fillreserves() /* fill memory reserves */ { if (reserve_mem != NULL) return; - reserve_mem = malloc(RESERVE_AMT); + reserve_mem = (char *)malloc(RESERVE_AMT); } +void freereserves() /* free memory reserves */ { if (reserve_mem == NULL) @@ -171,6 +200,7 @@ freereserves() /* free memory reserves */ } +void command(prompt) /* get/execute command */ char *prompt; { @@ -185,9 +215,13 @@ again: else *++args = '\0'; switch (inpbuf[0]) { - case 'f': /* new frame */ - if (badcom("frame")) - goto commerr; + case 'f': /* new frame (or free mem.) */ + if (badcom("frame")) { + if (badcom("free")) + goto commerr; + free_objmem(); + break; + } getframe(args); break; case 'v': /* view */ @@ -200,14 +234,29 @@ again: goto commerr; lastview(args); break; + case 'V': /* save view */ + if (badcom("V")) + goto commerr; + saveview(args); + break; + case 'L': /* load view */ + if (badcom("L")) + goto commerr; + loadview(args); + break; case 'e': /* exposure */ if (badcom("exposure")) goto commerr; getexposure(args); break; case 's': /* set a parameter */ - if (badcom("set")) + if (badcom("set")) { +#ifdef SIGTSTP + if (!badcom("stop")) + goto dostop; +#endif goto commerr; + } setparam(args); break; case 'n': /* new picture */ @@ -225,7 +274,7 @@ again: goto commerr; getaim(args); break; - case 'm': /* move camera */ + case 'm': /* move camera (or memstats) */ if (badcom("move")) #ifdef MSTATS { @@ -241,16 +290,23 @@ again: break; case 'r': /* rotate/repaint */ if (badcom("rotate")) { - if (badcom("repaint")) - goto commerr; + if (badcom("repaint")) { + if (badcom("redraw")) + goto commerr; + redraw(); + break; + } getrepaint(args); break; } getrotate(args); break; case 'p': /* pivot view */ - if (badcom("pivot")) - goto commerr; + if (badcom("pivot")) { + if (badcom("pause")) + goto commerr; + goto again; + } getpivot(args); break; case CTRL('R'): /* redraw */ @@ -268,11 +324,12 @@ again: case CTRL('C'): /* interrupt */ goto again; #ifdef SIGTSTP - case CTRL('Z'): /* stop */ + case CTRL('Z'):; /* stop */ +dostop: devclose(); kill(0, SIGTSTP); /* pc stops here */ - devopen(devname); + devopen(dvcname); redraw(); break; #endif @@ -292,6 +349,7 @@ commerr: } +void rsample() /* sample the image */ { int xsiz, ysiz, y; @@ -307,14 +365,14 @@ rsample() /* sample the image */ * difference, we subsample the super-pixels. The testing process * includes initialization of the next row. */ - xsiz = (((pframe.r-pframe.l)<