--- ray/src/rt/rview.c 1989/10/27 11:48:25 1.8
+++ ray/src/rt/rview.c 2003/02/22 02:07:29 2.18
@@ -1,18 +1,70 @@
-/* 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
*/
-#include "standard.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 "color.h"
+#include "ray.h"
#include "rpaint.h"
@@ -20,22 +72,53 @@ static char SCCSid[] = "$SunId$ LBL";
#include
-VIEW ourview = STDVIEW(470); /* viewing parameters */
+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 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 */
@@ -44,27 +127,39 @@ char *amblist[128]; /* ambient include/exclude list
int ambincl = -1; /* include == 1, exclude == 0 */
int greyscale = 0; /* map colors to brightness? */
-char *devname = "X"; /* 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 */
RECT pframe; /* current frame boundaries */
int pdepth; /* image depth in current frame */
-#define CTRL(c) ('c'-'@')
+static char *reserve_mem = NULL; /* pre-allocated reserve memory */
+#define RESERVE_AMT 32768 /* amount of memory to reserve */
+#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;
{
@@ -81,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)
@@ -97,6 +195,7 @@ devclose() /* close our device */
}
+void
printdevices() /* print list of output devices */
{
register int i;
@@ -106,56 +205,80 @@ printdevices() /* print list of output devices */
}
+void
rview() /* do a view */
{
char buf[32];
- devopen(devname); /* open device */
- newimage(); /* set up image */
+ devopen(dvcname); /* open device */
+ newimage(); /* start image (calls fillreserves) */
for ( ; ; ) { /* quit in command() */
- while (ourview.hresolu <= 1<comout)(buf);
rsample();
} else {
sprintf(buf, "%d refining...\n", 1<comout)(buf);
- refine(&ptrunk, 0, 0, ourview.hresolu,
- ourview.vresolu, pdepth+1);
+ refine(&ptrunk, 0, 0, hresolu, vresolu, pdepth+1);
}
- if (dev->inpready)
+ if (errno == ENOMEM) /* ran out of memory */
+ freereserves();
+ else if (dev->inpready) /* noticed some input */
command(": ");
- else
+ else /* finished this depth */
pdepth++;
}
}
+void
+fillreserves() /* fill memory reserves */
+{
+ if (reserve_mem != NULL)
+ return;
+ reserve_mem = (char *)malloc(RESERVE_AMT);
+}
+
+
+void
+freereserves() /* free memory reserves */
+{
+ if (reserve_mem == NULL)
+ return;
+ free(reserve_mem);
+ reserve_mem = NULL;
+}
+
+
+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:
- (*dev->comout)(prompt); /* get command + arguments */
- (*dev->comin)(inpbuf);
+ (*dev->comin)(inpbuf, prompt); /* get command + arguments */
for (args = inpbuf; *args && *args != ' '; args++)
;
if (*args) *args++ = '\0';
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 */
@@ -168,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 */
@@ -193,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 */
@@ -224,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
@@ -247,49 +402,52 @@ 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)<>pdepth),
+ rl[x].r = hresolu; rl[x].u = vresolu;
+ pl[x] = findrect(pframe.l+((x*hresolu)>>pdepth),
pframe.d, &ptrunk, rl+x, pdepth);
}
/* sample the image */
for (y = 0; /* y < ysiz */ ; y++) {
for (x = 0; x < xsiz-1; x++) {
- if (dev->inpready)
+ if (dev->inpready || errno == ENOMEM)
goto escape;
/*
* Test super-pixel to the right.
@@ -305,15 +463,15 @@ rsample() /* sample the image */
if (y >= ysiz-1)
break;
for (x = 0; x < xsiz; x++) {
- if (dev->inpready)
+ if (dev->inpready || errno == ENOMEM)
goto escape;
/*
* Find super-pixel at this position in next row.
*/
r.l = r.d = 0;
- r.r = ourview.hresolu; r.u = ourview.vresolu;
- p = findrect(pframe.l+((x*ourview.hresolu)>>pdepth),
- pframe.d+(((y+1)*ourview.vresolu)>>pdepth),
+ r.r = hresolu; r.u = vresolu;
+ p = findrect(pframe.l+((x*hresolu)>>pdepth),
+ pframe.d+(((y+1)*vresolu)>>pdepth),
&ptrunk, &r, pdepth);
/*
* Test super-pixel in next row.
@@ -332,14 +490,14 @@ rsample() /* sample the image */
}
}
escape:
- free((char *)rl);
- free((char *)pl);
+ free((void *)rl);
+ free((void *)pl);
}
int
refine(p, xmin, ymin, xmax, ymax, pd) /* refine a node */
-register PNODE *p;
+register PNODE *p;
int xmin, ymin, xmax, ymax;
int pd;
{
@@ -360,10 +518,10 @@ int pd;
if (p->kid == NULL) { /* subdivide */
if ((p->kid = newptree()) == NULL)
- error(SYSTEM, "out of memory in refine");
+ return(0);
/*
* The following paint order can leave a black pixel
- * when redraw() is called in (*dev->paintr)().
+ * if redraw() is called in (*dev->paintr)().
*/
if (p->x >= mx && p->y >= my)
pcopy(p, p->kid+UR);