home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / RADIANCE / SRC / RT / O_INSTAN.C < prev    next >
C/C++ Source or Header  |  1993-10-07  |  2KB  |  67 lines

  1. /* Copyright (c) 1990 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)o_instance.c 2.1 11/12/91 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  o_instance.c - routines for computing ray intersections with octrees.
  9.  *
  10.  *     11/11/88
  11.  */
  12.  
  13. #include  "ray.h"
  14.  
  15. #include  "instance.h"
  16.  
  17.  
  18. o_instance(o, r)        /* compute ray intersection with octree */
  19. OBJREC  *o;
  20. register RAY  *r;
  21. {
  22.     extern long  raynum;
  23.     RAY  rcont;
  24.     register INSTANCE  *in;
  25.     register int  i;
  26.                     /* get the octree */
  27.     in = getinstance(o, IO_ALL);
  28.                     /* duplicate and clear ray */
  29.     copystruct(&rcont, r);
  30.     rayclear(&rcont);
  31.                     /* transform ray to new space */
  32.     multp3(rcont.rorg, r->rorg, in->x.b.xfm);
  33.     multv3(rcont.rdir, r->rdir, in->x.b.xfm);
  34.     for (i = 0; i < 3; i++)
  35.         rcont.rdir[i] /= in->x.b.sca;
  36.                     /* trace it */
  37.     if (!localhit(&rcont, &in->obj->scube))
  38.         return(0);            /* missed */
  39.     if (rcont.rot * in->x.f.sca >= r->rot)
  40.         return(0);            /* not close enough */
  41.  
  42.     if (o->omod != OVOID) {        /* if we have modifier, use it */
  43.         r->ro = o;
  44.         r->rox = NULL;
  45.     } else {            /* else use theirs */
  46.         r->ro = rcont.ro;
  47.         if (rcont.rox != NULL) {
  48.             newrayxf(r);        /* allocate transformation */
  49.                     /* NOTE: r->rox may equal rcont.rox! */
  50.             multmat4(r->rox->f.xfm, rcont.rox->f.xfm, in->x.f.xfm);
  51.             r->rox->f.sca = rcont.rox->f.sca * in->x.f.sca;
  52.             multmat4(r->rox->b.xfm, in->x.b.xfm, rcont.rox->b.xfm);
  53.             r->rox->b.sca = in->x.b.sca * rcont.rox->b.sca;
  54.         } else
  55.             r->rox = &in->x;
  56.     }
  57.                     /* transform it back */
  58.     r->rot = rcont.rot * in->x.f.sca;
  59.     multp3(r->rop, rcont.rop, in->x.f.xfm);
  60.     multv3(r->ron, rcont.ron, in->x.f.xfm);
  61.     for (i = 0; i < 3; i++)
  62.         r->ron[i] /= in->x.f.sca;
  63.     r->rod = rcont.rod;
  64.                     /* return hit */
  65.     return(1);
  66. }
  67.