#pragma once

#include "enumTransformState.h"
#include "enumRenderState.h"
#include "enumTextureStageState.h"
#include "valMatrix.h"
#include "valDisplayMode.h"

namespace FDK
{
	// CDirect3DNative のマネージ向けラッパー。
	public ref class CDirect3D
	{
	public:
		CDirect3D( Size sz描画サイズ原寸px );
		~CDirect3D();
		!CDirect3D();

		void tデバイスを作成する( IntPtr hWindow, bool b全画面モード, Size sz表示サイズ, bool b垂直帰線同期を待つ );
		void tデバイスを再構築する();

		IntPtr tデバイスをロックする( bool bBlock );
		void tデバイスのロックを解除する( IntPtr hLockedDevice );
		
		void tデバイスをクリアする();							// 内部でデバイスをロックする。
		void tデバイスをクリアする( IntPtr hLockedDevice );		// ロック済みの場合はこちら。

		List<DisplayMode>^ tフォーマットに対応するディスプレイモードを取得する( IntPtr hWindow, D3DFormat format );

		DisplayMode t現在のディスプレイモードを取得する();

		Size^ tビューサイズを取得する();


		// ステート関係

		void SetTransform( TransformState state, Matrix value );
		void SetRenderState( RenderState state, int value );
		void SetRenderState( RenderState state, bool value );
		void SetRenderState( RenderState state, float value );
		generic< typename T >
		void SetRenderState( RenderState state, T value );
		
		void SetTextureStageState( int stage, TextureStageState state, int value );
		void SetTextureStageState( int stage, TextureStageState state, bool value );
		void SetTextureStageState( int stage, TextureStageState state, float value );
		generic< typename T >
		void SetTextureStageState( int stage, TextureStageState state, T value );

	private:
		CDisposed^	Disposed;
	};
}
