#pragma once

//! @file Mix/Scene/IActorNode.h
//! @brief アクターノードインターフェースインクルードファイル

#include "Mix/Scene/INode.h"

namespace Mix{ namespace Scene{

	//! @class IActorNode
	//! @brief アクターノードインターフェース
	class IActorNode : public Mix::Scene::INode
	{
	protected:
		//! @brief デストラクタ
		virtual ~IActorNode( void ){}

	public:
		//! @brief オーナーを取得します
		//! @param[out] ppOwner オーナーを表す Mix::Scene::IActorModel インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得したオーナーは参照カウンタを +1 します
		virtual Boolean GetOwner( Mix::Scene::IActorModel** ppOwner ) = 0;
		//! @brief オーナーのポインタを取得します
		//! @return オーナーを表す Mix::Scene::IActorModel インターフェースのポインタを返します
		virtual Mix::Scene::IActorModel* GetOwnerPtr( void ) const = 0;

		//! @brief 親のインデックスを取得します。
		//! @return 親が存在する場合は 0 以上のインデックス、それ以外の場合は -1 を返します。
		virtual Int32 GetParentIndex( void ) const = 0;

		//! @brief 名前を取得します
		//! @return 名前を返します
		virtual const wchar_t* GetName( void ) const = 0;

		//! @brief ローカル行列を初期値にリセットします
		virtual void ResetLocalMatrix( void ) = 0;

		//! @brief 描画が有効かどうかを取得します
		//! @return 描画が有効になっている場合は True を返します
		virtual Boolean IsDraw( void ) const = 0;
		//! @brief 描画を有効にするかどうかを設定します
		//! @param[in] state 描画を有効にする場合は True
		//! @param[in] depth 適用するノードの深さ( 0で自身のみ設定 )
		virtual void SetDraw( Boolean state, UInt32 depth = 0xFFFFFFFF ) = 0;

		//! @brief コライダーが利用可能かどうかを取得します
		//! @return 利用可能な場合は True を返します
		virtual Boolean ExistsCollider( void ) const = 0;
		//! @brief コライダーを取得します
		//! @param[out] ppCollider 取得したコライダーを渡す Mix::Scene::IActorCollider インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		virtual Boolean GetCollider( Mix::Scene::IActorCollider** ppCollider ) = 0;

		//! @brief センサーの数を取得します
		//! @return センサーの数を返します
		virtual UInt32 GetSensorCount( void ) const = 0;
		//! @brief センサーを取得します
		//! @param[in] index 取得するセンサーのインデックス
		//! @param[out] ppSensor 取得したセンサーを渡す Mix::Scene::IActorSensor インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		virtual Boolean GetSensor( UInt32 index, Mix::Scene::IActorSensor** ppSensor ) = 0;

		//! @brief コンストレイントを取得します
		//! @param[in] pName コンストレイントの名前
		//! @param[out] ppConstraint 取得したコンストレイントを渡す Mix::Scene::IActorConstraint インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得に成功した場合は コンストレイントの参照カウンタを +1 します
		virtual Boolean GetConstraint( const wchar_t* pName, Mix::Scene::IActorConstraint** ppConstraint ) = 0;
		//! @brief コンストレイントを追加します
		//! @param[in] pName コンストレイントの名前
		//! @param[out] ppConstraint 追加したコンストレイントを渡す Mix::Scene::IActorConstraint インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean AddConstraint( const wchar_t* pName, Mix::Scene::IActorConstraint** ppConstraint ) = 0;
		//! @brief コンストレイントを削除します
		//! @param[in] pConstraint 削除するコンストレイントを表す Mix::Scene::IActorConstraint インターフェースのポインタ
		//! @note 削除に成功した場合は コンストレイントの参照カウンタを -1 します
		virtual void RemoveConstraint( Mix::Scene::IActorConstraint* pConstraint ) = 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;
	};

}}
