#pragma once

//! @file Mix/Scene/IDirectionalLight.h
//! @brief ディレクショナルライトインターフェースインクルードファイル

#include "Mix/Scene/ILight.h"

namespace Mix{ namespace Scene{

	//! @class IDirectionalLight
	//! @brief ディレクショナルライトインターフェース
	//! @note
	//! 位置情報がなく方向のみの指向性ライトです。<br>
	//! また、シャドウマッピング( 投影 ) をすることができるライトでもあります。
	class IDirectionalLight : public Mix::Scene::ILight
	{
	public:
		//! @struct PROJECTION
		//! @brief 投影構造体
		struct PROJECTION
		{
			Float32 nearClip;			//!< 投影する際の手前のクリップ距離( 0.0f〜正の無限大 )
			Float32 castPadding;		//!< 投影する境界のパディング( 0.0f〜正の無限大 )
			Float32 errValue;			//!< 投影方向と視線の角度の誤差( 0.0f〜1.0f )
		};

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

	public:
		//! @name 全般
		//! @{

		//! @brief 方向を取得します
		//! @return 方向を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetDirection( void ) const = 0;
		//! @brief 方向を設定します
		//! @param dir 方向を表す Mix::Vector3 クラス
		virtual void SetDirection( const Mix::Vector3& dir ) = 0;

		//! @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 設定を表す Mix::Scene::IDirectionalLight::PROJECTION 構造体を返します
		virtual const Mix::Scene::IDirectionalLight::PROJECTION& GetProjection( void ) const = 0;
		//! @brief 投影を設定します
		//! @note シャドウマッピングの基本設定になります。
		virtual void SetProjection( const Mix::Scene::IDirectionalLight::PROJECTION& proj ) = 0;

		//! @}

		//! @name デバッグ
		//! @{

		//! @brief 描画するラインの長さを取得します
		//! @return 長さを返します
		virtual Float32 Debug_GetDrawLength( void ) const = 0;
		//! @brief 描画するラインの長さを設定します
		//! @param[in] len 長さ
		virtual void Debug_SetDrawLength( Float32 len ) = 0;

		//! @}
	};

}}
