#pragma once

//! @file Mix/Dynamics/ICompoundShape.h
//! @brief コンパウンドシェイプインターフェースインクルードファイル

#include "Mix/Dynamics/IShape.h"

namespace Mix{ namespace Dynamics{

	//! @class ICompoundShape
	//! @brief コンパウンドシェイプインターフェース
	//! @note
	//! 複数のシェイプを結合して一つのシェイプとして扱います。<br>
	//! <br>
	//! リジッドボディ( Mix::Dynamics::IRigidBody )にすでに設定されている場合でも、追加、削除、姿勢の更新などが行えてしまうため、<br>
	//! 以下のメソッドを使用した場合は、必ず UpdateLocalInertia を呼び出して、慣性テンソルを更新してください。<br>
	//! <br>
	//! AddChild<br>
	//! RemoveChildByIndex<br>
	//! RemoveChild<br>
	//! UpdateChildTransform<br>
	class ICompoundShape : public Mix::Dynamics::IShape
	{
	protected:
		//! @brief デストラクタ
		virtual ~ICompoundShape( void ){}

	public:
		//! @brief 子を追加します
		//! @param[in] pShape 追加するシェイプを表す  Mix::Dynamics::IShape インターフェースのポインタ
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		//! @return 成功した場合は True を返します
		//! @note 追加した子は、参照カウンタを +1 します
		virtual Boolean AddChild( Mix::Dynamics::IShape* pShape, const Mix::Quaternion& rot, const Mix::Vector3& pos ) = 0;
		//! @brief 子を削除します
		//! @param[in] pShape 削除する子を表す Mix::Dynamics::IShape インターフェースのポインタ
		//! @note 削除した子は、参照カウンタを -1 します
		virtual UInt32 RemoveChild( Mix::Dynamics::IShape* pShape ) = 0;
		//! @brief 子を削除します
		//! @param[in] index 削除する子のインデックス
		//! @note 削除した子は、参照カウンタを -1 します
		virtual Boolean RemoveChildByIndex( UInt32 index ) = 0;

		//! @brief 子を取得します
		//! @param[in] index 子のインデックス
		//! @param[out] ppShape 取得した子を表す Mix::Dynamics::IShape インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		//! @note 取得した子は、参照カウンタを +1 します
		virtual Boolean GetChildByIndex( UInt32 index, Mix::Dynamics::IShape** ppShape ) = 0;
		//! @brief 子のポインタを取得します
		//! @param[in] index 子のインデックス
		//! @return 取得に成功した場合は、Mix::Dynamics::IShape インターフェースのポインタを返します
		//! 失敗した場合は NULL を返します
		virtual Mix::Dynamics::IShape* GetChildPtrByIndex( UInt32 index ) const = 0;

		//! @brief 子の位置、回転姿勢を取得します
		//! @param[in] index 子のインデックス
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		//! @return 成功した場合は True を返します
		virtual Boolean GetChildTransformByIndex( UInt32 index, Mix::Quaternion& rot, Mix::Vector3& pos ) = 0;
		//! @brief 子の位置と回転姿勢を更新します
		//! @param[in] index 子のインデックス
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		//! @return 成功した場合は True を返します
		virtual Boolean SetChildTransformByIndex( UInt32 index, const Mix::Quaternion& rot, const Mix::Vector3& pos ) = 0;

		//! @brief 子の数を取得します
		//! @return 子の数を返します
		virtual UInt32 GetChildCount( void ) const = 0;
	};

}}
