--- ray/src/rt/raycalls.c 2004/03/30 16:13:01 2.9 +++ ray/src/rt/raycalls.c 2011/02/18 00:40:25 2.19 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: raycalls.c,v 2.9 2004/03/30 16:13:01 schorsch Exp $"; +static const char RCSid[] = "$Id: raycalls.c,v 2.19 2011/02/18 00:40:25 greg Exp $"; #endif /* * raycalls.c - interface for running Radiance rendering as a library @@ -23,10 +23,9 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.9 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 @@ -91,9 +90,11 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.9 200 */ #include +#include #include "ray.h" #include "source.h" +#include "bsdf.h" #include "ambient.h" #include "otypes.h" #include "random.h" @@ -119,6 +120,8 @@ 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 = .03; /* shadow threshold */ double shadcert = .75; /* shadow certainty */ @@ -152,7 +155,7 @@ char *amblist[AMBLLEN+1]; /* ambient include/exclude int ambincl = -1; /* include == 1, exclude == 0 */ -extern void +void ray_init( /* initialize ray-tracing calculation */ char *otnm ) @@ -163,7 +166,13 @@ ray_init( /* initialize ray-tracing calculation */ if (ofun[OBJ_SPHERE].funp == o_default) initotypes(); /* initialize urand */ - initurand(2048); + 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; @@ -174,18 +183,18 @@ ray_init( /* initialize ray-tracing calculation */ /* ready to go... */ } -extern void +void 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 */ } -extern void +void ray_done( /* free ray-tracing data */ int freall ) @@ -199,21 +208,22 @@ ray_done( /* free ray-tracing data */ octdone(); thescene.cutree = EMPTY; octname = NULL; + retainfonts = 0; if (freall) { - retainfonts = 0; freefont(NULL); freedata(NULL); + SDfreeCache(NULL); initurand(0); } if (nobjects > 0) { sprintf(errmsg, "%ld objects left after call to ray_done()", - nobjects); + (long)nobjects); error(WARNING, errmsg); } } -extern void +void ray_save( /* save current parameter settings */ RAYPARAMS *rp ) @@ -264,7 +274,7 @@ ray_save( /* save current parameter settings */ } -extern void +void ray_restore( /* restore parameter settings */ RAYPARAMS *rp ) @@ -332,7 +342,7 @@ ray_restore( /* restore parameter settings */ } -extern void +void ray_defaults( /* get default parameter values */ RAYPARAMS *rp ) @@ -363,7 +373,7 @@ ray_defaults( /* get default parameter values */ memset(rp->ambfile, '\0', sizeof(rp->ambfile)); rp->ambvwt = 0; rp->ambres = 256; - rp->ambacc = 0.1; + rp->ambacc = 0.15; rp->ambdiv = 1024; rp->ambssamp = 512; rp->ambounce = 0;