Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DFORCEINLINE bool checkLine(
- const short *pMap,
- int p0,
- int p2,
- Float3 d,
- float minY,
- float maxY,
- size_t sizL2 )
- {
- // y value is in quantized units
- float p1 = (float)pMap[ (p2 << sizL2) + p0 ];
- int coordMax = (int)(1 << sizL2) - 1;
- const float DY_SCA = Terrain::MAP_HE_QUANT_SCALE * Terrain::MAP_HE_QUANT_SCALE;
- u_int major = 0;
- if ( DAbs( d[2] ) > DAbs( d[0] ) )
- {
- major = 2;
- std::swap( d[0], d[2] );
- std::swap( p0, p2 );
- }
- int q0 = coordMax;
- int d0n = 1;
- float d1n = d[1] / d[0] * DY_SCA;
- float d2n = d[2] / d[0];
- if ( d[0] < 0 ) {
- q0 = -q0;
- d0n = -d0n;
- d1n = -d1n;
- d2n = -d2n;
- }
- q0 += p0;
- float q1 = p1 + d1n * (float)(q0 - p0);
- if ( q1 > maxY ) q0 = p0 + (int)((maxY - p1) / (d1n ? d1n : 1)); else
- if ( q1 < minY ) q0 = p0 + (int)((minY - p1) / (d1n ? d1n : 1));
- if ( q0 == p0 )
- return false;
- float i2 = (float)p2;
- float i1 = (float)p1;
- if ( major == 0 )
- {
- for (int i0=p0;;)
- {
- if ( i0 == q0 )
- break;
- i0 += d0n; i1 += d1n; i2 += d2n;
- int i2_w = (int)i2 & coordMax;
- int i0_w = i0 & coordMax;
- if ( pMap[ (i2_w << sizL2) + i0_w ] > (int)i1 )
- return true;
- }
- }
- else
- {
- for (int i0=p0;;)
- {
- if ( i0 == q0 )
- break;
- i0 += d0n; i1 += d1n; i2 += d2n;
- int i2_w = (int)i2 & coordMax;
- int i0_w = i0 & coordMax;
- if ( pMap[ (i0_w << sizL2) + i2_w ] > (int)i1 )
- return true;
- }
- }
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment