#pragma once

//! @file Mix/Scene/ILocalLight.h
//! @brief ローカルライトインターフェースインクルードファイル

#include "Mix/Scene/ILight.h"
#include "Mix/Geometry/Sphere.h"

namespace Mix{ namespace Scene{

	//! @class ILocalLight
	//! @brief ローカルライトインターフェース
	class ILocalLight : public Mix::Scene::ILight
	{
	protected:
		//! @brief デストラクタ
		virtual ~ILocalLight( void ) {}

	public:
		//! @brief 色を取得します
		//! @return 色を表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetColor( void ) const = 0;
		//! @brief ライトの色を設定します
		//! @param[in] color ライトの色を表す Mix::Vector4 クラス
		virtual void SetColor( const Mix::Vector4& color ) = 0;

		//! @brief 線形減衰係数を取得します
		//! @return 線形減衰係数を返します
		virtual Float32 GetLinearAttenuation( void ) const = 0;
		//! @brief 2次減衰係数を取得します
		//! @return 2次減衰係数を返します
		virtual Float32 GetQuadraticAttenuation( void ) const = 0;
		//! @brief 指数減衰係数を取得します
		//! @return 指数減衰係数を返します
		virtual Float32 GetExponentAttenuation( void ) const = 0;
		//! @brief 減衰係数を設定します
		//! @param[in] l 線形減衰係数( 0.0f〜正の無限大 )
		//! @param[in] q 2次減衰係数( 0.0f〜正の無限大 )
		//! @param[in] e 指数減衰係数( 0.0f〜正の無限大 )
		//! @note 減衰値の式 l + q * d + e * d2 ( d=頂点からライトまでの距離 d2=d*d )
		virtual void SetAttenuation( Float32 l, Float32 q, Float32 e ) = 0;

		//! @brief 位置を取得します
		//! @return 位置を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetPosition( void ) const = 0;
		//! @brief 位置を設定します
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		//! @note 位置を変更した場合は、リフレッシュ( Refresh )してください。
		virtual void SetPosition( const Mix::Vector3& pos ) = 0;

		//! @brief リフレッシュします
		//! @note 位置を変更した場合に実行してください。
		virtual void Refresh( void ) = 0;

		//! @brief 境界を取得します
		//! @return 境界を表す Mix::Geometry::Sphere クラスを返します
		virtual const Mix::Geometry::Sphere& GetBounds() const = 0;

		//! @brief イリーガルかどうかを確認します
		//! @return イリーガルな場合は True を返します
		//! @note
		//! イリーガルとはシーンレンダラーの作成時の設定( Mix::Scene::RENDERER_CONFIG )にある、八分木の範囲を超えていることを表します。<br>
		//! また、この状態になった場合は、位置を再設定するか、シーンレンダラーから削除することを推奨します。
		virtual Boolean IsIllegal( void ) const = 0;
	};

}}
