
#pragma once

#include "GlInclude.h"


namespace lib_gl
{


// ------------------------------------------------------------------------------------------
//! 複数要素のディスプレイリスト
class GlDisplayListArray
{
public:
	GlDisplayListArray(void);
	~GlDisplayListArray(void);
	
	//! ディスプレイリストの取得、開放
	bool GenerateList( GLuint i_ListLength );
	void ReleaseList(void);

	//! 初期化済みディスプレイリストID数を返す
	GLuint GetListLength(void) const;
	//! ディスプレイリストID配列が初期化されていないかどうか確かめる
	bool IsEmpty(void) const;

	//! レンダリング処理の開始
	void BeginList( GLuint i_ListIdIndex , GLenum ListMode = GL_COMPILE );
	//! リストの登録を終了する
	void EndList(void);

	//! ディスプレイリスト呼び出し
	void CallList( GLuint i_ListIdIndex );

private:
	GlDisplayListArray(const GlDisplayListArray&) {}
	void operator=(const GlDisplayListArray&) {}

protected:
	GLuint m_ListID;     //!< ディスプレイリストID配列の先頭ID
	GLuint m_ListLength; //!< 生成済みディスプレイリストID配列の要素数
};



// ------------------------------------------------------------------------------------------
// GlDisplayListArray implements


inline GlDisplayListArray::GlDisplayListArray(void)
{
	m_ListID     = 0;
	m_ListLength = 0;
}

inline GlDisplayListArray::~GlDisplayListArray(void)
{
	if( IsEmpty() == false )
		glDeleteLists( m_ListID , m_ListLength );
}

//! ディスプレイリストの取得、開放
inline bool GlDisplayListArray::GenerateList( GLuint i_ListLength )
{
	m_ListID = glGenLists( i_ListLength );
	if( m_ListID == 0 ) return false;

	m_ListLength = i_ListLength;
	return true;
}

inline void GlDisplayListArray::ReleaseList(void)
{
	if( m_ListID != 0 )
	{
		glDeleteLists( m_ListID , 1 );
		m_ListID     = 0;
		m_ListLength = 0;
	}
}

//! 初期化済みディスプレイリストID数を返す
inline GLuint GlDisplayListArray::GetListLength(void) const
{
	return m_ListLength;
}

//! ディスプレイリストID配列が初期化されていないかどうか確かめる
inline bool GlDisplayListArray::IsEmpty(void) const
{
	return ( m_ListLength == 0 );
}

//! レンダリング処理の開始
inline void GlDisplayListArray::BeginList( GLuint i_ListIdIndex , GLenum ListMode )
{
	glNewList( m_ListID + i_ListIdIndex , ListMode );
}

//! リストの登録を終了する
inline void GlDisplayListArray::EndList(void)
{
	glEndList();
}

//! ディスプレイリスト呼び出し
inline void GlDisplayListArray::CallList( GLuint i_ListIdIndex )
{
	glCallList( m_ListID + i_ListIdIndex );
}


}
