--- ray/src/rt/rview.c 1991/11/12 17:08:43 2.1
+++ ray/src/rt/rview.c 2003/02/22 02:07:29 2.18
@@ -1,15 +1,69 @@
-/* Copyright (c) 1987 Regents of the University of California */
-
#ifndef lint
-static char SCCSid[] = "$SunId$ LBL";
+static const char RCSid[] = "$Id: rview.c,v 2.18 2003/02/22 02:07:29 greg Exp $";
#endif
-
/*
* rview.c - routines and variables for interactive view generation.
*
- * 3/24/87
+ * External symbols declared in rpaint.h
*/
+/* ====================================================================
+ * The Radiance Software License, Version 1.0
+ *
+ * Copyright (c) 1990 - 2002 The Regents of the University of California,
+ * through Lawrence Berkeley National Laboratory. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes Radiance software
+ * (http://radsite.lbl.gov/)
+ * developed by the Lawrence Berkeley National Laboratory
+ * (http://www.lbl.gov/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
+ * and "The Regents of the University of California" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact radiance@radsite.lbl.gov.
+ *
+ * 5. Products derived from this software may not be called "Radiance",
+ * nor may "Radiance" appear in their name, without prior written
+ * permission of Lawrence Berkeley National Laboratory.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of Lawrence Berkeley National Laboratory. For more
+ * information on Lawrence Berkeley National Laboratory, please see
+ * .
+ */
+
#include "ray.h"
#include "rpaint.h"
@@ -18,31 +72,53 @@ static char SCCSid[] = "$SunId$ LBL";
#include
-VIEW ourview = STDVIEW; /* viewing parameters */
-int hresolu, vresolu; /* image resolution */
+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 */
+double maxdiff = .15; /* max. sample difference */
-double exposure = 1.0; /* exposure for scene */
+double exposure = 1.0; /* exposure for scene */
-double dstrsrc = 0.0; /* square source distribution */
-double shadthresh = .1; /* shadow threshold */
-double shadcert = .25; /* shadow certainty */
+double dstrsrc = 0.0; /* square source distribution */
+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? */
-double srcsizerat = 0.; /* maximum ratio source size/dist. */
+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 */
+double minweight = 1e-2; /* minimum ray weight */
+char *ambfile = NULL; /* ambient file name */
COLOR ambval = BLKCOLOR; /* ambient value */
-double ambacc = 0.2; /* ambient accuracy */
+int ambvwt = 0; /* initial weight for ambient value */
+double ambacc = 0.2; /* ambient accuracy */
int ambres = 8; /* ambient resolution */
int ambdiv = 32; /* ambient divisions */
int ambssamp = 0; /* ambient super-samples */
@@ -51,10 +127,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 */
@@ -65,17 +143,23 @@ static char *reserve_mem = NULL; /* pre-allocated res
#define RESERVE_AMT 32768 /* amount of memory to reserve */
-#define CTRL(c) ('c'-'@')
+#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;
{
@@ -92,14 +176,17 @@ 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)
@@ -108,6 +195,7 @@ devclose() /* close our device */
}
+void
printdevices() /* print list of output devices */
{
register int i;
@@ -117,11 +205,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() */
@@ -149,14 +238,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)
@@ -166,11 +257,11 @@ freereserves() /* free memory reserves */
}
+void
command(prompt) /* get/execute command */
char *prompt;
{
-#define badcom(s) strncmp(s, inpbuf, args-inpbuf-1)
- double atof();
+#define badcom(s) strncmp(s, inpbuf, args-inpbuf-1)
char inpbuf[256];
char *args;
again:
@@ -181,9 +272,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 */
@@ -196,14 +291,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 */
@@ -221,26 +331,42 @@ again:
goto commerr;
getaim(args);
break;
- case 'm': /* move camera */
+ case 'm': /* move camera (or memstats) */
if (badcom("move"))
+#ifdef MSTATS
+ {
+ if (badcom("memory"))
+ goto commerr;
+ printmemstats(stderr);
+ break;
+ }
+#else
goto commerr;
+#endif
getmove(args);
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 */
+ case CTRL('R'): /* redraw */
redraw();
break;
case 'w': /* write */
@@ -252,14 +378,15 @@ again:
if (badcom("quit"))
goto commerr;
quit(0);
- case CTRL(C): /* interrupt */
+ case CTRL('C'): /* interrupt */
goto again;
-#ifdef SIGTSTP
- case CTRL(Z): /* stop */
+#ifdef SIGTSTP
+ case CTRL('Z'):; /* stop */
+dostop:
devclose();
kill(0, SIGTSTP);
/* pc stops here */
- devopen(devname);
+ devopen(dvcname);
redraw();
break;
#endif
@@ -275,33 +402,36 @@ commerr:
error(COMMAND, errmsg);
break;
}
-#undef badcom
+#undef badcom
}
+void
rsample() /* sample the image */
{
int xsiz, ysiz, y;
RECT r;
PNODE *p;
register RECT *rl;
- register PNODE **pl;
+ register PNODE **pl;
register int x;
/*
* We initialize the bottom row in the image at our current
- * resolution. During sampling, we check super-pixels to the
+ * resolution. During sampling, we check super-pixels to the
* right and above by calling bigdiff(). If there is a significant
* difference, we subsample the super-pixels. The testing process
* includes initialization of the next row.
*/
- xsiz = (((pframe.r-pframe.l)<paintr)().
+ * if redraw() is called in (*dev->paintr)().
*/
if (p->x >= mx && p->y >= my)
pcopy(p, p->kid+UR);