--- ray/src/hd/rholo.c 1997/11/20 11:39:24 3.12 +++ ray/src/hd/rholo.c 1997/12/02 12:29:17 3.15 @@ -9,6 +9,7 @@ static char SCCSid[] = "$SunId$ SGI"; */ #include "rholo.h" +#include "random.h" #include "paths.h" #include #include @@ -25,8 +26,6 @@ char froot[MAXPATH]; /* root file name */ int nowarn = 0; /* turn warnings off? */ -double expval = 1.; /* global exposure value */ - int ncprocs = 0; /* desired number of compute processes */ char *outdev = NULL; /* output device name */ @@ -61,6 +60,7 @@ char *argv[]; int force = 0; /* mark start time */ starttime = time(NULL); + initurand(10240); /* initialize urand */ progname = argv[0]; /* get arguments */ for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { @@ -113,12 +113,17 @@ char *argv[]; creatholo(&hdg); } else { /* else load holodeck */ loadholo(); - if (vdef(RIF)) /* load RIF if any */ + /* check settings */ + checkvalues(); + /* load RIF if any */ + if (vdef(RIF)) getradfile(vval(RIF)); + /* set defaults */ + setdefaults(NULL); } /* initialize */ initrholo(); - /* run */ + /* main loop */ while (rholo()) ; /* done */ @@ -333,6 +338,31 @@ register HDGRID *gp; sprintf(errmsg, "ignoring all but first %s", vnam(SECTION)); error(WARNING, errmsg); } + if (!vdef(OCTREE)) { + if ((vval(OCTREE) = bmalloc(strlen(froot)+5)) == NULL) + error(SYSTEM, "out of memory"); + sprintf(vval(OCTREE), "%s.oct", froot); + vdef(OCTREE)++; + } + if (!vdef(OBSTRUCTIONS)) { + vval(OBSTRUCTIONS) = "T"; + vdef(OBSTRUCTIONS)++; + } + if (!vdef(VDIST)) { + vval(VDIST) = "F"; + vdef(VDIST)++; + } + if (!vdef(OCCUPANCY)) { + vval(OCCUPANCY) = "U"; + vdef(OCCUPANCY)++; + } + /* append rendering options */ + if (vdef(RENDER)) + rtargc += wordstring(rtargv+rtargc, vval(RENDER)); + + if (gp == NULL) /* already initialized? */ + return; + /* set grid parameters */ if (sscanf(vval(SECTION), "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", &gp->orig[0], &gp->orig[1], &gp->orig[2], @@ -353,29 +383,6 @@ register HDGRID *gp; badvalue(GRID); for (i = 0; i < 3; i++) gp->grid[i] = len[i]/d + (1.-FTINY); - if (!vdef(EXPOSURE)) { - sprintf(errmsg, "%s must be defined", vnam(EXPOSURE)); - error(USER, errmsg); - } - expval = vval(EXPOSURE)[0] == '-' || vval(EXPOSURE)[0] == '+' ? - pow(2., vflt(EXPOSURE)) : vflt(EXPOSURE); - if (!vdef(OCTREE)) { - if ((vval(OCTREE) = bmalloc(strlen(froot)+5)) == NULL) - error(SYSTEM, "out of memory"); - sprintf(vval(OCTREE), "%s.oct", froot); - vdef(OCTREE)++; - } - if (!vdef(OBSTRUCTIONS)) { - vval(OBSTRUCTIONS) = "T"; - vdef(OBSTRUCTIONS)++; - } - if (!vdef(OCCUPANCY)) { - vval(OCCUPANCY) = "U"; - vdef(OCCUPANCY)++; - } - /* append rendering options */ - if (vdef(RENDER)) - rtargc += wordstring(rtargv+rtargc, vval(RENDER)); } @@ -463,7 +470,7 @@ loadholo() /* start loading a holodeck from fname */ done_packets(pl) /* handle finished packets */ PACKET *pl; { - static int nunflushed = 0; + static int n2flush = 0; register PACKET *p; while (pl != NULL) { @@ -474,8 +481,8 @@ PACKET *pl; p->nr*sizeof(RAYVAL)); if (outdev != NULL) /* display it */ disp_packet((PACKHEAD *)p); - else - nunflushed += p->nr; + if (hdcachesize <= 0) /* manual flushing */ + n2flush += p->nr; nraysdone += p->nr; npacksdone++; } @@ -483,9 +490,9 @@ PACKET *pl; p->next = freepacks; freepacks = p; } - if (nunflushed >= 256*RPACKSIZ) { + if (n2flush > 512*RPACKSIZ*ncprocs) { hdflush(NULL); /* flush holodeck buffers */ - nunflushed = 0; + n2flush = 0; } } @@ -493,7 +500,7 @@ PACKET *pl; getradfile(rfargs) /* run rad and get needed variables */ char *rfargs; { - static short mvar[] = {OCTREE,EXPOSURE,-1}; + static short mvar[] = {OCTREE,-1}; static char tf1[] = TEMPLATE; char tf2[64]; char combuf[256];