#pragma once

//! @file Mix/Scene/IDynamicsObject.h
//! @brief ダイナミクスオブジェクトインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Scene{

	//! @class IDynamicsObject
	//! @brief ダイナミクスオブジェクトインターフェース
	class IDynamicsObject : public Mix::Reference
	{
	public:
		//! @enum TYPE
		//! @brief タイプ列挙定数
		enum TYPE
		{
			UNDEFINED					= 0,	//!< 定義されていないダイナミクスオブジェクト
			SIMPLE_COLLIDER				= 1,	//!< シンプルコライダー
			LIBERTY_COLLIDER			= 2,	//!< リバティコライダー
			ACTOR_COLLIDER				= 3,	//!< アクターコライダー
			TERRAIN_COLLIDER			= 4,	//!< テラインコライダー
			SIMPLE_SENSOR				= 5,	//!< シンプルセンサー
			ACTOR_SENSOR				= 6,	//!< アクターセンサー
			SIMPLE_KINEMATIC_CHARACTER	= 7,	//!< シンプルキネマティックキャラクター
			ACTOR_KINEMATIC_CHARACTER	= 8,	//!< アクターキネマティックキャラクター
		};

	protected:
		//! @brief デストラクタ
		virtual ~IDynamicsObject( void ) {}

	public:
		//! @brief 種類を取得します
		//! @return 種類を表す Mix::Scene::IDynamicsObject::TYPE 列挙定数を返します
		virtual Mix::Scene::IDynamicsObject::TYPE GetType( void ) const = 0;

		//! @brief オーナーを取得します
		//! @param[out] ppOwner 取得したオーナーを渡す Mix::Scene::IRendererObject インターフェースのポインタのアドレス
		virtual Boolean GetOwner( Mix::Scene::IRendererObject** ppOwner ) = 0;
		//! @brief オーナーのポインタを取得します
		//! @return オーナーのポインタを表す Mix::Scene::IRendererObject インターフェースのポインタを返します
		virtual Mix::Scene::IRendererObject* GetOwnerPtr( void ) const = 0;

		//! @brief ワールド行列を取得します
		//! @return ワールド行列を表す Mix::Matrix4x4 クラスを返します
		virtual Mix::Matrix4x4 GetWorldMatrix( void ) const = 0;
		//! @brief ワールドの回転を取得します
		//! @return ワールドの回転を表す Mix::Quaternion クラスを返します
		virtual Mix::Quaternion GetWorldRotation( void ) const = 0;
		//! @brief ワールドの位置を取得します
		//! @return ワールドの位置を表す Mix::Vector3 クラスを返します
		virtual Mix::Vector3 GetWorldPosition( void ) const = 0;

		//! @brief コンタクトリスナーを所持しているかどうかを取得します
		//! @return コンタクトリスナーを所持している場合は True を返します
		virtual Boolean HasContactListener( void ) const = 0;
		//! @brief 指定したコンタクトリスナーが存在しているかどうかを確認します
		//! @param[in] pListener 確認するコンタクトリスナーを表す Mix::Scene::IContactListener インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsContactListener( Mix::Scene::IContactListener* pListener ) const = 0;
		//! @brief コンタクトリスナーを追加します
		//! @param[in] pListener 追加するコンタクトリスナーを表す Mix::Scene::IContactListener インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 追加したコンタクトリスナーは参照カウンタを +1 します
		virtual Boolean AddContactListener( Mix::Scene::IContactListener* pListener ) = 0;
		//! @brief コンタクトリスナーを削除します
		//! @param[in] pListener 削除するコンタクトリスナーを表す Mix::Scene::IContactListener インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 削除したコンタクトリスナーは参照カウンタを -1 します
		virtual Boolean RemoveContactListener( Mix::Scene::IContactListener* pListener ) = 0;
		//! @brief 全てのコンタクトリスナーを削除します
		//! @note 削除したコンタクトリスナーは参照カウンタを -1 します
		virtual void ClearContactListener( void ) = 0;

		//! @brief ユーザーインデックスを取得します
		//! @return インデックスを返します
		virtual Int32 GetUserIndex( void )  const = 0;
		//! @brief ユーザーインデックスを設定します
		//! @param index インデックス
		//! @note この値はユーザーが自由に使用できます
		virtual void SetUserIndex( Int32 index ) = 0;

		//! @brief ユーザーポインタを取得します
		//! @return ポインタを返します
		virtual void* GetUserPtr( void ) const = 0;
		//! @brief ユーザーポインタを設定します
		//! @param pData ポインタ
		//! @note この値はユーザーが自由に使用できます
		virtual void SetUserPtr( void* pData ) = 0;
	};

}}
