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 |
|
|
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 */ |
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); |