#include "stdafx.h"
#include "CDirect3DNative.h"
#include "refCDirect3D.h"

namespace FDK
{
// public:

	CDirect3D::CDirect3D( Size sz描画サイズ原寸px )
	{
		SIZE sz;
		sz.cx = sz描画サイズ原寸px.Width;
		sz.cy = sz描画サイズ原寸px.Height;

		this->Disposed = gcnew CDisposed();

		CDirect3DNative::t初期化( sz );
	}
	CDirect3D::~CDirect3D()
	{
		if( this->Disposed->bDispose済みまたは処理中である )
			return;	// 例外発出はしない

		if( !this->Disposed->t開始を宣言する() )
			return;	// 例外発出はしない

		// ファイナライザを呼び出して Unmanaged リソースを解放したのち、ファイナライザの呼び出しを抑制する。
		this->!CDirect3D();

		//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
	}
	CDirect3D::!CDirect3D()
	{
		// Unmanaged リソースを解放する。ディスポーザが呼び出されていればファイナライザは呼び出されないようコンパイラが調整する。
		CDirect3DNative::t終了();
	}

	void CDirect3D::tデバイスを作成する( IntPtr hWindow, bool b全画面モード, Size sz表示サイズ, bool b垂直帰線同期を待つ )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::tデバイスを作成する( static_cast<HWND>( hWindow.ToPointer() ), b全画面モード, sz表示サイズ.Width, sz表示サイズ.Height, b垂直帰線同期を待つ );
	}
	void CDirect3D::tデバイスを再構築する()
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::tデバイスを再構築する();
	}

	IntPtr CDirect3D::tデバイスをロックする( bool bBlock )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		HANDLE hDevice = NULL;
		IDirect3DDevice9Ex *pDevice = NULL;

		CDirect3DNative::tデバイスをロックする( bBlock, &hDevice, &pDevice );

		return IntPtr( hDevice );
	}
	void CDirect3D::tデバイスのロックを解除する( IntPtr hLockedDevice )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		HANDLE hDevice = static_cast<HANDLE>( hLockedDevice.ToPointer() );
		CDirect3DNative::tデバイスのロックを解除する( hDevice );
	
		hLockedDevice = IntPtr::Zero;
	}

	void CDirect3D::tデバイスをクリアする()
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::tデバイスをクリアする();
	}
	void CDirect3D::tデバイスをクリアする( IntPtr hLockedDevice )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::tデバイスをクリアする( static_cast<HANDLE>( hLockedDevice.ToPointer() ) );
	}

	List<DisplayMode>^ CDirect3D::tフォーマットに対応するディスプレイモードを取得する( IntPtr hWindow, D3DFormat format )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		return CDirect3DNative::tフォーマットに対応するディスプレイモードを取得する( static_cast<HWND>( hWindow.ToPointer() ), format );
	}

	DisplayMode CDirect3D::t現在のディスプレイモードを取得する()
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		D3DDISPLAYMODE mode = CDirect3DNative::GetDirect3DDisplayMode();
		DisplayMode dm;

		dm.Format = (D3DFormat) mode.Format;
		dm.Width = mode.Width;
		dm.Height = mode.Height;
		dm.RefreshRate = mode.RefreshRate;

		return dm;
	}

	Size^ CDirect3D::tビューサイズを取得する()
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		D3DVIEWPORT9 View = CDirect3DNative::GetViewPort();
		return gcnew Size( View.Width, View.Height );
	}

	void CDirect3D::SetTransform( TransformState state, Matrix value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetTransform( state, value );
	}

	void CDirect3D::SetRenderState( RenderState state, int value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetRenderState( state, value );
	}
	void CDirect3D::SetRenderState( RenderState state, bool value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetRenderState( state, value );
	}
	void CDirect3D::SetRenderState( RenderState state, float value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetRenderState( state, value );
	}
	generic< typename T >
	void CDirect3D::SetRenderState( RenderState state, T value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetRenderState( state, value );
	}

	void CDirect3D::SetTextureStageState( int stage, TextureStageState state, int value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetTextureStageState( stage, state, value );
	}
	void CDirect3D::SetTextureStageState( int stage, TextureStageState state, bool value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetTextureStageState( stage, state, value );
	}
	void CDirect3D::SetTextureStageState( int stage, TextureStageState state, float value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetTextureStageState( stage, state, value );
	}
	generic< typename T >
	void CDirect3D::SetTextureStageState( int stage, TextureStageState state, T value )
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CDirect3D" );

		CDirect3DNative::SetTextureStageState( stage, state, value );
	}
}
