| 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 */ | 
| 172 | 
  | 
} | 
| 173 | 
  | 
 | 
| 174 | 
  | 
 | 
| 175 | 
+ | 
/* Check if we have any more rays left (and report progress) */ | 
| 176 | 
+ | 
int | 
| 177 | 
+ | 
morays(void) | 
| 178 | 
+ | 
{ | 
| 179 | 
+ | 
        static RNUMBER  total_rays; | 
| 180 | 
+ | 
        static time_t   tstart, last_report; | 
| 181 | 
+ | 
        time_t          tnow; | 
| 182 | 
+ | 
 | 
| 183 | 
+ | 
        if (!raysleft) | 
| 184 | 
+ | 
                return(1);      /* unknown total, so nothing to do or say */ | 
| 185 | 
+ | 
 | 
| 186 | 
+ | 
        if (report_intvl > 0 && (tnow = time(0)) >= last_report+report_intvl) { | 
| 187 | 
+ | 
                if (!total_rays) { | 
| 188 | 
+ | 
                        total_rays = raysleft; | 
| 189 | 
+ | 
                        tstart = tnow; | 
| 190 | 
+ | 
                } else { | 
| 191 | 
+ | 
                        sprintf(errmsg, "%.2f%% done after %.3f hours\n", | 
| 192 | 
+ | 
                                        100.-100.*raysleft/total_rays, | 
| 193 | 
+ | 
                                        (1./3600.)*(tnow - tstart)); | 
| 194 | 
+ | 
                        eputs(errmsg); | 
| 195 | 
+ | 
                } | 
| 196 | 
+ | 
                last_report = tnow; | 
| 197 | 
+ | 
        } | 
| 198 | 
+ | 
        return(--raysleft); | 
| 199 | 
+ | 
} | 
| 200 | 
+ | 
 | 
| 201 | 
+ | 
 | 
| 202 | 
+ | 
/* Quit program */ | 
| 203 | 
  | 
void | 
| 204 | 
< | 
quit(                   /* quit program */ | 
| 204 | 
> | 
quit( | 
| 205 | 
  | 
        int  code | 
| 206 | 
  | 
) | 
| 207 | 
  | 
{ | 
| 208 | 
  | 
        if (nchild > 0)         /* close children if any */ | 
| 209 | 
  | 
                end_children(code != 0); | 
| 210 | 
+ | 
        else if (nchild < 0) | 
| 211 | 
+ | 
                _exit(code);    /* avoid flush() in child */ | 
| 212 | 
  | 
        exit(code); | 
| 213 | 
  | 
} | 
| 214 | 
  | 
 | 
| 227 | 
  | 
                                        /* set shared memory boundary */ | 
| 228 | 
  | 
                shm_boundary = strcpy((char *)malloc(16), "SHM_BOUNDARY"); | 
| 229 | 
  | 
        } | 
| 230 | 
+ | 
        trace = trace_contrib;          /* set up trace call-back */ | 
| 231 | 
  | 
        for (i = 0; i < nsources; i++)  /* tracing to sources as well */ | 
| 232 | 
  | 
                source[i].sflags |= SFOLLOW; | 
| 233 | 
  | 
        if (yres > 0) {                 /* set up flushing & ray counts */ | 
| 311 | 
  | 
        thisray.rmax = 0.0; | 
| 312 | 
  | 
        rayorigin(&thisray, PRIMARY, NULL, NULL); | 
| 313 | 
  | 
                                        /* pretend we hit surface */ | 
| 314 | 
< | 
        thisray.rt = thisray.rot = 1e-5; | 
| 314 | 
> | 
        thisray.rxt = thisray.rot = 1e-5; | 
| 315 | 
  | 
        thisray.rod = 1.0; | 
| 316 | 
  | 
        VCOPY(thisray.ron, dir); | 
| 317 | 
  | 
        VSUM(thisray.rop, org, dir, 1e-4); | 
| 392 | 
  | 
                } | 
| 393 | 
  | 
                done_contrib();         /* accumulate/output */ | 
| 394 | 
  | 
                ++lastdone; | 
| 395 | 
< | 
                if (raysleft && !--raysleft) | 
| 395 | 
> | 
                if (!morays()) | 
| 396 | 
  | 
                        break;          /* preemptive EOI */ | 
| 397 | 
  | 
        } | 
| 398 | 
  | 
        if (nchild != -1 && (accumulate <= 0) | (account < accumulate)) { |