| 27 |
|
VCOPY(rt.rorg, rorg); |
| 28 |
|
VCOPY(rt.rdir, rdir); |
| 29 |
|
rt.rmax = 0; |
| 30 |
< |
rayorigin(&rt, NULL, PRIMARY, 1.0); |
| 30 |
> |
rayorigin(&rt, PRIMARY, NULL, NULL); |
| 31 |
|
/* check for intersection */ |
| 32 |
|
while (localhit(&rt, &thescene)) { |
| 33 |
|
RAY rt1 = rt; /* pretend we were aimed at source */ |
| 290 |
|
if (r->robj == OVOID || objptr(r->robj) != r->ro || |
| 291 |
|
isvolume(r->ro->otype)) |
| 292 |
|
return(0); /* don't record complex blockers */ |
| 293 |
+ |
if (r->rsrc < 0 || source[r->rsrc].so == r->ro) |
| 294 |
+ |
return(0); /* just a mistake, that's all */ |
| 295 |
|
m = findmaterial(r->ro); |
| 296 |
|
if (m == NULL) |
| 297 |
|
return(0); /* no material?! */ |
| 310 |
|
|
| 311 |
|
if (obs == OVOID) |
| 312 |
|
return(0); |
| 313 |
< |
op = objptr(obs); /* check for intersection */ |
| 314 |
< |
return((*ofun[op->otype].funp)(op, r)); |
| 313 |
> |
op = objptr(obs); /* check blocker intersection */ |
| 314 |
> |
if (!(*ofun[op->otype].funp)(op, r)) |
| 315 |
> |
return(0); |
| 316 |
> |
if (source[r->rsrc].sflags & SDISTANT) |
| 317 |
> |
return(1); |
| 318 |
> |
op = source[r->rsrc].so; /* check source intersection */ |
| 319 |
> |
if (!(*ofun[op->otype].funp)(op, r)) |
| 320 |
> |
return(1); |
| 321 |
> |
rayclear(r); |
| 322 |
> |
return(0); /* source in front */ |
| 323 |
|
} |
| 324 |
|
|
| 325 |
|
|