#pragma once

using namespace System;

namespace Mix{ namespace Tool{ namespace Win32{ namespace Graphics{
	class Camera;
}}}}

namespace Mix{ namespace Tool{ namespace Graphics{

	public ref class Camera
	{
	public:
		enum class FillModes
		{
			Wireframe,
			Solid,
		};

		[Flags]
		enum class DrawTypes
		{
			Grid				= 0x00000001,
			Light				= 0x00000002,

			Body				= 0x00000004,
			ViewVolume			= 0x00000008,
			Bone				= 0x00000010,

			KinematicCharacter	= 0x00000020,
			Collision			= 0x00000040,
			Joint				= 0x00000080,

			FramesPerSec		= 0x00000100,
			PrimitiveCount		= 0x00000200,

			None				= 0x00000000,
			Default				= 0x00000007,
			All					= 0x000003FF,
		};

	internal:
		Mix::Tool::Win32::Graphics::Camera* impl;

	public:
		/// <summary>
		/// コンストラクタ
		/// </summary>
		Camera( System::Windows::Forms::Control^ targetControl );
		/// <summary>
		/// デストラクタ
		/// </summary>
		~Camera( void );

		/// <summary>
		/// 背面が選択できるかどうか取得、または設定
		/// </summary>
		property bool InvisibleSelection
		{
			bool get( void );
			void set( bool value );
		}

		/// <summary>
		/// フィルモードの取得、または設定
		/// </summary>
		property Mix::Tool::Graphics::Camera::FillModes FillMode
		{
			Mix::Tool::Graphics::Camera::FillModes get( void );
			void set( Mix::Tool::Graphics::Camera::FillModes value );
		}

		/// <summary>
		/// 描画タイプの取得、または設定
		/// </summary>
		property Mix::Tool::Graphics::Camera::DrawTypes DrawType
		{
			Mix::Tool::Graphics::Camera::DrawTypes get( void );
			void set( Mix::Tool::Graphics::Camera::DrawTypes value );
		}

		/// <summary>
		/// ターゲットとのデフォルト距離の取得、または設定
		/// </summary>
		property float DefaultDistance
		{
			float get( void );
			void set( float value );
		}

		/// <summary>
		/// ターゲットとの距離の取得、または設定
		/// </summary>
		property float Distance
		{
			float get( void );
			void set( float value );
		}

		/// <summary>
		/// 姿勢の取得、または設定
		/// </summary>
		property Mix::Tool::Math::Vector^ Pose
		{
			Mix::Tool::Math::Vector^ get( void );
			void set( Mix::Tool::Math::Vector^ value );
		}

		/// <summary>
		/// ターゲットの取得、または設定
		/// </summary>
		property Mix::Tool::Math::Vector^ Target
		{
			Mix::Tool::Math::Vector^ get( void );
			void set( Mix::Tool::Math::Vector^ value );
		}

		/// <summary>
		/// ローカル位置の取得
		/// </summary>
		property Mix::Tool::Math::Vector^ LocalPosition
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		/// <summary>
		/// 位置の取得
		/// </summary>
		property Mix::Tool::Math::Vector^ Position
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		/// <summary>
		/// 方向の取得
		/// </summary>
		property Mix::Tool::Math::Vector^ Direction
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		/// <summary>
		/// 初期化します
		/// </summary>
		void Initialize( Mix::Tool::Math::Vector^ localPos, Mix::Tool::Math::Vector^ target, Mix::Tool::Math::Vector^ pose );

		/// <summary>
		/// 前後移動をリセットします
		/// </summary>
		void ResetDistation( void );
		/// <summary>
		/// 前後移動をします
		/// </summary>
		void Distation( int d );
		
		/// <summary>
		/// 回転をリセットします
		/// </summary>
		void ResetRotation( void );
		/// <summary>
		/// 回転します
		/// </summary>
		void Rotation( int h, int v );

		/// <summary>
		/// 上下左右移動をリセットします
		/// </summary>
		void ResetTranslation( void );
		/// <summary>
		/// 上下左右移動をします
		/// </summary>
		void Translation( int h, int v );

		/// <summary>
		/// ライトを回転します
		/// </summary>
		void RotationLight( int h, int v );
/*
		/// <summary>
		/// 描画オブジェクトのスケーリングのセットアップを行います
		/// </summary>
		bool SetupScalingDrawObject( System::Drawing::Point^ point );
		/// <summary>
		/// 描画オブジェクトのスケーリングを行います
		/// </summary>
		void ScalingDrawObject( System::Drawing::Point^ point );

		/// <summary>
		/// 描画オブジェクトのローテーションを行います
		/// </summary>
		void RotationDrawObject( int h, int v );

		/// <summary>
		/// 描画オブジェクトのトランスレーションを行います
		/// </summary>
		void TranslationDrawObject( int h, int v );
*/
		/// <summary>
		/// 描画オブジェクトのメッシュを選択( オブジェクトメッシュのみ )します
		/// </summary>
		unsigned int SelectDrawObjectMesh( System::Drawing::Point^ point );

		/// <summary>
		/// スクリーン座標をワールド空間へ変換します
		/// </summary>
		Mix::Tool::Math::Vector^ Unproject( Mix::Tool::Math::Vector^ point );
	};

}}}
