| 21 | 
  | 
int     ndims = 0;                      /* number of sampling dimensions */ | 
| 22 | 
  | 
int     samplendx = 0;                  /* index for this sample */ | 
| 23 | 
  | 
 | 
| 24 | 
< | 
static void     trace_contrib(RAY *r);  /* our trace callback */ | 
| 25 | 
< | 
void    (*trace)() = trace_contrib; | 
| 24 | 
> | 
void    (*trace)() = NULL;              /* trace call (NULL before rcinit) */ | 
| 25 | 
  | 
 | 
| 26 | 
  | 
int     do_irrad = 0;                   /* compute irradiance? */ | 
| 27 | 
  | 
 | 
| 28 | 
  | 
int     rand_samp = 1;                  /* pure Monte Carlo sampling? */ | 
| 29 | 
  | 
 | 
| 30 | 
  | 
double  dstrsrc = 0.9;                  /* square source distribution */ | 
| 31 | 
< | 
double  shadthresh = .03;               /* shadow threshold */ | 
| 31 | 
> | 
double  shadthresh = 0.;                /* shadow threshold */ | 
| 32 | 
  | 
double  shadcert = .75;                 /* shadow certainty */ | 
| 33 | 
  | 
int     directrelay = 3;                /* number of source relays */ | 
| 34 | 
  | 
int     vspretest = 512;                /* virtual source pretest density */ | 
| 40 | 
  | 
double  seccg = 0.;                     /* global scattering eccentricity */ | 
| 41 | 
  | 
double  ssampdist = 0.;                 /* scatter sampling distance */ | 
| 42 | 
  | 
 | 
| 43 | 
< | 
double  specthresh = .15;               /* specular sampling threshold */ | 
| 43 | 
> | 
double  specthresh = .02;               /* specular sampling threshold */ | 
| 44 | 
  | 
double  specjitter = 1.;                /* specular sampling jitter */ | 
| 45 | 
  | 
 | 
| 46 | 
  | 
int     backvis = 1;                    /* back face visibility */ | 
| 51 | 
  | 
char    *ambfile = NULL;                /* ambient file name */ | 
| 52 | 
  | 
COLOR   ambval = BLKCOLOR;              /* ambient value */ | 
| 53 | 
  | 
int     ambvwt = 0;                     /* initial weight for ambient value */ | 
| 54 | 
< | 
double  ambacc = 0;                     /* ambient accuracy */ | 
| 54 | 
> | 
double  ambacc = 0.;                    /* ambient accuracy */ | 
| 55 | 
  | 
int     ambres = 256;                   /* ambient resolution */ | 
| 56 | 
  | 
int     ambdiv = 350;                   /* ambient divisions */ | 
| 57 | 
  | 
int     ambssamp = 0;                   /* ambient super-samples */ | 
| 66 | 
  | 
RNUMBER lastray = 0;                    /* last ray number sent */ | 
| 67 | 
  | 
RNUMBER lastdone = 0;                   /* last ray output */ | 
| 68 | 
  | 
 | 
| 69 | 
+ | 
static void     trace_contrib(RAY *r);  /* our trace callback */ | 
| 70 | 
+ | 
 | 
| 71 | 
  | 
static void mcfree(void *p) { epfree((*(MODCONT *)p).binv); free(p); } | 
| 72 | 
  | 
 | 
| 73 | 
  | 
LUTAB   modconttab = LU_SINIT(NULL,mcfree);     /* modifier lookup table */ | 
| 136 | 
  | 
        mp->modname = modn;             /* XXX assumes static string */ | 
| 137 | 
  | 
        mp->params = prms;              /* XXX assumes static string */ | 
| 138 | 
  | 
        mp->binv = ebinv; | 
| 139 | 
+ | 
        mp->bin0 = 0; | 
| 140 | 
  | 
        mp->nbins = bincnt; | 
| 141 | 
  | 
        memset(mp->cbin, 0, sizeof(DCOLOR)*bincnt); | 
| 142 | 
< | 
                                        /* allocate output streams */ | 
| 143 | 
< | 
        for (i = bincnt; i-- > 0; ) | 
| 144 | 
< | 
                getostream(mp->outspec, mp->modname, i, 1); | 
| 142 | 
> | 
                                        /* figure out starting bin */ | 
| 143 | 
> | 
        while (!getostream(mp->outspec, mp->modname, mp->bin0, 1)) | 
| 144 | 
> | 
                mp->bin0++; | 
| 145 | 
> | 
                                        /* allocate other output streams */ | 
| 146 | 
> | 
        for (i = 0; ++i < mp->nbins; ) | 
| 147 | 
> | 
                getostream(mp->outspec, mp->modname, mp->bin0+i, 1); | 
| 148 | 
  | 
        lep->data = (char *)mp; | 
| 149 | 
  | 
        return(mp); | 
| 150 | 
  | 
} | 
| 179 | 
  | 
{ | 
| 180 | 
  | 
        if (nchild > 0)         /* close children if any */ | 
| 181 | 
  | 
                end_children(code != 0); | 
| 182 | 
+ | 
        else if (nchild < 0) | 
| 183 | 
+ | 
                _exit(code);    /* avoid flush() in child */ | 
| 184 | 
  | 
        exit(code); | 
| 185 | 
  | 
} | 
| 186 | 
  | 
 | 
| 199 | 
  | 
                                        /* set shared memory boundary */ | 
| 200 | 
  | 
                shm_boundary = strcpy((char *)malloc(16), "SHM_BOUNDARY"); | 
| 201 | 
  | 
        } | 
| 202 | 
+ | 
        trace = trace_contrib;          /* set up trace call-back */ | 
| 203 | 
  | 
        for (i = 0; i < nsources; i++)  /* tracing to sources as well */ | 
| 204 | 
  | 
                source[i].sflags |= SFOLLOW; | 
| 205 | 
  | 
        if (yres > 0) {                 /* set up flushing & ray counts */ | 
| 283 | 
  | 
        thisray.rmax = 0.0; | 
| 284 | 
  | 
        rayorigin(&thisray, PRIMARY, NULL, NULL); | 
| 285 | 
  | 
                                        /* pretend we hit surface */ | 
| 286 | 
< | 
        thisray.rt = thisray.rot = 1e-5; | 
| 286 | 
> | 
        thisray.rxt = thisray.rot = 1e-5; | 
| 287 | 
  | 
        thisray.rod = 1.0; | 
| 288 | 
  | 
        VCOPY(thisray.ron, dir); | 
| 289 | 
  | 
        VSUM(thisray.rop, org, dir, 1e-4); |