home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsii / voxelcache.c < prev    next >
Text File  |  1992-09-17  |  3KB  |  97 lines

  1. /*
  2. /* When Spawning a Refraction Ray:
  3. /* Mask = 0x01 << Spawning_ray_level;
  4. /* path = path | Mask;               /* Turn on correct bit. */
  5. /* trace( / refraction ray / );
  6. /* path = path & ~Mask;
  7. /* 
  8. /* When Spawning Reflection Ray:
  9. /* Mask = 0x01 << Spawning_ray_level;
  10. /* path = path & ~Mask;              /* Turn off correct bit. */
  11. /* trace( / reflection ray / );
  12. /**/
  13.  
  14. typedef struct _stree {
  15.     TRIANGLE_REC   *last_object;
  16.     TRIANGLE_REC  **last_voxel;
  17.     struct _stree  *refraction_ray;
  18.     struct _stree  *reflection_ray;
  19. } SHADOW_TREE;
  20.  
  21. float check_shadowing(ray, light, path, Spawning_ray_level)
  22. RAY_REC   *ray;   /* ray from shading point to light source */
  23. LIGHT_REC *light; /* the light source we are interested in */
  24. int        path;  /* bit table describing current position in vision ray tree */
  25. int        Spawning_ray_level; /* level of the ray spawning this shadow ray */
  26. {
  27.     unsigned int  Mask;
  28.     SHADOW_TREE  *cache;
  29.     int i, hit ;
  30.     float shadow_percent;
  31.     /* user needs to define cache, object, voxel structures */
  32.  
  33.     cache = light->cache_tree;
  34.     Mask = 0x01;
  35.     /* If the spawning ray's level is 0 (primary ray), then we */
  36.     /* use the head of the cache_tree. */
  37.     for (i = 0; i < Spawning_ray_level; ++i) {
  38.         if (Mask & path) cache = cache->refraction_ray;
  39.         else             cache = cache->reflection_ray;
  40.         Mask = Mask << 1; /* Shift mask left 1 bit */
  41.     }
  42.  
  43.     if (cache->last_object != NULL) {
  44.         /* intersect_object() marks object as having been */
  45.         /* intersected by this ray. */
  46.         hit = intersect_object( ray, cache->last_object, &object);
  47.  
  48.         if (hit) {
  49.             return(1.0); /* full shadowing */
  50.         }
  51.         cache->last_object = NULL; /* object was not hit */
  52.  
  53.         if (cache->last_voxel != NULL) { /* implied !hit */
  54.  
  55.             /* intersect_object_in_voxel_for_shadows() returns hit = TRUE */
  56.             /* on first affirmed intersection with an opaque object. */
  57.             /* It ignores transparent objects altogether. */
  58.             hit = intersect_objects_in_voxel_for_shadows( ray,
  59.                                          cache->last_voxel, &object);
  60.             if (hit) {
  61.                 cache->last_object = object;
  62.                 return(1.0);
  63.             }
  64.             cache->last_voxel = NULL; /* voxel did not supply a hit */
  65.         }
  66.     }
  67.  
  68.     /* traverse_voxels_for_shadows() DOES intersect transparent objects and */
  69.     /* sorts the intersections for proper attenuation of the light          */
  70.     /* intensity. If multiple objects are hit, then one of the              */
  71.     /* intersections must be transparent, and the object returned is the    */
  72.     /* transparent one. Tracing of the shadow ray halts once the light      */
  73.     /* source has been reached. */
  74.     hit = traverse_voxels_for_shadows(ray, &object, &voxel, &shadow_percent);
  75.  
  76.     if (!hit) {
  77.         cache->last_object = NULL;
  78.         cache->last_voxel  = NULL;
  79.         return(0.0); /* No shadowing was found. */
  80.     }
  81.     if (object->transparency_value > 0.0) {
  82.         /* the object is transparent */
  83.         cache->last_object = NULL;
  84.         cache->last_voxel  = NULL;
  85.     }
  86.     else {
  87.         /* The object was NOT transparent, cache the info. */
  88.         cache->last_object = object;
  89.         cache->last_voxel  = voxel;
  90.     }
  91.     return ( shadow_percent );
  92. }
  93.  
  94. /*
  95. - Andrew Pearce, Alias, someplace in Toronto - pearce@alias.com
  96. */
  97.