--- ray/src/rt/raycalls.c 2003/08/26 04:24:26 2.6 +++ ray/src/rt/raycalls.c 2023/02/02 18:45:23 2.27 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: raycalls.c,v 2.6 2003/08/26 04:24:26 greg Exp $"; +static const char RCSid[] = "$Id: raycalls.c,v 2.27 2023/02/02 18:45:23 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.6 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,14 +90,17 @@ static const char RCSid[] = "$Id: raycalls.c,v 2.6 200 */ #include +#include #include "ray.h" #include "source.h" +#include "bsdf.h" #include "ambient.h" #include "otypes.h" #include "random.h" #include "data.h" #include "font.h" +#include "pmapray.h" char *progname = "unknown_app"; /* caller sets to argv[0] */ @@ -115,14 +117,17 @@ int samplendx = 0; /* index for this sample */ void (*trace)() = NULL; /* trace call */ -extern void ambnotify(); void (*addobjnotify[8])() = {ambnotify, NULL}; +int castonly = 0; /* only doing ray-casting? */ + int do_irrad = 0; /* compute irradiance? */ +int rand_samp = 1; /* 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? */ @@ -138,24 +143,38 @@ 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 = -10; /* maximum recursion depth */ +double minweight = 1e-4; /* 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 */ +static void +reset_random(void) /* re-initialize random number generator */ +{ + if (rand_samp) { + srandom((long)time(0)); + initurand(0); + } else { + srandom(0L); + initurand(2048); + } +} + + 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); @@ -163,30 +182,39 @@ char *otnm; if (ofun[OBJ_SPHERE].funp == o_default) initotypes(); /* initialize urand */ - initurand(2048); - /* read scene octree */ - readoct(octname = otnm, ~(IO_FILES|IO_INFO), &thescene, NULL); + reset_random(); + + octname = savqstr(otnm); /* read scene octree */ + readoct(octname, ~(IO_FILES|IO_INFO), &thescene, NULL); nsceneobjs = nobjects; - /* find and mark sources */ - marksources(); - /* initialize ambient calculation */ - setambient(); - /* ready to go... */ + + if (!castonly) { /* any actual ray traversal to do? */ + + ray_init_pmap(); /* PMAP: set up & load photon maps */ + + marksources(); /* find and mark sources */ + + setambient(); /* initialize ambient calculation */ + } else + distantsources(); /* else mark only distant sources */ } + void -ray_trace(r) /* trace a primary ray */ -RAY *r; +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(); @@ -197,29 +225,34 @@ int freall; 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, "%d objects left after call to ray_done()", - nobjects); + sprintf(errmsg, "%ld objects left after call to ray_done()", + (long)nobjects); error(WARNING, errmsg); } + + ray_done_pmap(); } void -ray_save(rp) /* save current parameter settings */ -RAYPARAMS *rp; +ray_save( /* save current parameter settings */ + RAYPARAMS *rp +) { int i, ndx; if (rp == NULL) return; rp->do_irrad = do_irrad; + rp->rand_samp = rand_samp; rp->dstrsrc = dstrsrc; rp->shadthresh = shadthresh; rp->shadcert = shadcert; @@ -236,10 +269,11 @@ RAYPARAMS *rp; rp->backvis = backvis; rp->maxdepth = maxdepth; rp->minweight = minweight; - copycolor(rp->ambval, ambval); - memset(rp->ambfile, '\0', sizeof(rp->ambfile)); if (ambfile != NULL) strncpy(rp->ambfile, ambfile, sizeof(rp->ambfile)-1); + else + memset(rp->ambfile, '\0', sizeof(rp->ambfile)); + copycolor(rp->ambval, ambval); rp->ambvwt = ambvwt; rp->ambacc = ambacc; rp->ambres = ambres; @@ -254,18 +288,23 @@ RAYPARAMS *rp; if (ndx+len >= sizeof(rp->amblval)) break; strcpy(rp->amblval+ndx, amblist[i]); + rp->amblndx[i] = ndx; ndx += len+1; } while (i <= AMBLLEN) rp->amblndx[i++] = -1; + + /* PMAP: save photon mapping params */ + ray_save_pmap(rp); } void -ray_restore(rp) /* restore parameter settings */ -RAYPARAMS *rp; +ray_restore( /* restore parameter settings */ + RAYPARAMS *rp +) { - register int i; + int i; if (rp == NULL) { /* restore defaults */ RAYPARAMS dflt; @@ -275,6 +314,10 @@ RAYPARAMS *rp; } /* restore saved settings */ do_irrad = rp->do_irrad; + if (!rand_samp != !rp->rand_samp) { + rand_samp = rp->rand_samp; + reset_random(); + } dstrsrc = rp->dstrsrc; shadthresh = rp->shadthresh; shadcert = rp->shadcert; @@ -296,6 +339,7 @@ RAYPARAMS *rp; ambdiv = rp->ambdiv; ambssamp = rp->ambssamp; ambounce = rp->ambounce; + /* a bit dangerous if not static */ for (i = 0; rp->amblndx[i] >= 0; i++) amblist[i] = rp->amblval + rp->amblndx[i]; while (i <= AMBLLEN) @@ -325,12 +369,16 @@ RAYPARAMS *rp; ambres = rp->ambres; ambacc = rp->ambacc; } + + /* PMAP: restore photon mapping params */ + ray_restore_pmap(rp); } void -ray_defaults(rp) /* get default parameter values */ -RAYPARAMS *rp; +ray_defaults( /* get default parameter values */ + RAYPARAMS *rp +) { int i; @@ -338,9 +386,10 @@ RAYPARAMS *rp; return; rp->do_irrad = 0; + rp->rand_samp = 1; rp->dstrsrc = 0.0; - rp->shadthresh = .05; - rp->shadcert = .5; + rp->shadthresh = 0.03; + rp->shadcert = 0.75; rp->directrelay = 2; rp->vspretest = 512; rp->directvis = 1; @@ -349,21 +398,24 @@ RAYPARAMS *rp; setcolor(rp->salbedo, 0., 0., 0.); rp->seccg = 0.; rp->ssampdist = 0.; - rp->specthresh = .15; + rp->specthresh = 0.15; rp->specjitter = 1.; rp->backvis = 1; - rp->maxdepth = 6; - rp->minweight = 4e-3; - setcolor(rp->ambval, 0., 0., 0.); + rp->maxdepth = -10; + rp->minweight = 1e-4; memset(rp->ambfile, '\0', sizeof(rp->ambfile)); + setcolor(rp->ambval, 0., 0., 0.); rp->ambvwt = 0; - rp->ambres = 128; - rp->ambacc = 0.2; - rp->ambdiv = 512; - rp->ambssamp = 0; + rp->ambres = 256; + rp->ambacc = 0.1; + rp->ambdiv = 1024; + rp->ambssamp = 512; rp->ambounce = 0; rp->ambincl = -1; memset(rp->amblval, '\0', sizeof(rp->amblval)); for (i = AMBLLEN+1; i--; ) rp->amblndx[i] = -1; + + /* PMAP: restore photon mapping defaults */ + ray_defaults_pmap(rp); }