FrustumCull.cpp
上传用户:hkb425
上传日期:2007-06-16
资源大小:34191k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // FrustumCull.cpp: implementation of the CFrustumCull class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "FrustumCull.h"
  6. #include <math.h>
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CFrustumCull::CFrustumCull()
  16. {  
  17. m_HalfFOV=40;
  18. m_ViewerRotate=0;
  19. m_ViewDistance=50;
  20. for(int i=0;i<5;i++)
  21. {
  22. m_pos[i].x=m_pos[i].y=0;
  23. }
  24. m_upPos=m_downPos=0;
  25. for( i=0;i<256;i++)
  26. {
  27. m_LeftArray[i]=0;
  28. m_RightArray[i]=0;
  29. }
  30. }
  31. void CFrustumCull::InitFrustumCull(int halfFOV,int distance)
  32. {
  33. m_HalfFOV=halfFOV;
  34. m_ViewDistance=distance;
  35. if(m_ViewDistance>125)m_ViewDistance=125;
  36. }
  37. CFrustumCull::~CFrustumCull()
  38. {
  39. }
  40. void CFrustumCull::UpdateFrustumCull()
  41. {
  42. ///////////////get view back,left and right
  43.     m_pos[0].x =128-int(4*sinf((m_ViewerRotate+150)*0.01745329f));
  44.     m_pos[0].y =128-int(4*cosf((m_ViewerRotate+150)*0.01745329f));
  45.     m_pos[1].x =128-int(4*sinf((m_ViewerRotate-150)*0.01745329f));
  46.     m_pos[1].y =128-int(4*cosf((m_ViewerRotate-150)*0.01745329f));
  47.     m_pos[3].x =128-int(m_ViewDistance*sinf(m_ViewerRotate*0.01745329f));
  48. m_pos[3].y =128-int(m_ViewDistance*cosf(m_ViewerRotate*0.01745329f));
  49.     m_pos[4].x =128-int(m_ViewDistance*sinf((m_ViewerRotate+m_HalfFOV)*0.01745329f));
  50.     m_pos[4].y =128-int(m_ViewDistance*cosf((m_ViewerRotate+m_HalfFOV)*0.01745329f));
  51.     m_pos[2].x =128-int(m_ViewDistance*sinf((m_ViewerRotate-m_HalfFOV)*0.01745329f));
  52.     m_pos[2].y =128-int(m_ViewDistance*cosf((m_ViewerRotate-m_HalfFOV)*0.01745329f));
  53.     ////////////////////////////////////////////////////////////////
  54. ////////////////get up and down point 
  55. m_upPos=m_downPos=0;
  56. int minx=0,maxx=0;
  57. for(int i=1;i<5;i++)
  58. {
  59. if( m_pos[i].y > m_pos[m_downPos].y ) m_downPos=i; 
  60. if( m_pos[i].y < m_pos[m_upPos].y   ) m_upPos  =i; 
  61. if( m_pos[i].x > m_pos[maxx].x ) maxx=i; 
  62. if( m_pos[i].x < m_pos[minx].x ) minx=i; 
  63. }
  64. /////////////////Fill  array//////////////////////////////
  65. int num=0;
  66. int cur=m_upPos;
  67. int next;
  68. /////////////////left array/////////////////////
  69. do{
  70. next=cur+1;
  71.         if(next==5)next=0;
  72. FillArray(m_pos[cur].x,m_pos[cur].y,m_pos[next].x,m_pos[next].y,
  73.       m_LeftArray,true);
  74. cur++;
  75. if(cur==5)cur=0;
  76. num++;
  77. }while(cur!=m_downPos && num<5);
  78. /////////////////right array////////////////////
  79. num=0;
  80. cur=m_downPos;
  81. do{
  82. next=cur+1;
  83.         if(next==5)next=0;
  84. FillArray(m_pos[cur].x,m_pos[cur].y,m_pos[next].x,m_pos[next].y,
  85.       m_RightArray,false);
  86. cur++;
  87. if(cur==5)cur=0;
  88. num++;
  89. }while(cur!=m_upPos && num<5);
  90. }
  91. void CFrustumCull::FillArray(int startx,int startz,int endx,int endz, 
  92.  unsigned char *pArray,bool bLeft)
  93. {
  94.     if(startz==endz)
  95. {
  96. int max,min;
  97.         max=(startx>=endx)?startx:endx;
  98. min=(startx<=endx)?startx:endx;
  99. if(bLeft)
  100. pArray[startz]=min;
  101. else
  102. pArray[startz]=max;
  103. return;
  104. }
  105.     ///////////////////////////////////////////////////////
  106.     if(startz>endz)
  107. {
  108. int temp;
  109. temp=startz;
  110. startz=endz;
  111. endz=temp;
  112. temp=startx;
  113. startx=endx;
  114. endx=temp;
  115. }
  116. float deltax=float(endx-startx)/(endz-startz);
  117.     int j=0;
  118. for(int i=startz;i<(endz+1);i++)
  119. {
  120. pArray[i]=unsigned char(startx+deltax*j);
  121. j++;
  122. }
  123. }
  124. bool CFrustumCull::IsInFrustum(int X,int Z)
  125. {
  126. if(Z>m_pos[m_downPos].y || Z<m_pos[m_upPos].y)return false;
  127. if(X>m_RightArray[Z] || X<m_LeftArray[Z])return false;
  128.  
  129. return true;
  130. }
  131. /*
  132.     if(m_pos[4].x>m_MaxX)m_MaxX=m_pos[4].x;
  133.     if(m_pos[4].y>m_MaxZ)m_MaxZ=m_pos[4].y;
  134.     if(m_pos[2].x>m_MaxX)m_MaxX=m_pos[2].x;
  135.     if(m_pos[2].y>m_MaxZ)m_MaxZ=m_pos[2].y;
  136.     if(m_pos[3].x>m_MaxX)m_MaxX=m_pos[3].x;
  137.     if(m_pos[3].y>m_MaxZ)m_MaxZ=m_pos[3].y;
  138.     if(m_pos[0].x>m_MaxX)m_MaxX=m_pos[0].x;
  139.     if(m_pos[0].y>m_MaxZ)m_MaxZ=m_pos[0].y;
  140.     if(m_pos[1].x>m_MaxX)m_MaxX=m_pos[1].x;
  141.     if(m_pos[1].y>m_MaxZ)m_MaxZ=m_pos[1].y;
  142.     if(m_pos[4].x<m_MinX)m_MinX=m_pos[4].x;
  143.     if(m_pos[4].y<m_MinZ)m_MinZ=m_pos[4].y;
  144.     if(m_pos[2].x<m_MinX)m_MinX=m_pos[2].x;
  145.     if(m_pos[2].y<m_MinZ)m_MinZ=m_pos[2].y;
  146.     if(m_pos[3].x<m_MinX)m_MinX=m_pos[3].x;
  147.     if(m_pos[3].y<m_MinZ)m_MinZ=m_pos[3].y;
  148.     if(m_pos[0].x<m_MinX)m_MinX=m_pos[0].x;
  149.     if(m_pos[0].y<m_MinZ)m_MinZ=m_pos[0].y;
  150.     if(m_pos[1].x<m_MinX)m_MinX=m_pos[1].x;
  151.     if(m_pos[1].y<m_MinZ)m_MinZ=m_pos[1].y;
  152. */