home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 December / PCWKCD1296.iso / sharewar / quake106 / utils / vis / soundpvs.c < prev    next >
C/C++ Source or Header  |  1996-09-12  |  3KB  |  147 lines

  1.  
  2. #include "vis.h"
  3.  
  4. /*
  5.  
  6. Some textures (sky, water, slime, lava) are considered ambien sound emiters.
  7. Find an aproximate distance to the nearest emiter of each class for each leaf.
  8.  
  9. */
  10.  
  11.  
  12. /*
  13. ====================
  14. SurfaceBBox
  15.  
  16. ====================
  17. */
  18. void SurfaceBBox (dface_t *s, vec3_t mins, vec3_t maxs)
  19. {
  20.     int        i, j;
  21.     int        e;
  22.     int        vi;
  23.     float    *v;
  24.  
  25.     mins[0] = mins[1] = 999999;
  26.     maxs[0] = maxs[1] = -99999;
  27.  
  28.     for (i=0 ; i<s->numedges ; i++)
  29.     {
  30.         e = dsurfedges[s->firstedge+i];
  31.         if (e >= 0)
  32.             vi = dedges[e].v[0];
  33.         else
  34.             vi = dedges[-e].v[1];
  35.         v = dvertexes[vi].point;
  36.         
  37.         for (j=0 ; j<3 ; j++)
  38.         {        
  39.             if (v[j] < mins[j])
  40.                 mins[j] = v[j];
  41.             if (v[j] > maxs[j])
  42.                 maxs[j] = v[j];
  43.         }
  44.     }
  45. }
  46.  
  47.  
  48. /*
  49. ====================
  50. CalcAmbientSounds
  51.  
  52. ====================
  53. */
  54. void CalcAmbientSounds (void)
  55. {
  56.     int        i, j, k, l;
  57.     dleaf_t    *leaf, *hit;
  58.     byte    *vis;
  59.     dface_t    *surf;
  60.     vec3_t    mins, maxs;
  61.     float    d, maxd;
  62.     int        ambient_type;
  63.     texinfo_t    *info;
  64.     miptex_t    *miptex;
  65.     int        ofs;
  66.     float    dists[NUM_AMBIENTS];
  67.     float    vol;
  68.     
  69.     for (i=0 ; i< portalleafs ; i++)
  70.     {
  71.         leaf = &dleafs[i+1];
  72.  
  73.     //
  74.     // clear ambients
  75.     //
  76.         for (j=0 ; j<NUM_AMBIENTS ; j++)
  77.             dists[j] = 1020;
  78.  
  79.         vis = &uncompressed[i*bitbytes];
  80.         
  81.         for (j=0 ; j< portalleafs ; j++)
  82.         {
  83.             if ( !(vis[j>>3] & (1<<(j&7))) )
  84.                 continue;
  85.         
  86.         //
  87.         // check this leaf for sound textures
  88.         //    
  89.             hit = &dleafs[j+1];
  90.  
  91.             for (k=0 ; k< hit->nummarksurfaces ; k++)
  92.             {
  93.                 surf = &dfaces[dmarksurfaces[hit->firstmarksurface + k]];
  94.                 info = &texinfo[surf->texinfo];
  95.                 ofs = ((dmiptexlump_t *)dtexdata)->dataofs[info->miptex];
  96.                 miptex = (miptex_t *)(&dtexdata[ofs]);
  97.  
  98.                 if ( !Q_strncasecmp (miptex->name, "*water", 6) )
  99.                     ambient_type = AMBIENT_WATER;
  100.                 else if ( !Q_strncasecmp (miptex->name, "sky", 3) )
  101.                     ambient_type = AMBIENT_SKY;
  102.                 else if ( !Q_strncasecmp (miptex->name, "*slime", 6) )
  103.                     ambient_type = AMBIENT_WATER; // AMBIENT_SLIME;
  104.                 else if ( !Q_strncasecmp (miptex->name, "*lava", 6) )
  105.                     ambient_type = AMBIENT_LAVA;
  106.                 else if ( !Q_strncasecmp (miptex->name, "*04water", 8) )
  107.                     ambient_type = AMBIENT_WATER;
  108.                 else
  109.                     continue;
  110.  
  111.             // find distance from source leaf to polygon
  112.                 SurfaceBBox (surf, mins, maxs);
  113.                 maxd = 0;
  114.                 for (l=0 ; l<3 ; l++)
  115.                 {
  116.                     if (mins[l] > leaf->maxs[l])
  117.                         d = mins[l] - leaf->maxs[l];
  118.                     else if (maxs[l] < leaf->mins[l])
  119.                         d = leaf->mins[l] - mins[l];
  120.                     else
  121.                         d = 0;
  122.                     if (d > maxd)
  123.                         maxd = d;
  124.                 }
  125.                 
  126.                 maxd = 0.25;
  127.                 if (maxd < dists[ambient_type])
  128.                     dists[ambient_type] = maxd;
  129.             }
  130.         }
  131.         
  132.         for (j=0 ; j<NUM_AMBIENTS ; j++)
  133.         {
  134.             if (dists[j] < 100)
  135.                 vol = 1.0;
  136.             else
  137.             {
  138.                 vol = 1.0 - dists[2]*0.002;
  139.                 if (vol < 0)
  140.                     vol = 0;
  141.             }
  142.             leaf->ambient_level[j] = vol*255;
  143.         }
  144.     }
  145. }
  146.  
  147.