#pragma once

namespace Mix{ namespace Tool{ namespace Dynamics{ namespace Design{

	public ref class BoundingBox abstract
	{
	protected:
		Mix::Tool::Win32::Graphics::BASE_SHAPE* implBoundingBox;
		bool m_bInternalImpl;
		int m_Depth;

	internal:
		BoundingBox( int depth );
		BoundingBox( Mix::Tool::Win32::Graphics::BASE_SHAPE* _implBoundingBox );
		virtual ~BoundingBox( void );

		property Mix::Tool::Win32::Graphics::BASE_SHAPE* Impl
		{
			Mix::Tool::Win32::Graphics::BASE_SHAPE* get( void );
		}

	public:
		property System::String^ Name
		{
			System::String^ get( void );
		}

		property Mix::Tool::Math::Vector^ DegreeRotation
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		property Mix::Tool::Math::Quaternion^ Rotation
		{
			Mix::Tool::Math::Quaternion^ get( void );
		}

		property Mix::Tool::Math::Vector^ Position
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		property Mix::Tool::Math::Vector^ HalfExtents
		{
			Mix::Tool::Math::Vector^ get( void );
		}

		property int Depth
		{
			int get( void );
		}

		property bool IsAvailableDescend
		{
			virtual bool get( void ) abstract;
		}

		virtual Mix::Tool::Dynamics::Design::BoundingBox^ Descend( int depth ) abstract;
	};

	public ref class BoundingBoxCollection : public System::Collections::IEnumerable
	{
	protected:
		System::Collections::Generic::List<Mix::Tool::Dynamics::Design::BoundingBox^>^ m_List;

	internal:
		BoundingBoxCollection( void );
		~BoundingBoxCollection( void );

	public:
		property int Count
		{
			int get( void );
		}

		property Mix::Tool::Dynamics::Design::BoundingBox^ default[int]
		{
			Mix::Tool::Dynamics::Design::BoundingBox^ get( int index );
		}

		property System::Collections::IList^ DataSource
		{
			System::Collections::IList^ get( void );
		}

		int IndexOfName( System::String^ name );

	public:
		virtual System::Collections::IEnumerator^ GetEnumerator( void );
	};

}}}}
