| 7 |  | */ | 
| 8 |  |  | 
| 9 |  | #include "rcontrib.h" | 
| 10 | – | #include "source.h" | 
| 10 |  | #include "otypes.h" | 
| 11 | < | #include "platform.h" | 
| 11 | > | #include "source.h" | 
| 12 |  |  | 
| 13 |  | char    *shm_boundary = NULL;           /* boundary of shared memory */ | 
| 14 |  |  | 
| 136 |  | } | 
| 137 |  |  | 
| 138 |  |  | 
| 139 | < | /* add modifiers from a file list */ | 
| 139 | > | /* Add modifiers from a file list */ | 
| 140 |  | void | 
| 141 |  | addmodfile(char *fname, char *outf, char *binv, int bincnt) | 
| 142 |  | { | 
| 158 |  | ) | 
| 159 |  | { | 
| 160 |  | if (nchild > 0)         /* close children if any */ | 
| 161 | < | end_children(); | 
| 161 | > | end_children(code != 0); | 
| 162 |  | exit(code); | 
| 163 |  | } | 
| 164 |  |  | 
| 177 |  | /* set shared memory boundary */ | 
| 178 |  | shm_boundary = strcpy((char *)malloc(16), "SHM_BOUNDARY"); | 
| 179 |  | } | 
| 180 | + | for (i = 0; i < nsources; i++)  /* tracing to sources as well */ | 
| 181 | + | source[i].sflags |= SFOLLOW; | 
| 182 |  | if (yres > 0) {                 /* set up flushing & ray counts */ | 
| 183 |  | if (xres > 0) | 
| 184 |  | raysleft = (RNUMBER)xres*yres; | 
| 189 |  | if ((account = accumulate) > 1) | 
| 190 |  | raysleft *= accumulate; | 
| 191 |  | waitflush = (yres > 0) & (xres > 1) ? 0 : xres; | 
| 191 | – | /* tracing to sources as well */ | 
| 192 | – | for (i = 0; i < nsources; i++) | 
| 193 | – | source[i].sflags |= SFOLLOW; | 
| 192 |  |  | 
| 193 |  | if (nproc > 1 && in_rchild())   /* forked child? */ | 
| 194 |  | return;                 /* return to main processing loop */ | 
| 226 |  |  | 
| 227 |  | if (mp == NULL)                         /* not in our list? */ | 
| 228 |  | return; | 
| 229 | + | /* shadow ray not on source? */ | 
| 230 | + | if (r->rsrc >= 0 && source[r->rsrc].so != r->ro) | 
| 231 | + | return; | 
| 232 |  |  | 
| 233 | < | worldfunc(RCCONTEXT, r);                /* get bin number */ | 
| 233 | > | worldfunc(RCCONTEXT, r);                /* else get bin number */ | 
| 234 |  | bn = (int)(evalue(mp->binv) + .5); | 
| 235 |  | if ((bn < 0) | (bn >= mp->nbins)) { | 
| 236 |  | error(WARNING, "bad bin number (ignored)"); | 
| 237 |  | return; | 
| 238 |  | } | 
| 239 | < | raycontrib(contr, r, PRIMARY); | 
| 239 | > | raycontrib(contr, r, PRIMARY);          /* compute coefficient */ | 
| 240 |  | if (contrib) | 
| 241 | < | multcolor(contr, r->rcol); | 
| 241 | > | multcolor(contr, r->rcol);      /* -> contribution */ | 
| 242 |  | addcolor(mp->cbin[bn], contr); | 
| 243 |  | } | 
| 244 |  |  | 
| 257 |  | rayorigin(&thisray, PRIMARY, NULL, NULL); | 
| 258 |  | thisray.rot = 1e-5;             /* pretend we hit surface */ | 
| 259 |  | thisray.rod = 1.0; | 
| 260 | + | VCOPY(thisray.ron, dir); | 
| 261 |  | VSUM(thisray.rop, org, dir, 1e-4); | 
| 262 |  | samplendx++;                    /* compute result */ | 
| 263 |  | (*ofun[Lamb.otype].funp)(&Lamb, &thisray); | 
| 338 |  | if (raysleft && !--raysleft) | 
| 339 |  | break;          /* preemptive EOI */ | 
| 340 |  | } | 
| 341 | < | if ((accumulate <= 0) | (account < accumulate)) { | 
| 341 | > | if (nchild != -1 && (accumulate <= 0) | (account < accumulate)) { | 
| 342 |  | if (account < accumulate) { | 
| 343 |  | error(WARNING, "partial accumulation in final record"); | 
| 344 |  | accumulate -= account; |