home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / atomart.tar.gz / atomart.tar / rt.c < prev    next >
C/C++ Source or Header  |  1990-06-17  |  952b  |  54 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "atomart.h"
  4. #include "macro.h"
  5. #include "gram.h"
  6.  
  7. extern object    *oblist;
  8. extern light    *lights;
  9. extern hlist    *fhlist;
  10. extern int    maxhitlevel;
  11.  
  12. extern pixel    backcol;
  13. extern colour    ambient;
  14.  
  15. extern double    power();
  16.  
  17. /*
  18.  * trace
  19.  *
  20.  *    returns a list of hits on the first object hit by r
  21.  */
  22. hlist *
  23. trace(r, oblist)
  24.     register ray    *r;
  25.     object        *oblist;
  26. {
  27.     register object    *o;
  28.     register hlist    *hit, *prevhits, *p, *np;
  29.  
  30.     prevhits = (hlist *)NULL;
  31.  
  32.     for (o = oblist; o != (object *)NULL; o = o->nxt)
  33.         if ((hit = o->intersects(r, o)) != (hlist *)NULL) {
  34.             if (prevhits == (hlist *)NULL) {
  35.                 prevhits = hit;
  36.             } else {
  37.                 if (prevhits->t > hit->t) {
  38.                     for (p = prevhits; p != (hlist *)NULL; p = np) {
  39.                         np = p->nxt;
  40.                         release(p)
  41.                     }
  42.                     prevhits = hit;
  43.                 } else {
  44.                     for (p = hit; p != (hlist *)NULL; p = np) {
  45.                         np = p->nxt;
  46.                         release(p)
  47.                     }
  48.                 }
  49.             }
  50.         }
  51.  
  52.     return(prevhits);
  53. }
  54.