/* ==========================================================================
* 작 성 자 : 이순규
* 작 성 일 : 2007.02.07
* 내    용 : 가시 배열 정렬자
* 주의사항 : 
*===========================================================================*/
#pragma once

class cVisibleArray;
class cCamera;

/// 가시 배열 정렬자
class cVisibleArraySorter
{
public:
	cVisibleArraySorter( cVisibleArray* array );
	virtual ~cVisibleArraySorter();

	/// 정렬
	virtual void Sort( const cCamera& cam ) = 0;

	/// 렌더링
	virtual void Render() = 0;

protected:
	/// 가시 배열
	cVisibleArray* mArray;
};

/// 반투명 가시 배열 정렬자
class cAlphaArraySorter : public cVisibleArraySorter
{
public:
	cAlphaArraySorter( cVisibleArray* array );
	virtual ~cAlphaArraySorter();

	/// 정렬
	virtual void Sort( const cCamera& cam );

	/// 렌더링
	virtual void Render();

protected:
	void SortObjectsByDepth( int l, int r );
	float ChoosePivot( int l, int r ) const;

protected:
	int mNumGeoms;
	int mMaxGeoms;
	NiGeometry** mGeoms;
	float* mDepths;
};

/// 불투명 가시 배열 정렬자
class cSolidArraySorter : public cVisibleArraySorter
{
public:
	cSolidArraySorter( cVisibleArray* array );
	virtual ~cSolidArraySorter();

	/// 정렬
	virtual void Sort( const cCamera& cam );

	/// 렌더링
	virtual void Render();

protected:
	unsigned int mNumGeoms;
	NiGeometry** mGeoms;
};

/// 불투명 노드 비교자
/// 기하 배열을 텍스처 별로 정렬하기 위한 함수자이다.
class cSolidNodeCompare
{
public:
	bool operator()( const NiGeometry* g0, const NiGeometry* g1 ) const
	{
		NiTexturingProperty* tp0 = (NiTexturingProperty*)g0->GetProperty( NiProperty::TEXTURING );
		NiTexturingProperty* tp1 = (NiTexturingProperty*)g1->GetProperty( NiProperty::TEXTURING );

		if( tp0 == 0 )
			return false;

		if( tp1 == 0 ) 
			return true;

		NiTexture* t0 = tp0->GetBaseTexture();
		NiTexture* t1 = tp1->GetBaseTexture();
		return t0 < t1;
	}
};
