#pragma once

//! @file Mix/Scene/IGhost.h
//! @brief ゴーストインターフェースインクルードファイル

#include "Mix/Scene/IRendererObject.h"

namespace Mix{ namespace Scene{

	//! @class IGhost
	//! @brief ゴーストインターフェース
	class IGhost : public Mix::Scene::IRendererObject
	{
	protected:
		//! @brief デストラクタ
		virtual ~IGhost( void ) {}

	public:
		//! @brief ダイナミクスオブジェクトを取得します
		//! @param[out] ppDynamicsObject 取得したダイナミクスオブジェクトを渡す Mix::Scene::IDynamiscObject インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		//! @note 取得したダイナミクスオブジェクトは参照カウンタを +1 します
		virtual Boolean GetDynamicsObject( Mix::Scene::IDynamicsObject** ppDynamicsObject ) = 0;

		//! @brief ワールドの回転を取得します
		//! @return 回転を表す Mix::Quaternion クラスを返します
		virtual Mix::Quaternion GetWorldRotation( void ) const = 0;
		//! @brief ワールドの回転を設定します
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		virtual void SetWorldRotation( const Mix::Quaternion& rot ) = 0;

		//! @brief ワールドの位置を取得します
		//! @return 回転を表す Mix::Vector3 クラスを返します
		virtual Mix::Vector3 GetWorldPosition( void ) const = 0;
		//! @brief ワールドの位置を設定します
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		virtual void SetWorldPosition( const Mix::Vector3& pos ) = 0;

		//! @brief ワールド行列を取得します
		//! @return 行列を表す Mix::Matrix4x4 クラスを返します
		virtual Mix::Matrix4x4 GetWorldMatrx( void ) const = 0;
		//! @brief ワールド行列を設定します
		//! @param[in] mat 行列を表す Mix::Matrix4x4 クラス
		virtual void SetWorldMatrix( const Mix::Matrix4x4& mat ) = 0;

		//! @brief リフレッシュが必要がどうかを確認します
		//! @return リフレッシュが必要な場合は True を返します
		//! @note
		//! キネマティックゴーストの場合のみ True を返します。<br>
		//! それ以外の場合は False を返します
		virtual Boolean NeedsRefresh( void ) const = 0;
		//! @brief リフレッシュします
		//! @note
		//! キネマティックゴーストのみの処理になります。<br>
		//! また、このメソッドは Mix::Scene::IRenderer::Update より後に呼び出す必要があります。
		virtual void Refresh( 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;

		//! @brief デバッグ : 軸を描画する際のを取得します
		//! @return 軸を描画する際のスケールを返します
		virtual Float32 Debug_GetDrawAxisScaling( void ) const = 0;
		//! @brief デバッグ : 軸を描画する際のスケールを設定します
		//! @param[in] scaling 軸を描画する際のスケール( 0.0f以上 )
		virtual void Debug_SetDrawAxisScaling( Float32 scaling ) = 0;
	};

}}
