#pragma once

//! @file Mix/Graphics/IVertexBuffer.h
//! @brief バーテックスバッファインターフェースインクルードファイル

#include "Mix/Graphics/IDeviceObject.h"

namespace Mix{ namespace Graphics{

	//! @class IVertexBuffer
	//! @brief バーテックスバッファインターフェース
	class IVertexBuffer : public Mix::Graphics::IDeviceObject
	{
	protected:
		//! @brief デストラクタ
		virtual ~IVertexBuffer( void ){}

	public:
		//! @brief ロックし、書き込める状態にします
		//! @return 成功した場合は True を返します
		virtual Boolean Lock( void ) = 0;
		//! @brief アンロックし、描画できる状態にします
		virtual void Unlock( void ) = 0;

		//! @brief 頂点を書き込みます
		//! @param[in] pData 書き込む頂点のポインタ
		//! @param[in] count 書き込む頂点の数
		//! @return 成功した場合は True を返します
		//! @note このメソッドを使用する場合は、事前にロックしておく必要があります
		virtual Boolean Push( const void* pData, UInt32 count ) = 0;
		//! @brief 頂点の書き込み予約をします
		//! @param[in] count 書き込む頂点の数
		//! @return 成功した場合は、書き込み先のポインタを返します<br>
		//! 失敗した場合は NULL を返します
		//! @note このメソッドを使用する場合は、事前にロックしておく必要があります
		virtual void* Push( UInt32 count ) = 0;

		//! @brief 書き込まれている頂点をクリアします
		virtual void Clear( void ) = 0;

		//! @brief ストライド( バイト単位 )を取得します
		//! @return ストライドを返します
		virtual UInt32 GetStride( void ) const = 0;

		//! @brief 書き込まれている頂点数を取得します
		//! @return 書き込まれている頂点数を取得します
		virtual UInt32 GetCount( void ) const = 0;
		//! @brief 書き込める最大頂点数を取得します
		//! @return 書き込める最大頂点数を返します
		virtual UInt32 GetCapacity( void ) const = 0;
	};

}}
