#pragma once

//! @file Mix/Scene/IRenderer.h
//! @brief レンダラーインターフェースインクルードファイル

#include "Mix/Reference.h"
#include "Mix/Geometry/AABB.h"
#include "Mix/Scene/ISkyDome.h"
#include "Mix/Scene/IPlanter.h"

namespace Mix{ namespace Scene{

	//! @class IRenderer
	//! @brief レンダラーインターフェース
	class IRenderer : public Mix::Reference
	{
	public:
		//! @enum TYPE
		//! @brief タイプ列挙定数
		enum TYPE
		{
			//! @brief フォワード
			//! @note
			//! ディレクショナルライトによる動的シャドウマッピング。<br>
			//! １マテリアルに対して合計４つのスポットライト、ポイントライトを適用できます。
			FORWARD	= 0,
		};

		//! @struct FOG_SETTINGS
		//! @brief フォグパラメータ構造体
		struct FOG_SETTINGS
		{
			Float32 start;			//!< フォグを開始する距離
			Float32 end;			//!< フォグが終了する距離( 効果が最大 )
			Mix::Vector4 color;		//!< 色
		};

		//! @enum WIDGET_LIGHTING_MODE
		//! @brief ウィジェット : ライティングモード列挙定数
		enum WIDGET_LIGHTING_MODE
		{
			//! @brief グローバルライティングのみ
			WL_DEFAULT	= 0,
			//! @brief グローバルライティング and 全てのウィジェットをひとまとめにしたローカルライティング
			//! @note ライティングに使用されるローカルライトは４つに限定されます。
			WL_EVERYONE	= 1,
			//! @brief グローバルライティング and ウィジェット単位でのローカルライティング
			WL_DETAILED	= 3,
		};

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

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

		//! @brief タイプを取得します
		//! @return タイプを表す Mix::Scene::IRenderer::TYPE 列挙定数を返します
		virtual Mix::Scene::IRenderer::TYPE GetType( void ) const = 0;

		//! @brief レンダラーの名前を取得します
		//! @return レンダラーの名前を返します
		virtual const wchar_t* GetName( void ) const = 0;

		//! @brief レンダラーのコンフィグを取得します
		//! @return レンダラーのコンフィグを表す Mix::Scene::RENDERER_CONFIG 構造体を返します
		virtual const Mix::Scene::RENDERER_CONFIG& GetConfig( void ) const = 0;
		//! @brief レンダラーのコンフィグを設定します
		//! @param[in] cfg レンダラーのコンフィグを表す Mix::Scene::RENDERER_CONFIG 構造体
		virtual Boolean SetConfig( const Mix::Scene::RENDERER_CONFIG& cfg ) = 0;

		//! @brief ダイナミクスを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsDynamicsAvailable( void ) const = 0;
		//! @brief ウィジェットを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		//! @note ウィジェットとは、プランター、パーティクルのことを表します。
		virtual Boolean IsWidgetAvailable( void ) const = 0;
		//! @brief フォグを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsFogAvailable( void ) const = 0;
		//! @brief 大気シミュレーションを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsAtmosphereAvailable( void ) const = 0;
		//! @brief アンビエントオクルージョンを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsAmbientOcclusionAvailable( void ) const = 0;
		//! @brief シャドウマッピングを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		//! @note ディレクショナルライトが作成されていない、または無効になっている場合は False を返します。
		virtual Boolean IsShadowMappingAvailable( void ) const = 0;
		//! @brief ルミノシティを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsLuminosityAvailable( void ) const = 0;
		//! @brief ブルームを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsBloomAvailable( void ) const = 0;
		//! @brief ライトシャフトを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsLightShaftsAvailable( void ) const = 0;
		//! @brief レンズフレアを使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsLensFlareAvailable( void ) const = 0;
		//! @brief 色収差を使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsChromatismAvailable( void ) const = 0;
		//! @brief 被写界深度を使用することができるかどうかを確認します
		//! @return 使用できる場合は True を返します
		virtual Boolean IsDofAvailable( void ) const = 0;

		//! @brief 更新を行います
		//! @param[in] dt 1フレームの所要時間(秒単位)
		//! @param[in] baseDt 1フレームの固定の所要時間(秒単位)
		//! @note
		//! 現在のレンダラーの設定に基づいて、内部パラメータを求めています。<br>
		//! また、ダイナミクスワールドを作成していた場合は、このタイミングで Mix::Dynamics::IWorld::Update によりシミュレーションが行われます。<br>
		//! <br>
		//! ※パーティクル、モデルなどの更新( Update )は行っていません
		virtual void Update( Float32 dt, Float32 baseDt = 1.0f / 60.0f ) = 0;
		//! @brief リフレッシュを行います
		//! @note ※ローカルライト、パーティクル、モデルなどのリフレッシュ( Refresh )は行っていません
		virtual void Refresh( void ) = 0;

		//! @brief 描画の最適化に使用する八分木の境界を取得します
		//! @return 境界を表す Mix::Geometry::AABB クラスを返します
		virtual const Mix::Geometry::AABB& GetOctreeBounds( void ) const = 0;

		//! @}

		//! @name 環境
		//! @{

		//! @brief グローバルアンビエントカラーを取得します
		//! @return カラーを表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetGlobalAmbientColor( void ) const = 0;
		//! @brief グローバルアンビエントカラーを設定します
		//! @param[in] color カラーを表す Mix::Vector4 クラス
		//! @note
		//! 光が物体にさえぎられてできる暗い部分の色を表します。<br>
		//! また色として設定するベクトルの各要素は以下のようになります。<br>
		//! <br>
		//! xyz=色( 0.0f〜1.0f )<br>
		//! w=濃淡( 0.0f〜1.0f )
		virtual void SetGlobalAmbientColor( const Mix::Vector4& color ) = 0;

		//! @brief 環境テクスチャが存在しているかどうかを確認します
		//! @return 存在している場合は True を返します。
		virtual Boolean ExistsEnvironmentTexture( void ) const = 0;
		//! @brief 環境テクスチャを取得します。
		//! @param[out] ppTex 取得した環境テクスチャを表す Mix::Graphics::ITexture インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します。
		virtual Boolean GetEnvironmentTexture( Mix::Graphics::ITexture** ppTex ) = 0;
		//! @brief 環境テクスチャを設定します。
		//! @param[in] pTex 設定する環境テクスチャを表す Mix::Graphics::ITexture インターフェースのポインタ
		//! @note マテリアルの反射として使用される、キューブテクスチャになります。<br>
		virtual void SetEnvironmentTexture( Mix::Graphics::ITexture* pTex ) = 0;

		//! @brief フォグが有効かどうかを確認します
		//! @return 有効な場合は True を返します
		virtual Boolean IsFogEnabled( void ) const = 0;
		//! @brief フォグを有効にするかどうかを設定します
		//! @param[in] state 有効にする場合は True
		virtual void SetFogEnabled( Boolean state ) = 0;
		//! @brief フォグのパラメータを取得します
		//! @return パラメータを表す Mix::Scene::IRenderer::FOG_SETTINGS 構造体を返します
		virtual const Mix::Scene::IRenderer::FOG_SETTINGS& GetFogSettings( void ) const = 0;
		//! @brief フォグのパラメータを設定します
		//! @param[in] param パラメータを表す Mix::Scene::IRenderer::FOG_SETTINGS 構造体
		virtual void SetFogSettings( const Mix::Scene::IRenderer::FOG_SETTINGS& param ) = 0;

		//! @brief 大気スキャッターを取得します
		//! @param[out] ppAtmospherePreference 取得した大気スキャッターを渡す Mix::Scene::IAtmosphereScatter インターフェースのポインタのアドレス
		virtual void GetAtmosphereScatter( Mix::Scene::IAtmosphereScatter** ppAtmospherePreference ) = 0;

		//! @brief ダイナミクスワールドを取得します
		//! @param[out] ppDynamicsWorld 取得したダイナミクスプロパティを渡す Mix::Scene::IDynamicsWorld インターフェースのポインタのアドレス
		virtual void GetDynamicsWorld( Mix::Scene::IDynamicsWorld** ppDynamicsWorld ) = 0;

		//! @}

		//! @name カメラ
		//! @{

		//! @brief カメラの数を取得します
		//! @return カメラの数を返します
		virtual UInt32 GetCameraCount( void ) const = 0;
		//! @brief カメラを取得します
		//! @param[in] index 取得するカメラのインデックス
		//! @param[out] ppCamera 取得したカメラを渡す Mix::Scene::ICamera インターフェースのポインタのアドレス
		//! @note 取得したカメラは参照カウンタを +1 します
		virtual void GetCameraByIndex( UInt32 index, Mix::Scene::ICamera** ppCamera ) = 0;
		//! @brief カメラが存在しているかどうかを取得します
		//! @param[in] pCamera 存在確認をするカメラを表す Mix::Scene::ICamera インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsCamera( Mix::Scene::ICamera* pCamera ) const = 0;
		//! @brief カメラを追加します
		//! @param[in] pCamera 追加するカメラを表す Mix::Scene::IUniversalCamera インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 追加したカメラは参照カウンタを +1 します。
		virtual Boolean AddCamera( Mix::Scene::ICamera* pCamera ) = 0;
		//! @brief カメラを削除します
		//! @param[in] pCamera 削除するカメラを表す Mix::Scene::ICamera インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 削除したカメラは参照カウンタを -1 します
		virtual Boolean RemoveCamera( Mix::Scene::ICamera* pCamera ) = 0;
		//! @brief カメラを削除します
		//! @param[in] index 削除するカメラのインデックス
		//! @note 削除したカメラは参照カウンタを -1 します
		virtual void RemoveCameraByIndex( UInt32 index ) = 0;
		//! @brief 全てのカメラを削除します
		//! @note 削除したカメラは参照カウンタを -1 します
		virtual void RemoveAllCamera( void ) = 0;

		//! @}

		//! @name 半球ライト
		//! @{

		//! @brief 半球ライトが利用可能かどうかを取得します
		//! @return 利用可能な場合は True を返します
		virtual Boolean ExistsHemisphereLight( void ) const = 0;
		//! @brief 半球ライトを取得します
		//! @param[out] ppHemisphereLight 取得した半球ライトを渡す Mix::Scene::IHemisphereLight インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得した半球ライトは参照カウンタを +1 します
		virtual Boolean GetHemisphereLight( Mix::Scene::IHemisphereLight** ppHemisphereLight ) = 0;
		//! @brief 半球ライトを設定します
		//! @param[in] pHemisphereLight 設定した半球ライトを表す Mix::Scene::IHemisphereLight インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 直前の半球ライトは参照カウンタを -1 します。
		virtual Boolean SetHemisphereLight( Mix::Scene::IHemisphereLight* pHemisphereLight ) = 0;

		//! @}

		//! @name ディレクショナルライト
		//! @{

		//! @brief ディレクショナルライトが存在しているかどうかを取得します
		//! @return 利用可能な場合は True を返します
		virtual Boolean ExistsDirectionalLight( void ) const = 0;
		//! @brief ディレクショナルライトを取得します
		//! @param[out] ppDirectionalLight 取得したディクショナルライトを渡す Mix::Scene::IDirectionalLight インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得したディレクショナルライトは参照カウンタを +1 します
		virtual Boolean GetDirectionalLight( Mix::Scene::IDirectionalLight** ppDirectionalLight ) = 0;
		//! @brief ディレクショナルライトを設定します
		//! @param[in] pDirectionalLight 設定するディレクショナルライトを表す Mix::Scene::IDirectionalLight インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 直前のディレクショナルライトは参照カウンタを -1 します。
		virtual Boolean SetDirectionalLight( Mix::Scene::IDirectionalLight* pDirectionalLight ) = 0;

		//! @}

		//! @name スポットライト
		//! @{

		//! @brief スポットライトの数を取得します
		//! @return スポットライトの数を返します
		virtual UInt32 GetSpotLightCount( void ) const = 0;
		//! @brief スポットライトを取得します
		//! @param[in] index 取得するスポットライトのインデックス
		//! @param[out] ppSpotLight 取得したスポットライトを渡す Mix::Scene::ISpotLight インターフェースのポインタのアドレス
		virtual void GetSpotLightByIndex( UInt32 index, Mix::Scene::ISpotLight** ppSpotLight ) = 0;
		//! @brief スポットライトが存在するかどうかを取得します
		//! @param[in] pSpotLight スポットライトを表す Mix::Scene::ISpotLight インターフェースのポインタ
		//! @return 存在する場合は True を返します
		virtual Boolean ContainsSpotLight( Mix::Scene::ISpotLight* pSpotLight ) const = 0;
		//! @brief スポットライトを追加します
		//! @param[in] pSpotLight 追加するスポットライトを表す Mix::Scene::ISpotLight インターフェースのポインタ
		//! @return スポットライトの追加に成功した場合は True を返します
		//! @note 追加に成功したスポットライトは、参照カウンタを +1 します
		virtual Boolean AddSpotLight( Mix::Scene::ISpotLight* pSpotLight ) = 0;
		//! @brief スポットライトを削除します
		//! @param[in] pSpotLight 削除するスポットライトを表す Mix::Scene::ISpotLight インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したスポットライトは、参照カウンタを -1 します
		virtual Boolean RemoveSpotLight( Mix::Scene::ISpotLight* pSpotLight ) = 0;
		//! @brief スポットライトを削除します
		//! @param[in] index 削除するスポットライトのインデックス
		virtual void RemoveSpotLightByIndex( UInt32 index ) = 0;
		//! @brief 全てのスポットライトを削除します
		virtual void RemoveAllSpotLight( void ) = 0;

		//! @}

		//! @name ポイントライト
		//! @{

		//! @brief ポイントライトの数を取得します
		//! @return ポイントライトの数を返します
		virtual UInt32 GetPointLightCount( void ) const = 0;
		//! @brief ポイントライトを取得します
		//! @param[in] index 取得するポイントライトのインデックス
		//! @param[out] ppPointLight 取得したポイントライトを渡す Mix::Scene::IPointLight インターフェースのポインタのアドレス
		virtual void GetPointLightByIndex( UInt32 index, Mix::Scene::IPointLight** ppPointLight ) = 0;
		//! @brief ポイントライトが存在するかどうかを取得します
		//! @param[in] pPointLight ポイントライトを表す Mix::Scene::IPointLight インターフェースのポインタ
		//! @return 存在する場合は True を返します
		virtual Boolean ContainsPointLight( Mix::Scene::IPointLight* pPointLight ) const = 0;
		//! @brief ポイントライトを追加します
		//! @param[in] pPointLight 追加するポイントライトを表す Mix::Scene::IPointLight インターフェースのポインタ
		//! @return ポイントライトの追加に成功した場合は True を返します
		//! @note 追加に成功したポイントライトは、参照カウンタを +1 します
		virtual Boolean AddPointLight( Mix::Scene::IPointLight* pPointLight ) = 0;
		//! @brief ポイントライトを削除します
		//! @param[in] pPointLight 削除するポイントライトを表す Mix::Scene::IPointLight インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したポイントライトは、参照カウンタを -1 します
		virtual Boolean RemovePointLight( Mix::Scene::IPointLight* pPointLight ) = 0;
		//! @brief ポイントライトを削除します
		//! @param[in] index 削除するポイントライトのインデックス
		//! @note 削除に成功したポイントライトは、参照カウンタを -1 します
		virtual void RemovePointLightByIndex( UInt32 index ) = 0;
		//! @brief 全てのポイントライトを削除します
		virtual void RemoveAllPointLight( void ) = 0;

		//! @}

		//! @name スカイドーム
		//! @{

		//! @brief スカイドームが存在しているかどうかを確認します
		//! @return 存在している場合は True を返します
		virtual Boolean ExistsSkyDome( void ) const = 0;
		//! @brief スカイドームを取得します
		//! @param[out] ppSkyDome 取得したスカイドームを渡す Mix::Scene::ISkyDome インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean GetSkyDome( Mix::Scene::ISkyDome** ppSkyDome ) = 0;
		//! @brief スカイドームを設定します。
		//! @param[in] pSkyDome 設定するスカイドームを表す Mix::Scene::ISkyDome インターフェースのポインタ
		//! @return 成功した場合は True を返します
		virtual Boolean SetSkyDome( Mix::Scene::ISkyDome* pSkyDome ) = 0;

		//! @}

		//! @name ウィジェット
		//! @{

		//! @brief ウィジェットのライティングモードを取得します
		//! @return ライティングモードを表す Mix::Scene::IRenderer::WIDGET_LIGHTING_MODE 列挙定数を返します
		virtual Mix::Scene::IRenderer::WIDGET_LIGHTING_MODE GetWidgetLightingMode( void ) const = 0;
		//! @brief ウィジェットのライティングモードを設定します
		//! @param[in] mode ライティングモードを表す Mix::Scene::IRenderer::WIDGET_LIGHTING_MODE 列挙定数
		virtual void SetWidgetLightingMode( Mix::Scene::IRenderer::WIDGET_LIGHTING_MODE mode ) = 0;

		//! @}

		//! @name リービングパーティクル ( ウィジェット )
		//! @{

		//! @brief リービングパーティクルの数を取得します
		//! @return リービングパーティクルの数を返します
		virtual UInt32 GetLeavingParticleCount( void ) const = 0;
		//! @brief リービングパーティクルを取得します
		//! @param[in] index 取得するリービングパーティクルのインデックス
		//! @param[out] ppParticle 取得したリービングパーティクルを渡す Mix::Scene::IParticle インターフェースのポインタのアドレス
		//! @note 取得に成功したリービングパーティクルは、参照カウンタを +1 します
		virtual void GetLeavingParticleByIndex( UInt32 index, Mix::Scene::IParticle** ppParticle ) = 0;
		//! @brief 指定したリービングパーティクルが存在しているかどうかを取得します
		//! @param[in] pParticle リービングパーティクルを表す Mix::Scene::IParticle インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsLeavingParticle( Mix::Scene::IParticle* pParticle ) const = 0;
		//! @brief リービングリービングパーティクルを追加します
		//! @param[in] pParticle 追加するリービングリービングパーティクルを表す Mix::Scene::ILeavingParticle インターフェースのポインタ
		//! @return 追加に成功した場合は True を返します
		//! @note 追加に成功したリービングパーティクルは、参照カウンタを +1 します
		virtual Boolean AddLeavingParticle( Mix::Scene::ILeavingParticle* pParticle ) = 0;
		//! @brief リービングパーティクルを削除します
		//! @param[in] pParticle 削除するリービングパーティクルを表す Mix::Scene::IParticle インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したリービングパーティクルは、参照カウンタを -1 します
		virtual Boolean RemoveLeavingParticle( Mix::Scene::IParticle* pParticle ) = 0;
		//! @brief リービングパーティクルを削除します
		//! @param[in] index 削除するリービングパーティクルのインデックス
		//! @note 削除に成功したリービングパーティクルは、参照カウンタを -1 します
		virtual void RemoveLeavingParticleByIndex( UInt32 index ) = 0;
		//! @brief 全てのリービングパーティクルを削除します
		virtual void RemoveAllLeavingParticle( void ) = 0;

		//! @}

		//! @name スキャッターパーティクル ( ウィジェット )
		//! @{

		//! @brief スキャッターパーティクルの数を取得します
		//! @return スキャッターパーティクルの数を返します
		virtual UInt32 GetScatterParticleCount( void ) const = 0;
		//! @brief スキャッターパーティクルを取得します
		//! @param[in] index 取得するスキャッターパーティクルのインデックス
		//! @param[out] ppParticle 取得したスキャッターパーティクルを渡す Mix::Scene::IParticle インターフェースのポインタのアドレス
		//! @note 取得に成功したスキャッターパーティクルは、参照カウンタを +1 します
		virtual void GetScatterParticleByIndex( UInt32 index, Mix::Scene::IParticle** ppParticle ) = 0;
		//! @brief 指定したスキャッターパーティクルが存在しているかどうかを取得します
		//! @param[in] pParticle スキャッターパーティクルを表す Mix::Scene::IParticle インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsScatterParticle( Mix::Scene::IParticle* pParticle ) const = 0;
		//! @brief スキャッタースキャッターパーティクルを追加します
		//! @param[in] pParticle 追加するスキャッタースキャッターパーティクルを表す Mix::Scene::IScatterParticle インターフェースのポインタ
		//! @return 追加に成功した場合は True を返します
		//! @note 追加に成功したスキャッターパーティクルは、参照カウンタを +1 します
		virtual Boolean AddScatterParticle( Mix::Scene::IScatterParticle* pParticle ) = 0;
		//! @brief スキャッターパーティクルを削除します
		//! @param[in] pParticle 削除するスキャッターパーティクルを表す Mix::Scene::IParticle インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したスキャッターパーティクルは、参照カウンタを -1 します
		virtual Boolean RemoveScatterParticle( Mix::Scene::IParticle* pParticle ) = 0;
		//! @brief スキャッターパーティクルを削除します
		//! @param[in] index 削除するスキャッターパーティクルのインデックス
		//! @note 削除に成功したスキャッターパーティクルは、参照カウンタを -1 します
		virtual void RemoveScatterParticleByIndex( UInt32 index ) = 0;
		//! @brief 全てのスキャッターパーティクルを削除します
		virtual void RemoveAllScatterParticle( void ) = 0;

		//! @}

		//! @name プランター ( ウィジェット )
		//! @{

		//! @brief プランターの数を取得します
		//! @return プランターの数を返します
		virtual UInt32 GetPlanterCount( void ) const = 0;
		//! @brief プランターを取得します
		//! @param[in] index 取得するプランターのインデックス
		//! @param[out] ppPlanter 取得したプランターを渡す Mix::Scene::IPlanter インターフェースのポインタのアドレス
		virtual void GetPlanterByIndex( UInt32 index, Mix::Scene::IPlanter** ppPlanter ) = 0;
		//! @brief プランターが存在するかどうかを取得します
		//! @param[in] pPlanter プランターを表す Mix::Scene::IPlanter インターフェースのポインタ
		//! @return 存在する場合は True を返します
		virtual Boolean ContainsPlanter( Mix::Scene::IPlanter* pPlanter ) const = 0;
		//! @brief プランターを追加します
		//! @param[in] pPlanter 追加するプランターを渡す Mix::Scene::IPlanter インターフェースのポインタ
		//! @return プランターの追加に成功した場合は True を返します
		virtual Boolean AddPlanter( Mix::Scene::IPlanter* pPlanter ) = 0;
		//! @brief プランターを削除します
		//! @param[in] pPlanter 削除するプランターを表す Mix::Scene::IPlanter インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したプランターは、参照カウンタを -1 します
		virtual Boolean RemovePlanter( Mix::Scene::IPlanter* pPlanter ) = 0;
		//! @brief プランターを削除します
		//! @param[in] index 削除するプランターのインデックス
		//! @note 削除に成功したプランターは、参照カウンタを -1 します
		virtual void RemovePlanterByIndex( UInt32 index ) = 0;
		//! @brief 全てのプランターを削除します
		virtual void RemoveAllPlanter( void ) = 0;

		//! @}

		//! @name アクターモデル
		//! @{

		//! @brief アクターモデルの数を取得します
		//! @return アクターモデルの数を返します
		virtual UInt32 GetActorModelCount( void ) const = 0;
		//! @brief アクターモデルを取得します
		//! @param[in] index 取得するアクターモデルのインデックス
		//! @param[out] ppActorModel 取得したアクターモデルを渡す Mix::Scene::IActorModel インターフェースのポインタのアドレス
		//! @note 取得に成功したアクターモデルは、参照カウンタを +1 します
		virtual void GetActorModelByIndex( UInt32 index, Mix::Scene::IActorModel** ppActorModel ) = 0;
		//! @brief 指定したアクターモデルが存在しているかどうかを取得します
		//! @param[in] pActorModel アクターモデルを表す Mix::Scene::IActorModel インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsActorModel( Mix::Scene::IActorModel* pActorModel ) const = 0;
		//! @brief アクターモデルを追加します
		//! @param[in] pActorModel 追加するアクターモデルを表す Mix::Scene::IActorModel インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 追加に成功したアクターモデルは、参照カウンタを +1 します
		virtual Boolean AddActorModel( Mix::Scene::IActorModel* pActorModel ) = 0;
		//! @brief アクターモデルを削除します
		//! @param[in] pActorModel 削除するアクターモデルを表す Mix::Scene::IActorModel インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したアクターモデルは、参照カウンタを -1 します
		virtual Boolean RemoveActorModel( Mix::Scene::IActorModel* pActorModel ) = 0;
		//! @brief アクターモデルを削除します
		//! @param[in] index 削除するアクターモデルのインデックス
		//! @note 削除に成功したアクターモデルは、参照カウンタを -1 します
		virtual void RemoveActorModelByIndex( UInt32 index ) = 0;
		//! @brief 全てのアクターモデルを削除します
		virtual void RemoveAllActorModel( void ) = 0;

		//! @}

		//! @name テラインモデル
		//! @{

		//! @brief 地形モデルの数を取得します
		//! @return 地形モデルの数を返します
		virtual UInt32 GetTerrainModelCount( void ) const = 0;
		//! @brief 地形モデルを取得します
		//! @param[in] index 取得する地形モデルのインデックス
		//! @param[out] ppTerrainModel 取得した地形モデルを渡す Mix::Scene::ITerrainModel インターフェースのポインタのアドレス
		//! @note 取得に成功した地形モデルは、参照カウンタを +1 します
		virtual void GetTerrainModelByIndex( UInt32 index, Mix::Scene::ITerrainModel** ppTerrainModel ) = 0;
		//! @brief 指定した地形モデルが存在しているかどうかを取得します
		//! @param[in] pTerrainModel 地形モデルを表す Mix::Scene::ITerrainModel インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsTerrainModel( Mix::Scene::ITerrainModel* pTerrainModel ) = 0;
		//! @brief 地形モデルを追加します
		//! @param[in] pTerrainModel 追加する地形モデルを表す Mix::Scene::ITerrainModel インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 追加に成功したモ地形デルは、参照カウンタを +1 します
		virtual Boolean AddTerrainModel( Mix::Scene::ITerrainModel* pTerrainModel ) = 0;
		//! @brief 地形モデルを削除します
		//! @param[in] pTerrainModel 削除する地形モデルを表す Mix::Scene::ITerrainModel インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功した地形モデルは、参照カウンタを -1 します
		virtual Boolean RemoveTerrainModel( Mix::Scene::ITerrainModel* pTerrainModel ) = 0;
		//! @brief 地形モデルを削除します
		//! @param[in] index 削除する地形モデルのインデックス
		//! @note 削除に成功した地形モデルは、参照カウンタを -1 します
		virtual void RemoveTerrainModelByIndex( UInt32 index ) = 0;
		//! @brief 全ての地形モデルを削除します
		virtual void RemoveAllTerrainModel( void ) = 0;

		//! @}

		//! @name ライトシャフトキャスター
		//! @{

		//! @brief ライトシャフトキャスターが存在しているかどうかを確認します
		//! @return 存在している場合は True を返します
		virtual Boolean ExistsLightShaftsCaster( void ) const = 0;
		//! @brief ライトシャフトキャスターを取得します
		//! @param[out] ppLightShaftsCaster 取得したライトシャフトキャスターを渡す Mix::Scene::ILightShaftsCaster インタフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean GetLightShaftsCaster( Mix::Scene::ILightShaftsCaster** ppLightShaftsCaster ) = 0;
		//! @brief ライトシャフトキャスターを設定します
		//! @param[in] pLightShaftsCaster 設定するライトシャフトキャスターを表す Mix::Scene::ILightShaftsCaster インターフェースのポインタ
		//! @return 成功した場合は True を返します
		virtual Boolean SetLightShaftsCaster( Mix::Scene::ILightShaftsCaster* pLightShaftsCaster ) = 0;

		//! @}

		//! @name ウォータープール
		//! @{

		//! @brief ウォータープールの数を取得します
		//! @return ウォータープールの数を返します
		virtual UInt32 GetWaterPoolCount( void ) const = 0;
		//! @brief ウォータープールを取得します
		//! @param[in] index 取得するウォータープールのインデックス
		//! @param[out] ppWaterPool 取得したウォータープールを渡す Mix::Scene::IWaterPool インターフェースのポインタのアドレス
		virtual void GetWaterPoolByIndex( UInt32 index, Mix::Scene::IWaterPool** ppWaterPool ) = 0;
		//! @brief ウォータープールが存在するかどうかを取得します
		//! @param[in] pWaterPool ウォータープールを表す Mix::Scene::IWaterPool インターフェースのポインタ
		//! @return 存在する場合は True を返します
		virtual Boolean ContainsWaterPool( Mix::Scene::IWaterPool* pWaterPool ) const = 0;
		//! @brief ウォータープールを追加します
		//! @param[in] pWaterPool 追加するウォータープールを表す Mix::Scene::IWaterPool インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 追加したウォータープールは、参照カウンタを +1 します。
		virtual Boolean AddWaterPool( Mix::Scene::IWaterPool* pWaterPool ) = 0;
		//! @brief ウォータープールを削除します
		//! @param[in] pWaterPool 削除するウォータープールを表す Mix::Scene::IWaterPool インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したウォータープールは、参照カウンタを -1 します
		virtual Boolean RemoveWaterPool( Mix::Scene::IWaterPool* pWaterPool ) = 0;
		//! @brief ウォータープールを削除します
		//! @param[in] index 削除するウォータープールのインデックス
		//! @note 削除に成功したウォータープールは、参照カウンタを -1 します
		virtual void RemoveWaterPoolByIndex( UInt32 index ) = 0;
		//! @brief 全てのウォータープールを削除します
		virtual void RemoveAllWaterPool( void ) = 0;

		//! @}

		//! @name フロア
		//! @{

		//! @brief フロアが利用可能かどうかを取得します
		//! @return 利用可能な場合は True を返します
		virtual Boolean ExistsFloor( void ) const = 0;
		//! @brief フロアを取得します
		//! @param[out] ppFloor 取得したフロアを渡す Mix::Scene::IFloor インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得に成功した場合 フロアの参照カウンタを +1 します
		virtual Boolean GetFloor( Mix::Scene::IFloor** ppFloor ) = 0;
		//! @brief フロアを設定します
		//! @param[in] pFloor 設定するフロアを表す Mix::Scene::IFloor インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 設定したフロアは、参照カウンタを +1 します。
		virtual Boolean SetFloor( Mix::Scene::IFloor* pFloor ) = 0;

		//! @}

		//! @name ゴースト
		//! @{

		//! @brief ゴーストの数を取得します
		//! @return ゴーストの数を帰します
		virtual UInt32 GetGhostCount( void ) const = 0;
		//! @brief ゴーストを取得します
		//! @param[in] index 取得するゴーストのインデックス
		//! @param[out] ppGhost 取得したゴーストを渡す Mix::Scene::IGhost インターフェースのポインタのアドレス
		//! @note 取得に成功したゴーストは、参照カウンタを +1 します
		virtual void GetGhostByIndex( UInt32 index, Mix::Scene::IGhost** ppGhost ) = 0;
		//! @brief 指定したゴーストが存在しているかどうかを取得します
		//! @param[in] pGhost ゴーストを表す Mix::Scene::IGhost インターフェースのポインタ
		//! @return 存在している場合は True を返します
		virtual Boolean ContainsGhost( Mix::Scene::IGhost* pGhost ) const = 0;
		//! @brief ゴーストを追加します
		//! @param[in] pGhost 追加するゴーストを表す Mix::Scene::IGhost インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note 追加したゴーストは、参照カウンタを +1 します。
		virtual Boolean AddGhost( Mix::Scene::IGhost* pGhost ) = 0;
		//! @brief ゴーストを削除します
		//! @param[in] pGhost 削除するゴーストを表す Mix::Scene::IGhost インターフェースのポインタ
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功したゴーストは、参照カウンタを -1 します
		virtual Boolean RemoveGhost( Mix::Scene::IGhost* pGhost ) = 0;
		//! @brief ゴーストを削除します
		//! @param[in] index 削除するゴーストのインデックス
		//! @note 削除に成功したゴーストは、参照カウンタを -1 します
		virtual void RemoveGhostByIndex( UInt32 index ) = 0;
		//! @brief 全てのゴーストを削除します
		virtual void RemoveAllGhost( void ) = 0;

		//! @}

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

		//! @brief プロファイルを取得します
		//! @param[in] type タイプを表す Mix::Scene::DEBUG_PROFILE_TYPE 列挙定数
		//! @param[out] pProf プロファイルのコピー先のポインタ
		//! @param[in] size プロファイルのコピー先のサイズ
		//! @return コピーしたサイズを返します
		//! @note
		//! プロファイルのタイプとコピー先になる構造体の組み合わせは以下のようになります。<br>
		//! <table>
		//!   <tr>
		//!     <th>タイプ</th>
		//!     <th>構造体</th>
		//!   </tr>
		//!   <tr>
		//!     <td>DPT_GENERAL</td>
		//!     <td>DEBUG_PROFILE_RENDERER_GENERAL</td>
		//!   </tr>
		//!   <tr>
		//!     <td>DPT_DYNAMICS</td>
		//!     <td>DEBUG_PROFILE_RENDERER_DYNAMICS</td>
		//!   </tr>
		//!   <tr>
		//!     <td>DPT_OCTREE</td>
		//!     <td>DEBUG_PROFILE_RENDERER_OCTREE</td>
		//!   </tr>
		//! </table>
		virtual UInt32 Debug_GetProfile( UInt32 type, void* pProf, UInt32 size ) const = 0;

		//! @brief 描画用のパースペクティブレンダラーを取得します
		//! @param[out] ppPerspectiveRenderer 取得したたパースペクティブレンダラーを渡す Mix::Graphics::Utility::IPerspectiveRenderer インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean Debug_GetPerspectiveRenderer( Mix::Graphics::Utility::IPerspectiveRenderer** ppPerspectiveRenderer ) = 0;
		//! @brief 描画用のパースペクティブレンダラーを設定します
		//! @param[in] pPerspectiveRenderer 設定するパースペクティブレンダラーを渡す Mix::Graphics::Utility::IPerspectiveRenderer インターフェースのポインタのアドレス
		//! @note
		//! このメソッドで設定されたパースペクティブレンダラーの描画は Mix::Scene::ICamera::Draw で行われます。<br>
		//! 外部から IPerspectiveRenderer::Update IPerspectiveRenderer::Draw を呼び出す必要はありません。
		virtual void Debug_SetPerspectiveRenderer( Mix::Graphics::Utility::IPerspectiveRenderer* pPerspectiveRenderer ) = 0;

		//! @brief 描画用のキャンバスレンダラーを取得します
		//! @param[out] ppCanvasRenderer 取得したキャンバスレンダラーを渡す Mix::Graphics::Utility::ICanvasRenderer インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean Debug_GetCanvasRenderer( Mix::Graphics::Utility::ICanvasRenderer** ppCanvasRenderer ) = 0;
		//! @brief 描画用のキャンバスレンダラーを設定します
		//! @param[in] pCanvasRenderer キャンバスレンダラーを表す Mix::Graphics::Utility::ICanvasRenderer インターフェースのポインタ
		//! このメソッドで設定されたキャンバスレンダラーの描画は Mix::Scene::ICamera::Draw で行われます。<br>
		//! 外部からパースペクティブレンダラーの ICanvasRenderer::Update ICanvasRenderer::Draw を呼び出す必要はありません。<br>
		//! また、行列、クリップはスタックを空( DrainMatrix DrainClip )にして、初期化しますので注意してください。
		virtual void Debug_SetCanvasRenderer( Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer ) = 0;

		//! @}
	};

}}
