#pragma once

//! @file Mix/Sound/IEmitter.h
//! @brief エミッターインターフェスインクルードファイル

#include "Mix/Sound/IDevice.h"

namespace Mix{ namespace Sound{

	//! @class IEmitter
	//! @brief エミッターインターフェース
	class IEmitter : public Mix::Sound::IDevice
	{
	protected:
		//! @brief デストラクタ
		virtual ~IEmitter( void ){}

	public:
		//! @brief ローカルの前方ベクトルを取得します
		//! @return ローカルの前方ベクトルを表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLocalFront( void ) const = 0;
		//! @brief ローカルの上方ベクトルを取得します
		//! @return ローカルの上方ベクトルを表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLocalUp( void ) const = 0;

		//! @brief ワールドの前方ベクトルを取得します
		//! @return ワールドの前方ベクトルを表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetWorldFront( void ) const = 0;
		//! @brief ワールドの上方ベクトルを取得します
		//! @return ワールドの上方ベクトルを表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetWorldUp( void ) const = 0;

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

		//! @brief 毎秒の移動速度を取得します
		//! @return 毎秒の移動速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetVelocity( void ) const = 0;
		//! @brief 毎秒の移動速度を設定します
		//! @param[in] velocity 毎秒の移動速度を表す Mix::Vector3 クラス
		//! @note ドップラー効果に影響を与えます。
		virtual void SetVelocity( const Mix::Vector3& velocity ) = 0;

		//! @brief チャンネル数を取得します
		//! @return チャンネル数を返します
		virtual UInt32 GetChannelCount( void ) const = 0;

		//! @brief チャンネルの半径を取得します
		//! @return チャンネルの半径を返します
		virtual Float32 GetChannelRadius( void ) const = 0;
		//! @brief チャンネルの半径を設定します
		//! @param[in] radius チャンネルの半径( 0.0f〜正の無限大 )
		//! @note ワールド座標からのオフセットを意味します
		virtual void SetChannelRadius( Float32 radius ) = 0;

		//! @brief チャンネルの方位各を取得します
		//! @param[in] channel チャンネル
		//! @return チャンネルの方位各を返します
		virtual Float32 GetChannelAzimuth( UInt32 channel ) const = 0;
		//! @brief チャンネルの方位各を設定します
		//! @param[in] channel チャンネル
		//! @param[in] azimuth 方位各( 0.0f〜MIX_2PI )
		//! @note 上方ベクトルを軸とした回転を意味します
		virtual void SetChannelAzimuth( UInt32 channel, Float32 azimuth ) = 0;

		//! @brief ドップラー効果のスケーラーを取得します
		//! @return スケーラーを返します
		virtual Float32 GetDopplerScaler( void ) const = 0;
		//! @brief ドップラー効果のスケーラーを設定します
		//! @param[in] scaler スケーラー( 0.0f〜正の無限大 )
		virtual void SetDopplerScaler( Float32 scaler ) = 0;

		//! @brief 更新します
		//! @note リスナー( Mix::Sound::IListener )のパラメータが変更された場合もこのメソッドを実行する必要があります
		virtual void Update( void ) = 0;

		//! @brief 複製できるかどうかを取得します
		//! @return 複製できる場合は True を返します
		virtual Boolean IsCloneable( void ) const = 0;
		//! @brief 自身を複製します
		//! @param[out] ppEmitter 複製したエミッターを渡す Mix::Sound::IEmitter インターフェースのポインタのアドレス
		virtual Boolean Clone( Mix::Sound::IEmitter** ppEmitter ) = 0;
	};

}}
