dpasca

checkLine() (raycast)

Jun 22nd, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. DFORCEINLINE bool checkLine(
  2.                     const short *pMap,
  3.                     int p0,
  4.                     int p2,
  5.                     Float3 d,
  6.                     float minY,
  7.                     float maxY,
  8.                     size_t sizL2 )
  9.  
  10. {
  11.     // y value is in quantized units
  12.     float p1 = (float)pMap[ (p2 << sizL2) + p0 ];
  13.  
  14.     int coordMax = (int)(1 << sizL2) - 1;
  15.  
  16.     const float DY_SCA = Terrain::MAP_HE_QUANT_SCALE * Terrain::MAP_HE_QUANT_SCALE;
  17.  
  18.     u_int   major = 0;
  19.  
  20.     if ( DAbs( d[2] ) > DAbs( d[0] ) )
  21.     {
  22.         major = 2;
  23.         std::swap( d[0], d[2] );
  24.         std::swap( p0, p2 );
  25.     }
  26.  
  27.     int     q0      = coordMax;
  28.     int     d0n     = 1;
  29.     float   d1n     = d[1] / d[0] * DY_SCA;
  30.     float   d2n     = d[2] / d[0];
  31.  
  32.     if ( d[0] < 0 ) {
  33.         q0  = -q0;
  34.         d0n = -d0n;
  35.         d1n = -d1n;
  36.         d2n = -d2n;
  37.     }
  38.  
  39.     q0 += p0;
  40.  
  41.     float q1 = p1 + d1n * (float)(q0 - p0);
  42.  
  43.     if ( q1 > maxY ) q0 = p0 + (int)((maxY - p1) / (d1n ? d1n : 1)); else
  44.     if ( q1 < minY ) q0 = p0 + (int)((minY - p1) / (d1n ? d1n : 1));
  45.  
  46.     if ( q0 == p0 )
  47.         return false;
  48.  
  49.     float i2 = (float)p2;
  50.     float i1 = (float)p1;
  51.  
  52.     if ( major == 0 )
  53.     {
  54.         for (int i0=p0;;)
  55.         {
  56.             if ( i0 == q0 )
  57.                 break;
  58.  
  59.             i0 += d0n; i1 += d1n; i2 += d2n;
  60.  
  61.             int i2_w = (int)i2 & coordMax;
  62.             int i0_w = i0 & coordMax;
  63.             if ( pMap[ (i2_w << sizL2) + i0_w ] > (int)i1 )
  64.                 return true;
  65.         }
  66.     }
  67.     else
  68.     {
  69.         for (int i0=p0;;)
  70.         {
  71.             if ( i0 == q0 )
  72.                 break;
  73.  
  74.             i0 += d0n; i1 += d1n; i2 += d2n;
  75.  
  76.             int i2_w = (int)i2 & coordMax;
  77.             int i0_w = i0 & coordMax;
  78.             if ( pMap[ (i0_w << sizL2) + i2_w ] > (int)i1 )
  79.                 return true;
  80.         }
  81.     }
  82.  
  83.     return false;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment