50 |
|
} |
51 |
|
|
52 |
|
|
53 |
< |
static void /* initialize occlusion cache */ |
53 |
> |
void /* initialize occlusion cache */ |
54 |
|
initobscache(int sn) |
55 |
|
{ |
56 |
|
register SRCREC *srcp = &source[sn]; |
60 |
|
int i, j, k; |
61 |
|
int ax, ax1, ax2; |
62 |
|
|
63 |
+ |
if (srcp->sflags & (SSKIP|SPROX|SSPOT|SVIRTUAL)) |
64 |
+ |
return; /* don't cache these */ |
65 |
|
if (srcp->sflags & SDISTANT) |
66 |
|
cachelen = 4*SHADCACHE*SHADCACHE; |
67 |
|
else if (srcp->sflags & SFLAT) |
69 |
|
else /* spherical distribution */ |
70 |
|
cachelen = SHADCACHE*SHADCACHE*6; |
71 |
|
/* allocate cache */ |
70 |
– |
DCHECK(srcp->obscache != NULL, |
71 |
– |
CONSISTENCY, "initobscache() called twice"); |
72 |
|
srcp->obscache = (OBSCACHE *)malloc(sizeof(OBSCACHE) + |
73 |
|
sizeof(OBJECT)*(cachelen-1)); |
74 |
|
if (srcp->obscache == NULL) |
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 |
|
|