| 18 |  |  | 
| 19 |  | #include  "otspecial.h" | 
| 20 |  |  | 
| 21 | + | #define  MAXCSET        ((MAXSET+1)*2-1)        /* maximum check set size */ | 
| 22 | + |  | 
| 23 |  | extern CUBE  thescene;                  /* our scene */ | 
| 24 |  | extern int  maxdepth;                   /* maximum recursion depth */ | 
| 25 |  | extern double  minweight;               /* minimum ray weight */ | 
| 75 |  | register RAY  *r; | 
| 76 |  | { | 
| 77 |  | r->rno = raynum++; | 
| 76 | – | r->cxs[0] = 0; | 
| 78 |  | r->newcset = r->clipset; | 
| 79 |  | r->ro = NULL; | 
| 80 |  | r->rot = FHUGE; | 
| 318 |  | register RAY  *r; | 
| 319 |  | register CUBE  *scene; | 
| 320 |  | { | 
| 321 | + | OBJECT  cxset[MAXCSET+1];       /* set of checked objects */ | 
| 322 |  | FVECT  curpos;                  /* current cube position */ | 
| 323 |  | int  sflags;                    /* sign flags */ | 
| 324 |  | double  t, dt; | 
| 359 |  | if (!incube(scene, curpos))     /* non-intersecting ray */ | 
| 360 |  | return(0); | 
| 361 |  | } | 
| 362 | < | return(raymove(curpos, sflags, r, scene) == RAYHIT); | 
| 362 | > | cxset[0] = 0; | 
| 363 | > | return(raymove(curpos, cxset, sflags, r, scene) == RAYHIT); | 
| 364 |  | } | 
| 365 |  |  | 
| 366 |  |  | 
| 367 |  | static int | 
| 368 | < | raymove(pos, dirf, r, cu)               /* check for hit as we move */ | 
| 369 | < | FVECT  pos;                     /* modified */ | 
| 368 | > | raymove(pos, cxs, dirf, r, cu)          /* check for hit as we move */ | 
| 369 | > | FVECT  pos;                     /* current position, modified herein */ | 
| 370 | > | OBJECT  *cxs;                   /* checked objects, modified by checkhit */ | 
| 371 |  | int  dirf;                      /* direction indicators to speed tests */ | 
| 372 |  | register RAY  *r; | 
| 373 |  | register CUBE  *cu; | 
| 396 |  | } | 
| 397 |  | for ( ; ; ) { | 
| 398 |  | cukid.cutree = octkid(cu->cutree, br); | 
| 399 | < | if ((ax = raymove(pos,dirf,r,&cukid)) == RAYHIT) | 
| 399 | > | if ((ax = raymove(pos,cxs,dirf,r,&cukid)) == RAYHIT) | 
| 400 |  | return(RAYHIT); | 
| 401 |  | sgn = 1 << ax; | 
| 402 |  | if (sgn & dirf)                 /* positive axis? */ | 
| 415 |  | } | 
| 416 |  | /*NOTREACHED*/ | 
| 417 |  | } | 
| 418 | < | if (isfull(cu->cutree) && checkhit(r, cu)) | 
| 418 | > | if (isfull(cu->cutree) && checkhit(r, cu, cxs)) | 
| 419 |  | return(RAYHIT); | 
| 420 |  | /* advance to next cube */ | 
| 421 |  | if (dirf&0x11) { | 
| 448 |  |  | 
| 449 |  |  | 
| 450 |  | static | 
| 451 | < | checkhit(r, cu)                 /* check for hit in full cube */ | 
| 451 | > | checkhit(r, cu, cxs)            /* check for hit in full cube */ | 
| 452 |  | register RAY  *r; | 
| 453 |  | CUBE  *cu; | 
| 454 | + | OBJECT  *cxs; | 
| 455 |  | { | 
| 456 |  | OBJECT  oset[MAXSET+1]; | 
| 457 |  | register OBJREC  *o; | 
| 458 |  | register int  i; | 
| 459 |  |  | 
| 460 |  | objset(oset, cu->cutree); | 
| 461 | < | checkset(oset, r->cxs);                 /* eliminate double-checking */ | 
| 461 | > | checkset(oset, cxs);                    /* eliminate double-checking */ | 
| 462 |  | for (i = oset[0]; i > 0; i--) { | 
| 463 |  | o = objptr(oset[i]); | 
| 464 |  | (*ofun[o->otype].funp)(o, r); | 
| 472 |  |  | 
| 473 |  | static | 
| 474 |  | checkset(os, cs)                /* modify checked set and set to check */ | 
| 475 | < | register OBJECT  os[MAXSET+1];          /* os' = os - cs */ | 
| 476 | < | register OBJECT  cs[MAXCSET+1];         /* cs' = cs + os */ | 
| 475 | > | register OBJECT  *os;                   /* os' = os - cs */ | 
| 476 | > | register OBJECT  *cs;                   /* cs' = cs + os */ | 
| 477 |  | { | 
| 478 |  | OBJECT  cset[MAXCSET+MAXSET+1]; | 
| 479 | < | register int  i, j, k; | 
| 479 | > | register int  i, j; | 
| 480 | > | int  k; | 
| 481 |  | /* copy os in place, cset <- cs */ | 
| 482 |  | cset[0] = 0; | 
| 483 |  | k = 0; | 
| 489 |  | cset[++cset[0]] = os[i]; | 
| 490 |  | } | 
| 491 |  | } | 
| 492 | + | if (!(os[0] = k))               /* new "to check" set size */ | 
| 493 | + | return;                 /* special case */ | 
| 494 |  | while (j <= cs[0])              /* get the rest of cs */ | 
| 495 |  | cset[++cset[0]] = cs[j++]; | 
| 496 | < | if (cset[0] > MAXCSET)          /* truncate if necessary */ | 
| 496 | > | if (cset[0] > MAXCSET)          /* truncate "checked" set if nec. */ | 
| 497 |  | cset[0] = MAXCSET; | 
| 498 | < | setcopy(cs, cset);              /* copy new "checked" set back */ | 
| 499 | < | os[0] = k;                      /* new "to check" set size */ | 
| 498 | > | /* setcopy(cs, cset); */        /* copy cset back to cs */ | 
| 499 | > | os = cset; | 
| 500 | > | for (i = os[0]; i-- >= 0; ) | 
| 501 | > | *cs++ = *os++; | 
| 502 |  | } |