#pragma once


#include "Mix/Tool/CLR/Core/Dynamics/CollisionObject.h"

using namespace System::ComponentModel;

namespace Mix{ namespace Tool{ namespace Win32{ namespace Dynamics{
	class KinematicCharacter;
}}}}

namespace Mix{ namespace Tool{ namespace Dynamics{

	ref class PhysicsMaterial;

	public ref class KinematicCharacter : public Mix::Tool::Dynamics::CollisionObject
	{
	private:
		Mix::Tool::Win32::Dynamics::KinematicCharacter* impl;
		bool m_bInternalImpl;
		Mix::Tool::Dynamics::PhysicsMaterial^ m_PhysicsMaterial;

	internal:
		KinematicCharacter( Mix::Tool::Win32::Dynamics::KinematicCharacter* _impl );

		property Mix::Tool::Win32::Dynamics::KinematicCharacter* ImplW32KinematicCharacter
		{
			Mix::Tool::Win32::Dynamics::KinematicCharacter* get( void );
		}

	public:
		KinematicCharacter( void );
		~KinematicCharacter( void );

		[Category("\t\t形状")]
		[Description( L"カプセルの高さを指定します。" )]
		property float Height
		{
			float get( void );
			void set( float value );
		}

		[Category("\t\t形状")]
		[Description( L"カプセルの半径を指定します。" )]
		property float Radius
		{
			float get( void );
			void set( float value );
		}

		[Category("\t動作")]
		[Description( L"重力を指定します。" )]
		property float Gravity
		{
			float get( void );
			void set( float value );
		}

		[Category("\t動作")]
		[Description( L"最大落下速度を指定します。" )]
		property float MaxFallSpeed
		{
			float get( void );
			void set( float value );
		}

		[Category("\t動作")]
		[Description( L"ジャンプの初速を指定します。" )]
		property float InitJumpSpeed
		{
			float get( void );
			void set( float value );
		}

		[Category("\t動作")]
		[Description( L"上れる段差の高さを指定します。" )]
		property float StepOffset
		{
			float get( void );
			void set( float value );
		}

		[Category("\t動作")]
		[Description( L"上れる勾配の角度を指定します。" )]
		property float SlopeLimit
		{
			float get( void );
			void set( float value );
		}

		[Browsable(false)]
		property Mix::Tool::Dynamics::PhysicsMaterial^ PhysicsMaterial
		{
			Mix::Tool::Dynamics::PhysicsMaterial^ get( void );
			void set( Mix::Tool::Dynamics::PhysicsMaterial^ value );
		}

		[Browsable(false)]
		property bool IsGround
		{
			bool get( void );
		}

		void Jump( void );

	private:
		void PhysicsMaterial_ValueChanged( System::Object^ sender, System::EventArgs^ e );

	internal:
		property Mix::Tool::Win32::Dynamics::CollisionObject* Impl
		{
			virtual Mix::Tool::Win32::Dynamics::CollisionObject* get( void ) override;
		}
	};

}}}
