#pragma once

//! @file Mix/Dynamics/IObjectDragger.h
//! @brief オブジェクトドラッガーインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Dynamics{

	//! @class IObjectDragger
	//! @brief オブジェクドラッガートインターフェース
	class IObjectDragger : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IObjectDragger( void ) {}

	public:
		//! @brief キャッチするオブジェクトが存在するワールドを取得します
		//! @param[out] ppWorld ワールドを表す Mix::Dynamics::IWorld インターフェースのポインタのアドレス
		virtual void GetWorld( Mix::Dynamics::IWorld** ppWorld ) = 0;

		//! @brief キャッチする際のフィルターを取得します
		//! @return フィルターを返します
		virtual UInt16 GetCatchFilter( void ) const = 0;
		//! @brief キャッチする際のフィルターを設定します
		//! @param[in] filter フィルター
		//! @note 設定する値はダイナミクスのワールドにオブジェクトを追加する際に設定したフィルターグループになります
		virtual void SetCatchFilter( UInt16 filter ) = 0;

		//! @brief オブジェクトをキャッチしているかどうかを取得します
		//! @return キャッチしている場合は True を返します
		virtual Boolean IsCatch( void ) const = 0;
		//! @brief キャッチしているオブジェクトを取得します
		//! @param[out] ppObject キャッチしているオブジェクトを表す Mix::Dynamics::IObject インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean GetCatchObject( Mix::Dynamics::IObject** ppObject ) = 0;

		//! @brief ワールドのオブジェクトをキャッチします
		//! @param[in] eyePos 視点を表す Mix::Vector3 クラス
		//! @param[in] rayFrom 交差判定を行うレイの始点を表す Mix::Vector3 クラス
		//! @param[in] rayTo 交差判定を行うレイの終点を表す Mix::Vector3 クラス
		//! @return 成功した場合は True を返します
		//! @note キャッチできるオブジェクトはリジッドボディに限定されます
		virtual Boolean CatchStart( const Mix::Vector3& eyePos, const Mix::Vector3& rayFrom, const Mix::Vector3& rayTo ) = 0;
		//! @brief 更新を行います
		//! @param[in] eyePos 視点を表す Mix::Vector3 クラス
		//! @param[in] rayTo 交差判定を行うレイの終点を表す Mix::Vector3 クラス
		//! @note キャッチしている最中は常に呼び出す必要があります
		virtual void CatchContinue( const Mix::Vector3& eyePos, const Mix::Vector3& rayTo ) = 0;
		//! @brief キャッチしているオブジェクトを解放します
		virtual void Free( void ) = 0;
	};

}}
