#pragma once

//! @file Mix/Graphics/IDevice.h
//! @brief グラフィックスデバイスインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Graphics{
	
	//! @class IDevice
	//! @brief グラフィックスデバイスインターフェース
	class IDevice : public Mix::Reference
	{
	public:
		//! @enum DISPLAY_MODE
		//! @brief ディスプレイモード列挙定数
		enum DISPLAY_MODE
		{
			WINDOW		= 0,	//!< ウィンドウモード
			FULLSCREEN	= 1,	//!< フルスクリーンモード
		};

	protected:
		//! @brief デストラクタ
		virtual ~IDevice( void ){}

	public:
		//! @brief シェーダーモデルを取得します
		//! @return シェーダーモデルを表す Mix::Graphics::SHADER_MODEL 列挙定数を返します
		virtual Mix::Graphics::SHADER_MODEL GetShaderModel( void ) const = 0;

		//! @brief ディスプレイモードを取得します
		//! @return ディスプレイモードを表す Mix::Graphics::IDevice::DISPLAY_MODE 列挙定数を返します
		virtual Mix::Graphics::IDevice::DISPLAY_MODE GetDisplayMode( void ) const = 0;
		//! @brief ディスプレイモードを設定します
		//! @param[in] dispMode ディスプレイモードを表す Mix::Graphics::IDevice::DISPLAY_MODE 列挙定数
		virtual void SetDisplayMode( Mix::Graphics::IDevice::DISPLAY_MODE dispMode ) = 0;
		//! @brief ディスプレイモードを交互に切り替えます
		virtual void ToggleDisplayMode( void ) = 0;

		//! @brief スクリーンのサイズを取得します
		//! @return スクリーンのサイズを返します
		virtual const Mix::Point& GetScreenSize( void ) const = 0;
		//! @brief スクリーンの有効な範囲を取得します
		//! @return スクリーンの有効な範囲を返します
		virtual const Mix::Rectangle& GetScreenValidBounds( void ) const = 0;

		//! @brief ハルシェーダーが使用できるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsHullShaderSupported( void ) const = 0;
		//! @brief ドメインシェーダーが使用できるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsDomainShaderSupported( void ) const = 0;
		//! @brief ジオメトリシェーダーが使用できるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsGeometryShaderSupported( void ) const = 0;
		//! @brief シェーダー定数が使用できるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsShaderConstantSupported( void ) const = 0;

		//! @brief 指定されたインデックスフォーマットが使用できるかどうかを確認します
		//! @param[in] format インデックスフォーマットを表す Mix::Graphics::INDEX_FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsIndexSupported( Mix::Graphics::INDEX_FORMAT format ) const = 0;

		//! @brief 指定されたフォーマットでプレーンテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsPlaneTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでボリュームテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsVolumeTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでキューブテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsCubeTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでダイナミックプレーンテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsDynamicPlaneTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでターゲットプレーンテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsTargetPlaneTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでターゲットプレーンテクスチャ ( Lockable ) が作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsLockableTargetPlaneTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでターゲットキューブテクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsTargetCubeTextureSupported( Mix::Graphics::FORMAT format ) const = 0;
		//! @brief 指定されたフォーマットでデプステクスチャが作成できるかどうかを確認します
		//! @param[in] format 確認するフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @return 使用できる場合は True を返します
		virtual Boolean IsDepthTextureSupported( Mix::Graphics::FORMAT format ) const = 0;

		//! @brief ハルシェーダーをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppHullShader 作成したハルシェーダーを渡す Mix::Graphics::IHullShader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル５の場合に使用できます
		virtual Boolean CreateHullShaderFromFile( const wchar_t* pFilePath, Mix::Graphics::IHullShader** ppHullShader ) = 0;
		//! @brief ハルシェーダーをメモリ内のファイルから作成します
		//! @param[in] pSrc メモリ内のファイルのポインタ
		//! @param[in] srcSize メモリ内のファイルのサイズ
		//! @param[out] ppHullShader 作成したハルシェーダーを渡す Mix::Graphics::IHullShader インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル５の場合に使用できます
		virtual Boolean CreateHullShaderFromMemory( const void* pSrc, UInt32 srcSize, Mix::Graphics::IHullShader** ppHullShader, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ドメインシェーダーをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppDomainShader 作成したドメインシェーダーを渡す Mix::Graphics::IDomainShader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル５の場合に使用できます
		virtual Boolean CreateDomainShaderFromFile( const wchar_t* pFilePath, Mix::Graphics::IDomainShader** ppDomainShader ) = 0;
		//! @brief ドメインシェーダーをメモリ内のファイルから作成します
		//! @param[in] pSrc メモリ内のファイルのポインタ
		//! @param[in] srcSize メモリ内のファイルのサイズ
		//! @param[out] ppDomainShader 作成したドメインシェーダーを渡す Mix::Graphics::IDomainShader インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル５の場合に使用できます
		virtual Boolean CreateDomainShaderFromMemory( const void* pSrc, UInt32 srcSize, Mix::Graphics::IDomainShader** ppDomainShader, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ジオメトリシェーダーをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppGeometryShader 作成したジオメトリシェーダーを渡す Mix::Graphics::IGeometryShader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル４、もしくわ５の場合に使用できます
		virtual Boolean CreateGeometryShaderFromFile( const wchar_t* pFilePath, Mix::Graphics::IGeometryShader** ppGeometryShader ) = 0;
		//! @brief ジオメトリシェーダーをメモリ内のファイルから作成します
		//! @param[in] pSrc メモリ内のファイルのポインタ
		//! @param[in] srcSize メモリ内のファイルのサイズ
		//! @param[out] ppGeometryShader 作成したジオメトリシェーダーを渡す Mix::Graphics::IGeometryShader インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note シェーダーモデル４、もしくわ５の場合に使用できます
		virtual Boolean CreateGeometryShaderFromMemory( const void* pSrc, UInt32 srcSize, Mix::Graphics::IGeometryShader** ppGeometryShader, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief バーテックスシェーダーをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppVertexShader 作成したバーテックスシェーダーを渡す Mix::Graphics::IVertexShader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateVertexShaderFromFile( const wchar_t* pFilePath, Mix::Graphics::IVertexShader** ppVertexShader ) = 0;
		//! @brief バーテックスシェーダーをメモリ内のファイルから作成します
		//! @param[in] pSrc バーテックスシェーダーの作成に使うメモリ内のファイルのポインタ
		//! @param[in] srcSize メモリ内のファイルのサイズ
		//! @param[out] ppVertexShader 作成したバーテックスシェーダーを渡す Mix::Graphics::IVertexShader インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateVertexShaderFromMemory( const void* pSrc, UInt32 srcSize, Mix::Graphics::IVertexShader** ppVertexShader, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ピクセルシェーダーをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppPixelShader 作成したピクセルシェーダーを渡す Mix::Graphics::IPixelShader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreatePixelShaderFromFile( const wchar_t* pFilePath, Mix::Graphics::IPixelShader** ppPixelShader ) = 0;
		//! @brief ピクセルシェーダーをメモリ内のファイルから作成します
		//! @param[in] pSrcData ピクセルシェーダーの作成に使うメモリ内のファイルのポインタ
		//! @param[in] srcDataSize メモリ内のファイルのサイズ
		//! @param[out] ppPixelShader 作成したピクセルシェーダーを渡す Mix::Graphics::IPixelShader インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreatePixelShaderFromMemory( const void* pSrcData, UInt32 srcDataSize, Mix::Graphics::IPixelShader** ppPixelShader, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief シェーダー定数を作成します
		//! @param[in] size シェーダー定数のサイズ
		//! @param[in] bDynamic 動的の場合は True
		//! @param[in] pInitialData 作成時の初期データ
		//! @param[out] ppShaderConstant 作成したシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @note シェーダーモデル４、もしくわ５の場合に使用できます
		virtual Boolean CreateShaderConstant( UInt32 size, Boolean bDynamic, const void* pInitialData, Mix::Graphics::IShaderConstant** ppShaderConstant, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief バーテックスレイアウトを作成します
		//! @param[in] pElements 要素を表す Mix::Graphics::VERTEX_ELEMENT の配列
		//! @param[in] numElement 要素の数
		//! @param[in] pVertexShader 入力シグネチャを比較する Mix::Graphics::IVertexShader インターフェースのポインタ
		//! @param[out] ppVertexLayout 作成したバーテックスレイアウトを渡す Mix::Graphics::IVertexLayout インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateVertexLayout( const Mix::Graphics::VERTEX_ELEMENT* pElements, UInt32 numElement, const Mix::Graphics::IVertexShader* pVertexShader, Mix::Graphics::IVertexLayout** ppVertexLayout, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief バーテックスバッファを作成します
		//! @param[in] count 最大頂点数
		//! @param[in] stride 頂点のバイトサイズ
		//! @param[in] bDynamic 動的の場合は True
		//! @param[in] resizeStep リサイズステップ( 頂点単位 )
		//! @param[in] pInitialData 作成時の初期データ
		//! @param[out] ppVertexBuffer 作成したバーテックスバッファを渡す Mix::Graphics::IVertexBuffer インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateVertexBuffer( UInt32 count, UInt32 stride, Boolean bDynamic, UInt32 resizeStep, const void* pInitialData, Mix::Graphics::IVertexBuffer** ppVertexBuffer, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief インデックスバッファを作成します
		//! @param[in] format インデックスのフォーマットを表す Mix::Graphics::INDEX_FORMAT 列挙定数
		//! @param[in] count 最大インデックス数
		//! @param[in] bDynamic 動的の場合は True
		//! @param[in] resizeStep インデックスバッファのリサイズステップ( インデックス単位 )
		//! @param[in] pInitialData 作成時の初期データ
		//! @param[out] ppIndexBuffer 作成したインデックスバッファを渡す Mix::Graphics::IIndexBuffer インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateIndexBuffer( Mix::Graphics::INDEX_FORMAT format, UInt32 count, Boolean bDynamic, UInt32 resizeStep, const void* pInitialData, Mix::Graphics::IIndexBuffer** ppIndexBuffer, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief テクスチャをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppTexture 作成したテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateTextureFromFile( const wchar_t* pFilePath, Mix::Graphics::ITexture** ppTexture ) = 0;
		//! @brief テクスチャをメモリ内のファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[in] pSrc メモリ内のテクスチャファイル
		//! @param[in] srcSize メモリ内のテクスチャファイルのサイズ
		//! @param[out] ppTexture 作成したテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateTextureFromMemory( const wchar_t* pFilePath, const void* pSrc, UInt32 srcSize, Mix::Graphics::ITexture** ppTexture ) = 0;
		//! @brief ダイナミックテクスチャを作成します
		//! @param[in] width テクスチャの幅
		//! @param[in] height テクスチャの高さ
		//! @param[in] format テクスチャのフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @param[out] ppTexture 作成したダイナミックテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note Mix::Graphics::ITexture::Lock を使用した CPU による書き込み、GPU による読み取りが可能です。
		virtual Boolean CreateDynamicPlaneTexture( UInt32 width, UInt32 height, Mix::Graphics::FORMAT format, Mix::Graphics::ITexture** ppTexture, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ターゲットテクスチャを作成します
		//! @param[in] width テクスチャの幅
		//! @param[in] height テクスチャの高さ
		//! @param[in] format テクスチャのフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @param[out] ppTexture 作成したターゲットテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateTargetPlaneTexture( UInt32 width, UInt32 height, Mix::Graphics::FORMAT format, Mix::Graphics::ITexture** ppTexture, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ターゲットテクスチャを作成します
		//! @param[in] width テクスチャの幅
		//! @param[in] height テクスチャの高さ
		//! @param[in] format テクスチャのフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @param[out] ppTexture 作成したターゲットテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note Mix::Graphics::ITexture::Lock を使用した CPU による読み取り、GPU による書き込みが可能です。
		virtual Boolean CreateLockableTargetPlaneTexture( UInt32 width, UInt32 height, Mix::Graphics::FORMAT format, Mix::Graphics::ITexture** ppTexture, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief ターゲットテクスチャを作成します
		//! @param[in] edgeLength エッジの長さ
		//! @param[in] format テクスチャのフォーマットを表す Mix::Graphics::FORMAT 列挙定数
		//! @param[out] ppTexture 作成したターゲットテクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateTargetCubeTexture( UInt32 edgeLength, Mix::Graphics::FORMAT format, Mix::Graphics::ITexture** ppTexture, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief デプステクスチャを作成します
		//! @param[in] width テクスチャの幅
		//! @param[in] height テクスチャの高さ
		//! @param[in] format テクスチャのフォーマット表す Mix::Graphics::FORMAT 列挙定数<br>
		//! 「FMT_D16」「FMT_D32」「FMT_D24S8」のいずれかを指定してください
		//! @param[out] ppTexture 作成したデプステクスチャを渡す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateDepthTexture( UInt32 width, UInt32 height, Mix::Graphics::FORMAT format, Mix::Graphics::ITexture** ppTexture, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief クエリを作成します
		//! @param[in] format クエリのフォーマットを表す Mix::Graphics::QUERY_FORMAT 列挙定数
		//! @param[out] ppQuery 作成したクエリを渡す Mix::Graphics::IQuery インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateQuery( Mix::Graphics::QUERY_FORMAT format, Mix::Graphics::IQuery** ppQuery, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief 描画を開始します
		//! @return 成功した場合は True を返します
		virtual Boolean Begin( void ) = 0;
		//! @brief 描画を終了します
		virtual void End( void ) = 0;
		//! @brief バックバッファの内容を転送します
		virtual void Present( void ) = 0;

		//! @brief 描画ターゲットを取得します
		//! @param ppT0 スロット 0 にターゲットとして設定されている Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param ppT1 スロット 1 にターゲットとして設定されている Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param ppT2 スロット 2 にターゲットとして設定されている Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param ppT3 スロット 3 にターゲットとして設定されている Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @param ppDS デプス/ステンシルバッファとして設定されている Mix::Graphics::ITexture インターフェースのポインタのアドレス
		virtual void GetTarget( Mix::Graphics::ITexture** ppT0, Mix::Graphics::ITexture** ppT1, Mix::Graphics::ITexture** ppT2, Mix::Graphics::ITexture** ppT3, Mix::Graphics::ITexture** ppDS ) = 0;
		//! @brief 描画ターゲットを設定します
		//! @param pT0 スロット 0 にターゲットとして設定する Mix::Graphics::ITexture インターフェースのポインタ
		//! @param pT1 スロット 1 にターゲットとして設定する Mix::Graphics::ITexture インターフェースのポインタ
		//! @param pT2 スロット 2 にターゲットとして設定する Mix::Graphics::ITexture インターフェースのポインタ
		//! @param pT3 スロット 3 にターゲットとして設定する Mix::Graphics::ITexture インターフェースのポインタ
		//! @param pDS デプス/ステンシルバッファとして設定する Mix::Graphics::ITexture インターフェースのポインタ
		virtual void SetTarget( Mix::Graphics::ITexture* pT0, Mix::Graphics::ITexture* pT1, Mix::Graphics::ITexture* pT2, Mix::Graphics::ITexture* pT3, Mix::Graphics::ITexture* pDS ) = 0;

		//! @brief 現在の描画先ターゲットをクリアします
		//! @param[in] clearTarget ターゲットテクスチャをクリアする場合は True
		//! @param[in] clearDepth デプステクスチャをクリアする場合は True
		//! @param[in] color ターゲットテクスチャのクリア色を表す Mix::Vector4 クラス
		//! @param[in] z デプステクスチャをクリアする際の値
		virtual void Clear( Boolean clearTarget, Boolean clearDepth, const Mix::Vector4& color = Mix::Vector4(), Float32 z = 1.0f ) = 0;

		//! @brief ビューの範囲を取得します
		//! @return ビューの範囲を表す Mix::Rectangle クラスを返します
		virtual const Mix::Rectangle& GetViewBounds( void ) const = 0;
		//! @brief ビューの範囲を設定します
		//! @param[in] x ビューの範囲の左上Ｘ座標
		//! @param[in] y ビューの範囲の左上Ｙ座標
		//! @param[in] width ビューの範囲の幅
		//! @param[in] height ビューの範囲の高さ
		virtual void SetViewBounds( Int32 x, Int32 y, Int32 width, Int32 height ) = 0;
		//! @brief ビューの範囲を設定します
		//! @param[in] rect ビューの範囲を表す Mix::Rectangle クラス
		virtual void SetViewBounds( const Mix::Rectangle& rect ) = 0;

		//! @brief シザリングの範囲を取得します
		//! @return シザリングの範囲を表す Mix::Rectangle クラスを返します
		virtual const Mix::Rectangle& GetScissorBounds( void ) const = 0;
		//! @brief シザリングの範囲を設定します
		//! @param[in] rect シザリングの範囲を表す Mix::Rectangle クラス
		virtual void SetScissorBounds( const Mix::Rectangle& rect ) = 0;
		//! @brief シザリングの範囲を設定します
		//! @param[in] x シザー矩形の左上Ｘ座標
		//! @param[in] y シザー矩形の左上Ｙ座標
		//! @param[in] width シザー矩形の幅
		//! @param[in] height シザー矩形の高さ
		virtual void SetScissorBounds( Int32 x, Int32 y, Int32 width, Int32 height ) = 0;

		//! @brief ラスタライザステートを取得します
		//! @return ラスタライザステートを表す Mix::Graphics::RASTERIZER_DESC 構造体を返します
		virtual const Mix::Graphics::RASTERIZER_DESC& GetRasterizerState( void ) const = 0;
		//! @brief ラスタライザステートを設定します
		//! @param[in] fillMode 描画モード
		//! @param[in] cullMode カリングモード
		//! @param[in] bScissoring シザリングを有効にする場合は True
		virtual void SetRasterizerState( Mix::Graphics::FILL_TYPE fillMode, Mix::Graphics::CULL_TYPE cullMode, Boolean bScissoring ) = 0;
		//! @brief ラスタライザステートを設定します
		//! @param[in] desc ラスタライザステートを表す Mix::Graphics::RASTERIZER_DESC 構造体
		virtual void SetRasterizerState( const Mix::Graphics::RASTERIZER_DESC& desc ) = 0;

		//! @brief デプスステートを取得します
		//! @return デプスステートを表す Mix::Graphics::DEPTH_DESC 構造体を返します
		virtual const Mix::Graphics::DEPTH_DESC& GetDepthState( void ) const = 0;
		//! @brief デプスステートを設定します
		//! @param[in] bTest 深度テストを有効にする場合は True
		//! @param[in] bWrite 深度バッファへの書き込みを有効にする場合は True
		//! @param[in] func 深度テストに使用するファンクションを表す Mix::Graphics::ZFUNC_TYPE 列挙定数
		virtual void SetDepthState( Boolean bTest, Boolean bWrite, Mix::Graphics::ZFUNC_TYPE func = Mix::Graphics::ZFUNC_LESSEQUAL ) = 0;
		//! @brief デプスステートを設定します
		//! @param[in] desc デプスステートを表す Mix::Graphics::DEPTH_DESC 構造体
		virtual void SetDepthState( const Mix::Graphics::DEPTH_DESC& desc ) = 0;

		//! @brief ブレンドステートを取得します
		//! @return ブレンドステートを表す Mix::Graphics::BLEND_DESC 構造体を返します
		virtual const Mix::Graphics::BLEND_DESC& GetBlendState( void ) const = 0;
		//! @brief ブレンドステートを設定します
		//! @param[in] type ブレンドタイプを表す Mix::Graphics::BLEND_TYPE 列挙定数
		//! @param[in] colorWriteMask カラーの書き込みマスクを表す Mix::Graphics::COLOR_WRITE_MASK 列挙定数
		virtual void SetBlendState( Mix::Graphics::BLEND_TYPE type, Mix::Graphics::COLOR_WRITE_MASK colorWriteMask = Mix::Graphics::COLOR_WRITE_RGBA ) = 0;
		//! @brief ブレンドステートを設定します
		//! @param[in] desc ブレンドステートを表す Mix::Graphics::BLEND_DESC 構造体
		virtual void SetBlendState( const Mix::Graphics::BLEND_DESC& desc ) = 0;

		//! @brief バーテックスレイアウトを設定します
		//! @param[in] pVertexLayout 設定するバーテックスレイアウトを表す Mix::Graphics::IVertexLayout インターフェースのポインタ
		virtual void SetVertexLayout( Mix::Graphics::IVertexLayout* pVertexLayout ) = 0;

		//! @brief ハルシェーダーを設定します
		//! @param[in] pHullShader 設定するハルシェーダーを表す Mix::Graphics::IHullShader インターフェースのポインタ
		//! @note シェーダーモデル５の場合に使用できます
		virtual void SetHullShader( Mix::Graphics::IHullShader* pHullShader ) = 0;
		//! @brief ドメインシェーダーを設定します
		//! @param[in] pDomainShader 設定するドメインシェーダーを表す Mix::Graphics::IDomainShader インターフェースのポインタ
		//! @note シェーダーモデル５の場合に使用できます
		virtual void SetDomainShader( Mix::Graphics::IDomainShader* pDomainShader ) = 0;
		//! @brief ジオメトリシェーダーを設定します
		//! @param[in] pGeometryShader 設定するジオメトリシェーダーを表す Mix::Graphics::IGeometryShader インターフェースのポインタ
		//! @note シェーダーモデル４、もしくわ５の場合に使用できます
		virtual void SetGeometryShader( Mix::Graphics::IGeometryShader* pGeometryShader ) = 0;
		//! @brief バーテックスシェーダーを設定します
		//! @param[in] pVertexShader 設定するバーテックスシェーダーを表す Mix::Graphics::IVertexShader インターフェースのポインタ
		virtual void SetVertexShader( Mix::Graphics::IVertexShader* pVertexShader ) = 0;
		//! @brief ピクセルシェーダーを設定します
		//! @param[in] pPixelShader 設定するピクセルシェーダーを表す Mix::Graphics::IPixelShader インターフェースのポインタ
		virtual void SetPixelShader( Mix::Graphics::IPixelShader* pPixelShader ) = 0;

		//! @brief バーテックスシェーダーにブール型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内のブール値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetVertexShaderConstantB( UInt32 startRegister, const Boolean* data, UInt32 count ) = 0;
		//! @brief バーテックスシェーダーに整数型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の4つの整数値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetVertexShaderConstantI( UInt32 startRegister, const Int32* data, UInt32 count ) = 0;
		//! @brief バーテックスシェーダーに浮動小数点型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の4つの浮動小数点値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetVertexShaderConstantF( UInt32 startRegister, const Float32* data, UInt32 count ) = 0;
		//! @brief バーテックスシェーダーに浮動小数点ベクトル定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の浮動小数点ベクトルの数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetVertexShaderConstantF( UInt32 startRegister, const Mix::Vector4* data, UInt32 count ) = 0;
		//! @brief バーテックスシェーダーに浮動小数点行列定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の浮動小数点ベクトルの数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetVertexShaderConstantF( UInt32 startRegister, const Mix::Matrix4x4* data, UInt32 count ) = 0;
		//! @brief ピクセルシェーダーにブール型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内のブール値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetPixelShaderConstantB( UInt32 startRegister, const Boolean* data, UInt32 count ) = 0;
		//! @brief ピクセルシェーダーに整数型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の4つの整数値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetPixelShaderConstantI( UInt32 startRegister, const Int32* data, UInt32 count ) = 0;
		//! @brief ピクセルシェーダーに浮動小数点型定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の4つの浮動小数点値の数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetPixelShaderConstantF( UInt32 startRegister, const Float32* data, UInt32 count ) = 0;
		//! @brief ピクセルシェーダーに浮動小数点ベクトル定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の浮動小数点ベクトルの数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetPixelShaderConstantF( UInt32 startRegister, const Mix::Vector4* data, UInt32 count ) = 0;
		//! @brief ピクセルシェーダーに浮動小数点行列定数を設定します
		//! @param[in] startRegister 最初の定数を格納するレジスタ番号
		//! @param[in] data 定数配列のポインタ
		//! @param[in] count 定数配列内の浮動小数点ベクトルの数
		//! @note シェーダーモデル３の場合に使用できます
		virtual void SetPixelShaderConstantF( UInt32 startRegister, const Mix::Matrix4x4* data, UInt32 count ) = 0;

		//! @brief ハルシェーダーに定数を設定します
		//! @param[in] slot 設定するスロット
		//! @param[in] pShaderConstant 設定するシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタ
		//! @note シェーダーモデル５の場合に使用できます
		virtual void SetHullShaderConstant( UInt32 slot, Mix::Graphics::IShaderConstant* pShaderConstant ) = 0;
		//! @brief ドメインシェーダーに定数を設定します
		//! @param[in] slot 設定するスロット
		//! @param[in] pShaderConstant 設定するシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタ
		//! @note シェーダーモデル５の場合に使用できます
		virtual void SetDomainShaderConstant( UInt32 slot, Mix::Graphics::IShaderConstant* pShaderConstant ) = 0;
		//! @brief ジオメトリシェーダーに定数を設定します
		//! @param[in] slot 設定するスロット
		//! @param[in] pShaderConstant 設定するシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタ
		//! @note シェーダーモデル４、もしくわ５の場合に使用できます
		virtual void SetGeometryShaderConstant( UInt32 slot, Mix::Graphics::IShaderConstant* pShaderConstant ) = 0;
		//! @brief バーテックスシェーダーに定数を設定します
		//! @param[in] slot 設定するスロット
		//! @param[in] pShaderConstant 設定するシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタ
		virtual void SetVertexShaderConstant( UInt32 slot, Mix::Graphics::IShaderConstant* pShaderConstant ) = 0;
		//! @brief ピクセルシェーダーに定数を設定します
		//! @param[in] slot 設定するスロット
		//! @param[in] pShaderConstant 設定するシェーダー定数を表す Mix::Graphics::IShaderConstant インターフェースのポインタ
		virtual void SetPixelShaderConstant( UInt32 slot, Mix::Graphics::IShaderConstant* pShaderConstant ) = 0;

		//! @brief バーテックスバッファを設定します
		//! @param[in] pVertexBuffer 設定するバーテックスバッファを表す Mix::Graphics::IVertexBuffer インターフェースのポインタ
		virtual void SetVertexBuffer( Mix::Graphics::IVertexBuffer* pVertexBuffer ) = 0;
		//! @brief インデックスバッファを設定します
		//! @param[in] pIndexBuffer 設定するインデックスバッファを表す Mix::Graphics::IIndexBuffer インターフェースのポインタ
		virtual void SetIndexBuffer( Mix::Graphics::IIndexBuffer* pIndexBuffer ) = 0;

		//! @brief テクスチャステージの最大数を取得します
		//! @return テクスチャステージの最大数を返します
		virtual UInt32 GetTextureStageMax( void ) const = 0;
		//! @brief テクスチャを設定します
		//! @param[in] stage テクスチャを設定するステージ
		//! @param[in] filter テクスチャに適用するフィルタを表す Mix::Graphics::TEXTURE_FILTER 列挙定数
		//! @param[in] address テクスチャに適用する座標の解決手法を表す Mix::Graphics::TEXTURE_ADDRESS 列挙定数
		//! @param[in] pTexture 設定するテクスチャを表す Mix::Graphics::ITexture インターフェースのポインタ
		virtual void SetTexture( UInt32 stage, Mix::Graphics::TEXTURE_FILTER_TYPE filter, Mix::Graphics::TEXTURE_ADDRESS_TYPE address, Mix::Graphics::ITexture* pTexture ) = 0;
		//! @brief テクスチャを NULL に設定します
		//! @param[in] stage NULL に設定するテクスチャステージ
		virtual void ResetTexture( UInt32 stage ) = 0;

		//! @brief プリミティブを描画します
		//! @param[in] primitiveType プリミティブの種類を表す Mix::Graphics::PRIMITIVE_TYPE 列挙定数
		//! @param[in] startVertex 頂点の開始位置
		//! @param[in] numVertex 描画に使用する頂点数
		virtual void Draw( Mix::Graphics::PRIMITIVE_TYPE primitiveType, UInt32 startVertex, UInt32 numVertex ) = 0;
		//! @brief インデックスに基づいてプリミティブを描画します
		//! @param[in] primitiveType プリミティブの種類を表す Mix::Graphics::PRIMITIVE_TYPE 列挙定数
		//! @param[in] startVertex 頂点の開始位置
		//! @param[in] numVertex 描画に使用する頂点数
		//! @param[in] startIndex インデックスの開始位置
		//! @param[in] numIndex 描画に使用するインデックス数
		virtual void DrawIndexed( Mix::Graphics::PRIMITIVE_TYPE primitiveType, UInt32 startVertex, UInt32 numVertex, UInt32 startIndex, UInt32 numIndex ) = 0;

		//! @brief 描画したプリミティブの数を取得します
		//! @return 描画したプリミティブ数を返します
		virtual UInt32 GetDrawPrimitiveCount( void ) const = 0;

		//! @brief スクリーンショットを保存します
		//! @param[in] pFileName 保存するファイル名
		//! @return 成功した場合は True を返します
		//! @note BMP、JPG、PNG をサポートしています
		virtual Boolean SaveScreenshot( const wchar_t* pFileName ) = 0;
	};

}}
