#pragma once

//! @file Mix/Scene/IAtmosphereScatter.h
//! @brief 大気スキャッターインターフェースインクルードファイル

#include "Mix/Scene/IRendererObject.h"

namespace Mix{ namespace Scene{

	//! @class IAtmosphereScatter
	//! @brief 大気スキャッターインターフェース
	class IAtmosphereScatter : public Mix::Scene::IRendererObject
	{
	public:
		//! @struct DAY_SETTINGS
		//! @brief 昼セッティング構造体
		struct DAY_SETTINGS
		{
			Float32 sunIntensity;		//!< 太陽の強度( 0.0f〜正の無限大 )
			Float32 sunTurbidity;		//!< 太陽の消滅度( 0.0f〜4.0f )
			Float32 henyeyGreenstein;	//!< HenyeyGreenstein係数( 0.0f〜1.0f ) 
			Float32 rayleigh;			//!< Rayleigh係数( 0.0f〜正の無限大 ) 
			Float32 mie;				//!< Mie係数( 0.0f〜正の無限大 )

			//! @brief Lin係数( 0.0f〜正の無限大 )
			//! @note
			//! 太陽光が大気を通過してくる量を意味します。<br>
			//! 値が大きいほど明るく、小さいほど暗くなります。 
			Float32 lin;

			//! @brief Fex係数( 0.0f〜1.0f )
			//! @note
			//! 太陽光を受けた地表が反射するRGB成分を意味します。<br>
			//! <br>
			//! fex.xyz : RGB成分の反射率<br>
			//! fex.w : RGB成分の倍率( fex.xyz * fex.w )
			Mix::Vector4 fex;
		};

		//! @struct NIGHT_SETTINGS
		//! @brief 夜セッティング構造体
		struct NIGHT_SETTINGS
		{
			Mix::Vector4 color;	//!< 夜空の色
			Float32 threshold;	//!< 夜へと変化を始める角度( COS値 )
			Float32 offset;		//!< 夜に変化し終わる threshold からのオフセット( 0.0f 以上 )
		};

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

	public:
		//! @brief 昼の設定を取得します
		//! @return 設定を表す Mix::Scene::IAtmosphereScatter::DAY_SETTINGS 構造体を返します
		virtual const Mix::Scene::IAtmosphereScatter::DAY_SETTINGS& GetDaySettings( void ) const = 0;
		//! @brief 昼を設定します
		//! @param[in] settings 設定を表す Mix::Scene::IAtmosphereScatter::DAY_SETTINGS 構造体
		virtual void SetDaySettings( const Mix::Scene::IAtmosphereScatter::DAY_SETTINGS& settings ) = 0;

		//! @brief 夜の設定を取得します
		//! @return 設定を表す Mix::Scene::IAtmosphereScatter::NIGHT_SETTINGS 構造体を返します
		virtual const Mix::Scene::IAtmosphereScatter::NIGHT_SETTINGS& GetNightSettings( void ) const = 0;
		//! @brief 夜を設定します
		//! @param[in] settings 設定を表す Mix::Scene::IAtmosphereScatter::NIGHT_SETTINGS 構造体
		virtual void SetNightSettings( const Mix::Scene::IAtmosphereScatter::NIGHT_SETTINGS& settings ) = 0;

		//! @brief 太陽の色を取得します
		//! @return 色を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetSunColor( void ) const = 0;
		//! @brief 太陽による照明の色を取得します
		//! @return 色を表す Mix::Vector4 クラスを返します
		//! @note
		//! 返される色は以下のようにして求められています。<br>
		//! <br>
		//! RGB=GetSunColor();<br>
		//! A=GetSunColor().GetLength();<br>
		virtual const Mix::Vector4& GetSunLightColor( void ) const = 0;
	};

}}
