#pragma once

#include "enumD3DFormat.h"
#include "valMatrix.h"
#include "valVector3.h"

namespace FDK
{
	public ref class CTexture : IDisposable
	{
	public:
		property bool b加算合成
		{
			bool get() 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_b加算合成->Get();
			}
			void set( bool value ) 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_b加算合成->Set( value );
			}
		}
		/// <summary>透明:0〜255:不透明。</summary>
		property int n透明度
		{
			int get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_n透明度->Get();
			}
			void set( int value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_n透明度->Set( Math::Min( Math::Max( value, 0 ), 255 ) );
			}
		}
		property Size szテクスチャサイズ
		{
			Size get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_szテクスチャサイズ->Get();
			}
		protected:
			void set( Size value ) 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_szテクスチャサイズ->Set( value );
			}
		}
		property Size sz画像サイズ
		{
			Size get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_sz画像サイズ->Get();
			}
		protected:
			void set( Size value ) 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_sz画像サイズ->Set( value );
			}
		}
		property D3DFormat d3dフォーマット
		{
			D3DFormat get() 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_D3DFormat->Get();
			}
			void set( D3DFormat value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_D3DFormat->Set( value );
			}
		}
		Vector3 vc拡大縮小倍率;

		/// <summary>
		/// 描画範囲を示す矩形のリスト。	
		/// 本クラスでは使用せず、使用方法はすべてユーザに委ねる。（基本的には１枚のテクスチャに複数の画像を含める場合に用いる想定。）
		/// 未使用の場合は空でも可。nullptr チェックは不要。
		/// </summary>
		property List<System::Drawing::Rectangle>^ list描画範囲
		{
			List<System::Drawing::Rectangle>^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				return this->_list描画範囲->Get();
			}
		protected:
			void set( List<System::Drawing::Rectangle>^ value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CTexture" );
				this->_list描画範囲->Set( value );
			}
		}

		CTexture();
		CTexture( IntPtr hLockedDevice, String^ strファイル名, D3DFormat format, bool b黒を透過する );
		CTexture( IntPtr hLockedDevice, String^ strファイル名, D3DFormat format );
		CTexture( IntPtr hLockedDevice, String^ strファイル名, bool b黒を透過する );
		CTexture( IntPtr hLockedDevice, String^ strファイル名 );
		CTexture( IntPtr hLockedDevice, Bitmap^ bitmap, D3DFormat format, bool b黒を透過する );
		CTexture( IntPtr hLockedDevice, Bitmap^ bitmap, D3DFormat format );
		CTexture( IntPtr hLockedDevice, Bitmap^ bitmap, bool b黒を透過する );
		CTexture( IntPtr hLockedDevice, Bitmap^ bitmap );
		CTexture( IntPtr hLockedDevice, int n幅, int n高さ, D3DFormat format );
		CTexture( IntPtr hLockedDevice, int n幅, int n高さ );
		~CTexture();
		!CTexture();

		void t3D描画( IntPtr hLockedDevice, Matrix mat, System::Drawing::Rectangle rc画像内の描画領域 );
		void t3D描画( IntPtr hLockedDevice, Matrix mat );

		void t2D描画( IntPtr hLockedDevice, int x, int y, float depth, System::Drawing::Rectangle rc画像内の描画領域 );
		void t2D描画( IntPtr hLockedDevice, int x, int y, System::Drawing::Rectangle rc画像内の描画領域 );
		void t2D描画( IntPtr hLockedDevice, int x, int y );
		void t2D描画( IntPtr hLockedDevice, Point pt, float depth, System::Drawing::Rectangle rc画像内の描画領域 );
		void t2D描画( IntPtr hLockedDevice, Point pt, System::Drawing::Rectangle rc画像内の描画領域 );
		void t2D描画( IntPtr hLockedDevice, Point pt );

	protected:
		IDirect3DTexture9 *pTexture;

	private:
		CDisposed^ Disposed;
		CAtom<bool>^ _b加算合成;
		CAtom<int>^ _n透明度;
		CAtom<Size>^ _szテクスチャサイズ;
		CAtom<Size>^ _sz画像サイズ;
		CAtom<D3DFormat>^ _D3DFormat;
		CAtom<List<System::Drawing::Rectangle>^>^ _list描画範囲;
		System::Drawing::Rectangle rc全画像;			// テクスチャを作ったら不変。

		void t初期化();
		void tテクスチャを作成する( IntPtr hLockedDevice, String^ strファイル名, D3DFormat format, bool b黒を透過する );
		void tテクスチャを作成する( IntPtr hLockedDevice, Bitmap^ bitmap, D3DFormat format, bool b黒を透過する );
		void tテクスチャを作成する( IntPtr hLockedDevice, int n幅, int n高さ, D3DFormat format );

		Size t指定されたサイズを超えない最適なテクスチャサイズを返す( IDirect3DDevice9Ex *pDevice, Size sz指定サイズ );

		static CTexture^ t文字列テクスチャを作成する( IntPtr hDevice, String^ str文字列, Font^ ftフォント, D3DFormat TextureFormat );
		static CTexture^ t文字列テクスチャを作成する( IntPtr hDevice, String^ str文字列, D3DFormat TextureFormat );
		static CTexture^ t文字列テクスチャを作成する( IntPtr hDevice, String^ str文字列 );
	};
}
