--- ray/src/rt/raycalls.c 2003/02/22 02:07:29 2.1
+++ ray/src/rt/raycalls.c 2009/12/12 05:20:10 2.17
@@ -1,5 +1,5 @@
#ifndef lint
-static const char RCSid[] = "$Id: raycalls.c,v 2.1 2003/02/22 02:07:29 greg Exp $";
+static const char RCSid[] = "$Id: raycalls.c,v 2.17 2009/12/12 05:20:10 greg Exp $";
#endif
/*
* raycalls.c - interface for running Radiance rendering as a library
@@ -7,62 +7,7 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.1 200
* External symbols declared in ray.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 "copyright.h"
/*
* These routines are designed to aid the programmer who wishes
@@ -78,10 +23,9 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.1 200
* sort of context, so it is impossible to simultaneously run
* this library on multiple scenes or in multiple threads.
* You get one scene and one thread, and if you want more, you
- * will have to go with the process model used by the programs
- * gen/mkillum, hd/rholo, and px/pinterp. Finally, unrecoverable
- * errors result in a call to the application-defined function
- * quit(). The usual thing to do is to call exit().
+ * will have to go with the process model defined in raypcalls.c.
+ * Finally, unrecoverable errors result in a call to the application-
+ * defined function quit(). The usual thing to do is to call exit().
* You might want to do something else instead, like
* call setjmp()/longjmp() to bring you back to the calling
* function for recovery. You may also wish to define your own
@@ -133,7 +77,7 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.1 200
* restarted at any point by calling ray_init() on a new
* octree.
*
- * The call ray_save(rp) allocates and returns a buffer
+ * The call ray_save(rp) fills a parameter structure
* with the current global parameter settings, which may be
* restored at any time with a call to ray_restore(rp).
* This buffer contains no linked information, and thus
@@ -145,18 +89,15 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.1 200
* same as the defaults for rtrace.)
*/
-#include "ray.h"
+#include
+#include
+#include "ray.h"
#include "source.h"
-
#include "ambient.h"
-
#include "otypes.h"
-
#include "random.h"
-
#include "data.h"
-
#include "font.h"
char *progname = "unknown_app"; /* caller sets to argv[0] */
@@ -174,14 +115,15 @@ int samplendx = 0; /* index for this sample */
void (*trace)() = NULL; /* trace call */
-extern void ambnotify();
-void (*addobjnotify[])() = {ambnotify, NULL};
+void (*addobjnotify[8])() = {ambnotify, NULL};
int do_irrad = 0; /* compute irradiance? */
+int rand_samp = 0; /* pure Monte Carlo sampling? */
+
double dstrsrc = 0.0; /* square source distribution */
-double shadthresh = .05; /* shadow threshold */
-double shadcert = .5; /* shadow certainty */
+double shadthresh = .03; /* shadow threshold */
+double shadcert = .75; /* shadow certainty */
int directrelay = 2; /* number of source relays */
int vspretest = 512; /* virtual source pretest density */
int directvis = 1; /* sources visible? */
@@ -197,24 +139,25 @@ double specjitter = 1.; /* specular sampling jitter *
int backvis = 1; /* back face visibility */
-int maxdepth = 6; /* maximum recursion depth */
-double minweight = 4e-3; /* minimum ray weight */
+int maxdepth = 8; /* maximum recursion depth */
+double minweight = 2e-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 = 128; /* ambient resolution */
-int ambdiv = 512; /* ambient divisions */
-int ambssamp = 0; /* ambient super-samples */
+double ambacc = 0.1; /* ambient accuracy */
+int ambres = 256; /* ambient resolution */
+int ambdiv = 1024; /* ambient divisions */
+int ambssamp = 512; /* ambient super-samples */
int ambounce = 0; /* ambient bounces */
char *amblist[AMBLLEN+1]; /* ambient include/exclude list */
int ambincl = -1; /* include == 1, exclude == 0 */
void
-ray_init(otnm) /* initialize ray-tracing calculation */
-char *otnm;
+ray_init( /* initialize ray-tracing calculation */
+ char *otnm
+)
{
if (nobjects > 0) /* free old scene data */
ray_done(0);
@@ -222,8 +165,13 @@ char *otnm;
if (ofun[OBJ_SPHERE].funp == o_default)
initotypes();
/* initialize urand */
- if (urperm == NULL)
+ if (rand_samp) {
+ srandom((long)time(0));
+ initurand(0);
+ } else {
+ srandom(0L);
initurand(2048);
+ }
/* read scene octree */
readoct(octname = otnm, ~(IO_FILES|IO_INFO), &thescene, NULL);
nsceneobjs = nobjects;
@@ -234,19 +182,21 @@ char *otnm;
/* ready to go... */
}
-
void
-ray_trace(RAY *r) /* trace a primary ray */
+ray_trace( /* trace a primary ray */
+ RAY *r
+)
{
- rayorigin(r, NULL, PRIMARY, 1.0);
+ rayorigin(r, PRIMARY, NULL, NULL);
samplendx++;
rayvalue(r); /* assumes origin and direction are set */
}
void
-ray_done(freall) /* free ray-tracing data */
-int freall;
+ray_done( /* free ray-tracing data */
+ int freall
+)
{
retainfonts = 1;
ambdone();
@@ -264,7 +214,7 @@ int freall;
initurand(0);
}
if (nobjects > 0) {
- sprintf(errmsg, "%d objects left after call to ray_done()",
+ sprintf(errmsg, "%ld objects left after call to ray_done()",
nobjects);
error(WARNING, errmsg);
}
@@ -272,8 +222,9 @@ int freall;
void
-ray_save(rp) /* save current parameter settings */
-RAYPARAMS *rp;
+ray_save( /* save current parameter settings */
+ RAYPARAMS *rp
+)
{
int i, ndx;
@@ -297,7 +248,7 @@ RAYPARAMS *rp;
rp->maxdepth = maxdepth;
rp->minweight = minweight;
copycolor(rp->ambval, ambval);
- bzero(rp->ambfile, sizeof(rp->ambfile));
+ memset(rp->ambfile, '\0', sizeof(rp->ambfile));
if (ambfile != NULL)
strncpy(rp->ambfile, ambfile, sizeof(rp->ambfile)-1);
rp->ambvwt = ambvwt;
@@ -307,7 +258,7 @@ RAYPARAMS *rp;
rp->ambssamp = ambssamp;
rp->ambounce = ambounce;
rp->ambincl = ambincl;
- bzero(rp->amblval, sizeof(rp->amblval));
+ memset(rp->amblval, '\0', sizeof(rp->amblval));
ndx = 0;
for (i = 0; i < AMBLLEN && amblist[i] != NULL; i++) {
int len = strlen(amblist[i]);
@@ -322,8 +273,9 @@ RAYPARAMS *rp;
void
-ray_restore(rp) /* restore parameter settings */
-RAYPARAMS *rp;
+ray_restore( /* restore parameter settings */
+ RAYPARAMS *rp
+)
{
register int i;
@@ -389,8 +341,9 @@ RAYPARAMS *rp;
void
-ray_defaults(rp) /* get default parameter values */
-RAYPARAMS *rp;
+ray_defaults( /* get default parameter values */
+ RAYPARAMS *rp
+)
{
int i;
@@ -399,8 +352,8 @@ RAYPARAMS *rp;
rp->do_irrad = 0;
rp->dstrsrc = 0.0;
- rp->shadthresh = .05;
- rp->shadcert = .5;
+ rp->shadthresh = .03;
+ rp->shadcert = .75;
rp->directrelay = 2;
rp->vspretest = 512;
rp->directvis = 1;
@@ -412,18 +365,18 @@ RAYPARAMS *rp;
rp->specthresh = .15;
rp->specjitter = 1.;
rp->backvis = 1;
- rp->maxdepth = 6;
- rp->minweight = 4e-3;
+ rp->maxdepth = 8;
+ rp->minweight = 2e-3;
setcolor(rp->ambval, 0., 0., 0.);
- bzero(rp->ambfile, sizeof(rp->ambfile));
+ memset(rp->ambfile, '\0', sizeof(rp->ambfile));
rp->ambvwt = 0;
- rp->ambres = 128;
- rp->ambacc = 0.2;
- rp->ambdiv = 512;
- rp->ambssamp = 0;
+ rp->ambres = 256;
+ rp->ambacc = 0.15;
+ rp->ambdiv = 1024;
+ rp->ambssamp = 512;
rp->ambounce = 0;
rp->ambincl = -1;
- bzero(rp->amblval, sizeof(rp->amblval));
+ memset(rp->amblval, '\0', sizeof(rp->amblval));
for (i = AMBLLEN+1; i--; )
rp->amblndx[i] = -1;
}