--- ray/src/rt/rpict.c 2003/02/22 02:07:29 2.52
+++ ray/src/rt/rpict.c 2003/09/24 14:55:54 2.63
@@ -1,72 +1,18 @@
#ifndef lint
-static const char RCSid[] = "$Id: rpict.c,v 2.52 2003/02/22 02:07:29 greg Exp $";
+static const char RCSid[] = "$Id";
#endif
/*
* rpict.c - routines and variables for picture generation.
*/
-/* ====================================================================
- * 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 "copyright.h"
+#include "platform.h"
#include "ray.h"
#include
-#ifndef NIX
+#ifndef NON_POSIX
#ifdef BSD
#include
#include
@@ -76,21 +22,21 @@ static const char RCSid[] = "$Id: rpict.c,v 2.52 2003/
#endif
#endif
-extern time_t time();
-
+#include
#include
#include "view.h"
-
#include "random.h"
-
#include "paths.h"
+
#define RFTEMPLATE "rfXXXXXX"
#ifndef SIGCONT
+#ifdef SIGIO /* XXX can we live without this? */
#define SIGCONT SIGIO
#endif
+#endif
CUBE thescene; /* our scene */
OBJECT nsceneobjs; /* number of objects in our scene */
@@ -135,16 +81,16 @@ double specjitter = 1.; /* specular sampling jitter *
int backvis = 1; /* back face visibility */
-int maxdepth = 6; /* maximum recursion depth */
-double minweight = 5e-3; /* minimum ray weight */
+int maxdepth = 7; /* maximum recursion depth */
+double minweight = 4e-3; /* 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 = 32; /* ambient resolution */
-int ambdiv = 128; /* ambient divisions */
-int ambssamp = 0; /* ambient super-samples */
+double ambacc = 0.15; /* ambient accuracy */
+int ambres = 64; /* ambient resolution */
+int ambdiv = 512; /* ambient divisions */
+int ambssamp = 128; /* ambient super-samples */
int ambounce = 0; /* ambient bounces */
char *amblist[128]; /* ambient include/exclude list */
int ambincl = -1; /* include == 1, exclude == 0 */
@@ -163,15 +109,13 @@ int hres, vres; /* resolution for this frame */
static VIEW lastview; /* the previous view input */
-extern char *mktemp();
+extern char *mktemp(); /* XXX should be in stdlib.h or unistd.h */
void report();
double pixvalue();
-#ifdef NIX
-#define file_exists(f) (access(f,F_OK)==0)
-#else
+#ifdef RHAS_STAT
#include
#include
int
@@ -182,6 +126,8 @@ char *fname;
if (stat(fname, &sbuf) < 0) return(0);
return((sbuf.st_mode & S_IFREG) != 0);
}
+#else
+#define file_exists(f) (access(f,F_OK)==0)
#endif
@@ -191,7 +137,7 @@ int code;
{
if (code) /* report status */
report();
-#ifndef NIX
+#ifndef NON_POSIX
headclean(); /* delete header file */
pfclean(); /* clean up persist files */
#endif
@@ -199,7 +145,7 @@ int code;
}
-#ifndef NIX
+#ifndef NON_POSIX
void
report() /* report progress */
{
@@ -236,7 +182,7 @@ report() /* report progress */
nrays, pctdone, u/3600., s/3600.,
(tlastrept-tstart)/3600., myhostname());
eputs(errmsg);
-#ifndef BSD
+#ifdef SIGCONT
signal(SIGCONT, report);
#endif
}
@@ -268,7 +214,6 @@ char *pout, *zout, *prvr;
* sequenced file naming.
*/
{
- extern char *rindex(), *strncpy(), *strcat(), *strcpy();
char fbuf[128], fbuf2[128];
int npicts;
register char *cp;
@@ -298,7 +243,7 @@ char *pout, *zout, *prvr;
setview(&ourview);
prvr = fbuf; /* mark for renaming */
}
- if (pout != NULL & prvr != NULL) {
+ if ((pout != NULL) & (prvr != NULL)) {
sprintf(fbuf, pout, seq);
if (!strcmp(prvr, fbuf)) { /* rename */
strcpy(fbuf2, fbuf);
@@ -308,7 +253,7 @@ char *pout, *zout, *prvr;
cp--;
strcpy(cp, RFTEMPLATE);
prvr = mktemp(fbuf2);
- if (rename(fbuf, prvr) < 0)
+ if (rename(fbuf, prvr) < 0) {
if (errno == ENOENT) { /* ghost file */
sprintf(errmsg,
"new output file \"%s\"",
@@ -321,6 +266,7 @@ char *pout, *zout, *prvr;
fbuf, prvr);
error(SYSTEM, errmsg);
}
+ }
}
}
npicts = 0; /* render sequence */
@@ -345,13 +291,11 @@ char *pout, *zout, *prvr;
"cannot open output file \"%s\"", fbuf);
error(SYSTEM, errmsg);
}
-#ifdef MSDOS
- setmode(fileno(stdout), O_BINARY);
-#endif
+ SET_FILE_BINARY(stdout);
dupheader();
}
hres = hresolu; vres = vresolu; pa = pixaspect;
- if (prvr != NULL)
+ if (prvr != NULL) {
if (viewfile(prvr, &ourview, &rs) <= 0
|| rs.rt != PIXSTANDARD) {
sprintf(errmsg,
@@ -362,6 +306,7 @@ char *pout, *zout, *prvr;
hres = scanlen(&rs);
vres = numscans(&rs);
}
+ }
if ((cp = setview(&ourview)) != NULL)
error(USER, cp);
normaspect(viewaspect(&ourview), &pa, &hres, &vres);
@@ -379,6 +324,7 @@ char *pout, *zout, *prvr;
putchar('\n');
if (pa < .99 || pa > 1.01)
fputaspect(pa, stdout);
+ fputnow(stdout);
fputformat(COLRFMT, stdout);
putchar('\n');
if (zout != NULL)
@@ -400,7 +346,7 @@ FILE *fp;
{
char linebuf[256];
- copystruct(&lastview, &ourview);
+ lastview = ourview;
while (fgets(linebuf, sizeof(linebuf), fp) != NULL)
if (isview(linebuf) && sscanview(&ourview, linebuf) > 0)
return(0);
@@ -449,9 +395,7 @@ char *zfile, *oldfile;
sprintf(errmsg, "cannot open z-file \"%s\"", zfile);
error(SYSTEM, errmsg);
}
-#ifdef MSDOS
- setmode(zfd, O_BINARY);
-#endif
+ SET_FD_BINARY(zfd);
for (i = 0; i <= psample; i++) {
zbar[i] = (float *)malloc(hres*sizeof(float));
if (zbar[i] == NULL)
@@ -474,10 +418,10 @@ char *zfile, *oldfile;
pctdone = 100.0*i/vres;
if (ralrm > 0) /* report init stats */
report();
-#ifndef BSD
+#ifdef SIGCONT
else
-#endif
signal(SIGCONT, report);
+#endif
ypos = vres-1 - i; /* initialize sampling */
if (directvis)
init_drawsources(psample);
@@ -503,7 +447,7 @@ char *zfile, *oldfile;
if (directvis) /* add bitty sources */
drawsources(scanbar, zbar, 0, hres, ypos, ystep);
/* write it out */
-#ifndef BSD
+#ifdef SIGCONT
signal(SIGCONT, SIG_IGN); /* don't interrupt writes */
#endif
for (i = ystep; i > 0; i--) {
@@ -520,13 +464,15 @@ char *zfile, *oldfile;
pctdone = 100.0*(vres-1-ypos)/vres;
if (ralrm > 0 && time((time_t *)NULL) >= tlastrept+ralrm)
report();
-#ifndef BSD
+#ifdef SIGCONT
else
signal(SIGCONT, report);
#endif
}
/* clean up */
+#ifdef SIGCONT
signal(SIGCONT, SIG_IGN);
+#endif
if (zfd != -1 && write(zfd, (char *)zbar[0], hres*sizeof(float))
< hres*sizeof(float))
goto writerr;
@@ -547,7 +493,9 @@ alldone:
pctdone = 100.0;
if (ralrm > 0)
report();
+#ifdef SIGCONT
signal(SIGCONT, SIG_DFL);
+#endif
return;
writerr:
error(SYSTEM, "write error in render");
@@ -733,9 +681,7 @@ char *oldfile;
error(WARNING, errmsg);
goto gotzip;
}
-#ifdef MSDOS
- setmode(fileno(fp), O_BINARY);
-#endif
+ SET_FILE_BINARY(fp);
/* discard header */
getheader(fp, NULL, NULL);
/* get picture size */