프로그래밍 2014. 4. 21. 11:03
728x90

 

bsp 트리 ( bsp tree ) - 소스 코드

 

 

Vector4 - float x, y, z, w

 

 

//1. bsp 트리 생성

//재귀호출

void Make_Tree( BSPTree* _pT, Vector4* _pV, int _iCount )
{
 Vector4 vBox[2];

 vBox[0] = vBox[1] = _pV[0];


 //제일 작은 값과 제일 큰 값을 구한다
 for( int i=0; i<_iCount; i++ )
 {
  //min
  if( vBox[0].x > _pV[i].x )
  {
   vBox[0].x = _pV[i].x;
  }
  if( vBox[0].y > _pV[i].y )
  {
   vBox[0].y = _pV[i].y;
  }
  if( vBox[0].z > _pV[i].z )
  {
   vBox[0].z = _pV[i].z;
  }

  //max
  if( vBox[1].x < _pV[i].x )
  {
   vBox[1].x = _pV[i].x;
  }
  if( vBox[1].y < _pV[i].y )
  {
   vBox[1].y = _pV[i].y;
  }
  if( vBox[1].z < _pV[i].z )
  {
   vBox[1].z = _pV[i].z;
  }
 }

 

 //트리 노드에서의 가장 큰 값을 미리 저장 ( 나중, 검색을 위해서 )

 float fRadius = 0.f;

 

 if( _iCount > 1 )
 {
  //가장 값차이가 큰 축( 가장 값 범위가 넓은 )으로 정렬 시킨다
  vBox[1] -= vBox[0];
  if( vBox[1].x > vBox[1].y && vBox[1].x > vBox[1].z )
  {
   qsort( _pV, _iCount, sizeof(Vector4), _sortPos_X );
   fRadius = sqrtf( vBox[1].x * vBox[1].x ) * 0.5f;
  }
  else if( vBox[1].y > vBox[1].z )
  {
   qsort( _pV, _iCount, sizeof(Vector4), _sortPos_Y );
   fRadius = sqrtf( vBox[1].y * vBox[1].y ) * 0.5f;
  }
  else
  {
   qsort( _pV, _iCount, sizeof(Vector4), _sortPos_Z );
   fRadius = sqrtf( vBox[1].z * vBox[1].z ) * 0.5f;
  }
 }

 

 //인덱스
 int iHalf = _iCount/2;
 Vector4* pPtr = NULL;


 //leaf
 if( _iCount == 1 )
 {

  BSPTree* pNew = new BSPTree();
  pNew->pVal = &(_pV[ 0 ]); //재귀호출을 통해, 포인터가 이동하므로,
                                         //배열의 갯수가 1 일때는 항상 [0]번째 요소.
  _pT->pLeaf = pNew;

  return;
 }

 

 //front
 if( iHalf > 0 )
 {
  //
  BSPTree* pNew = new BSPTree();
  pNew->pVal = &(_pV[ iHalf ]);
  pNew->fRad = fRadius;

  //
  _pT->pFront = pNew;

  pPtr = &(_pV[ iHalf + 1 ]);
  Make_Tree( pNew, pPtr, _iCount - iHalf - 1 );
 }
 
 //back
 if( iHalf > 0 )
 {
  BSPTree* pNew = new BSPTree();
  pNew->pVal = &(_pV[ iHalf - 1 ]);
  pNew->fRad = fRadius;

  //
  _pT->pBack = pNew;
  
  pPtr = &(_pV[0]);
  Make_Tree( pNew, pPtr, iHalf - 1 );
 }

 

}

 

 

//sort

static int _sortPos_X( const void *pa, const void *pb )
{
 Vector4 *p1 = (Vector4*)pa;
 Vector4 *p2 = (Vector4*)pb;
 
 if( p1->x < p2->x ) // return -1 : 리스트 맨 왼쪽(앞쪽)에 정렬된다
  return -1;

 if( p1->x > p2->x )
  return 1;
 
 return 0;
}


static int _sortPos_Y( const void *pa, const void *pb )
{
 Vector4 *p1 = (Vector4*)pa;
 Vector4 *p2 = (Vector4*)pb;
 
 if( p1->y < p2->y ) // return -1 : 리스트 맨 왼쪽(앞쪽)에 정렬된다
  return -1;

 if( p1->y > p2->y )
  return 1;
 
 return 0;
}


static int _sortPos_Z( const void *pa, const void *pb )
{
 Vector4 *p1 = (Vector4*)pa;
 Vector4 *p2 = (Vector4*)pb;
 
 if( p1->z < p2->z ) // return -1 : 리스트 맨 왼쪽(앞쪽)에 정렬된다
  return -1;

 if( p1->z > p2->z )
  return 1;
 
 return 0;
}

 

 

 

 

 

 

728x90

'프로그래밍' 카테고리의 다른 글

셰이더 - 퍼 픽셀 라이팅 ( per pixel lighting )  (0) 2014.05.12
BSP 트리 ( bsp tree ) - 06  (0) 2014.04.21
BSP 트리 ( bsp tree ) - 04  (0) 2014.04.21
BSP 트리 ( bsp tree ) - 03  (2) 2014.04.21
BSP 트리 ( bsp tree ) - 01  (0) 2014.04.20
posted by BK dddDang
: