/*---------------------------------------------------------------------------* Project: NintendoWare File : gfx_SceneEnvironment.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 25355 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_SCENEENVIRONMENT_H_ #define NW_GFX_SCENEENVIRONMENT_H_ #include #include #include #include namespace nw { namespace gfx { class FragmentLight; class VertexLight; class AmbientLight; class Fog; class HemiSphereLight; class Camera; //--------------------------------------------------------------------------- //! @brief シーン環境を表すクラスです。 //! //! RenderEnvironment は廃止され、SceneEnvironment に変更されました。 //--------------------------------------------------------------------------- class SceneEnvironment { public: //! @brief シーン環境への設定内容です。 struct Description { CameraArray cameras; FogArray fogs; LightSetArray lightSets; VertexLightArray vertexLights; }; //! コンストラクタです。 SceneEnvironment(const Description& description) : m_AmbientLight(NULL), m_HemiSphereLight(NULL), m_VertexLights(description.vertexLights), m_Fog(NULL), m_Camera(NULL), m_Cameras(description.cameras), m_CameraIndex(-1), m_Fogs(description.fogs), m_LightSets(description.lightSets), m_LightSetIndex(-1), m_ActiveVertexLightCount(0), m_ActiveFragmentLightCount(0), m_FragmentLightsDirty(true), m_AmbientLightDirty(true), m_VertexLightsDirty(true), m_HemiSphereLightDirty(true), m_FogDirty(true), m_CameraDirty(true) { m_FragmentLights.resize(m_FragmentLights.capacity()); m_VertexLights.resize(m_VertexLights.capacity()); m_Cameras.resize(m_Cameras.capacity()); std::fill(m_Cameras.begin(), m_Cameras.end(), static_cast(NULL)); m_Fogs.resize(m_Fogs.capacity()); std::fill(m_Fogs.begin(), m_Fogs.end(), static_cast(NULL)); m_LightSets.resize(m_LightSets.capacity()); std::fill(m_LightSets.begin(), m_LightSets.end(), static_cast(NULL)); } //---------------------------------------- //! @name シーン環境設定関連 //@{ //! @brief シーン環境設定からシーン環境を適用します。 //! //! @param[in] setting 適用するシーン環境設定です。 //! void ApplyFrom(const SceneEnvironmentSetting& setting); //! @brief シーン環境をクリアします。 void ClearSettings(); //! @brief フォグ配列にフォグを設定します。 //! //! @param[in] index 設定するインデクスです。 //! @param[in] fog 設定するフォグです。 //! void SetFog(s32 index, Fog* fog) { NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size()); m_Fogs[index] = fog; } //! @brief フォグ配列からフォグを取得します。 //! //! @param[in] index 取得するインデクスです。 //! Fog* GetFog(s32 index) { NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size()); return m_Fogs[index]; } //! @brief フォグ配列からフォグを取得します。 //! //! @param[in] index 取得するインデクスです。 //! const Fog* GetFog(s32 index) const { NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size()); return m_Fogs[index]; } //! @brief カメラ配列にカメラを設定します。 //! //! @param[in] index 設定するインデックスです。 //! @param[in] camera 設定するカメラです。 //! void SetCamera(int index, Camera* camera) { NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size()); m_Cameras[index] = camera; } //! @brief カメラ配列からカメラを取得します。 //! //! @param[in] index 取得するカメラのインデックスです。 //! Camera* GetCamera(int index) { NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size()); return m_Cameras[index]; } //! @brief カメラ配列からカメラを取得します。 //! //! @param[in] index 取得するカメラのインデックスです。 //! const Camera* GetCamera(int index) const { NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size()); return m_Cameras[index]; } //! @brief ライトセット配列にライトセットを設定します。 //! //! @param[in] index 設定するインデックスです。 //! @param[in] lightSet 設定するカメラです。 //! void SetLightSet(int index, LightSet* lightSet) { NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size()); m_LightSets[index] = lightSet; } //! @brief ライトセット配列からライトセットを取得します。 //! //! @param[in] index 取得するライトセットのインデックスです。 //! LightSet* GetLightSet(int index) { NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size()); return m_LightSets[index]; } //! @brief ライトセットの配列からライトセットを取得します。 //! //! @param[in] index 取得するライトセットのインデックスです。 //! const LightSet* GetLightSet(int index) const { NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size()); return m_LightSets[index]; } //@} //---------------------------------------- //! @name ライト関連 //@{ //! @brief フラグメントライトを設定します。 //! //! 全種類の光源はディレクションの方向をライトの向きとするように //! しています。 //! 平行光源ではポジションの値は参照しません。 //! //! OpenGL では、平行光源はポジションのパラメータを //! 逆向きにしたベクトルをディレクションとして扱いますが、 //! ディレクションのパラメータそのまま扱うようにしてあります。 //! //! @param[in] light 設定するフラグメントライトです。 //! void SetFragmentLight(FragmentLight* light) { if (this->m_ActiveFragmentLightCount == LIGHT_COUNT) { return; } m_FragmentLights[m_ActiveFragmentLightCount] = (light); ++m_ActiveFragmentLightCount; } //! @brief フラグメントライトの数を取得します。 //! s32 GetFragmentLightCount() const { return this->m_ActiveFragmentLightCount; } //! @brief 設定されているフラグメントライトを取得します。 //! //! @param[in] index 取得するフラグメントライトのインデクスです。 //! //! @return フラグメントライトのポインタを返します。 const FragmentLight* GetFragmentLight(int index) const { NW_MINMAXLT_ASSERT(index, 0, this->m_ActiveFragmentLightCount); return this->m_FragmentLights[ index ]; } //! @brief 頂点ライトを設定します。 //! //! 全種類の光源はディレクションの方向をライトの向きとするように //! しています。 //! 平行光源ではポジションの値は参照しません。 //! //! OpenGL では、平行光源はポジションのパラメータを //! 逆向きにしたベクトルをディレクションとして扱いますが、 //! ディレクションのパラメータそのまま扱うようにしてあります。 //! //! @param[in] light 設定する頂点ライトです。 //! void SetVertexLight(VertexLight* light) { if (m_ActiveVertexLightCount == m_VertexLights.capacity()) { return; } this->m_VertexLights[m_ActiveVertexLightCount] = light; ++m_ActiveVertexLightCount; } //! @brief 設定されている頂点ライトを取得します。 //! //! @param[in] index 取得する頂点ライトのインデクスです。 //! //! @return 頂点ライトのポインタを返します。 const VertexLight* GetVertexLight(int index) const { NW_MINMAXLT_ASSERT(index, 0, this->m_ActiveVertexLightCount); return this->m_VertexLights[ index ]; } //! @brief 頂点ライトの数を取得します。 //! s32 GetVertexLightCount() const { return this->m_ActiveVertexLightCount; } //! @brief アンビエントライトを設定します。 //! //! @param[in] ambientLight 設定するアンビエントライトです。 //! void SetAmbientLight(AmbientLight* ambientLight) { this->m_AmbientLight = ambientLight; } //! @brief 設定されているアンビエントライトを取得します。 //! //! @return アンビエントライトのポインタを返します。 const AmbientLight* GetAmbientLight() const { return this->m_AmbientLight; } //! @brief 半球ライトを設定します。 //! //! @param[in] hemiSphereLight 設定する半球ライトです。 //! void SetHemiSphereLight(HemiSphereLight* hemiSphereLight) { this->m_HemiSphereLight = hemiSphereLight; } //! @brief 半球ライトを取得します。 //! //! @return 半球ライトです。 //! const HemiSphereLight* GetHemiSphereLight() const { return this->m_HemiSphereLight; } //! @brief 有効なライトセットを設定します。 //! //! @return ライトセットのインデクスです。 //! void SetActiveLightSet(int index); //@} //---------------------------------------- //! @name フォグ関連 //@{ //! @brief インデックスを指定してフォグを有効にします。 //! //! @param[in] index 設定するフォグのインデックス番号です。 //! void SetActiveFog(int index) { NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size()); Fog* fog = m_Fogs[index]; if (this->m_Fog != fog) { this->m_Fog = fog; this->m_FogDirty = true; } } //! @brief 有効なフォグを取得します。 //! //! @return フォグです。 //! Fog* GetActiveFog() { return this->m_Fog; } //! @brief 有効なフォグを取得します。 //! //! @return フォグです。 //! const Fog* GetActiveFog() const { return this->m_Fog; } //@} //---------------------------------------- //! @name カメラ関連 //@{ //! @brief インデックスを指定してカメラを有効にします。 //! 1.2.0 で廃止予定となります。 //! RenderContext::SetActiveCamera を呼び出すようにしてください。 //! //! @param[in] index 設定するカメラのインデックス番号です。 //! NW_DEPRECATED_FUNCTION(void SetActiveCamera(int index)) { NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size()); Camera* camera = m_Cameras[index]; m_CameraIndex = index; if (this->m_Camera != camera) { this->m_Camera = camera; this->m_CameraDirty = true; // wScale を設定します。 GraphicsDevice::SetWScale(camera->GetWScale()); } } //! @brief 現在有効なカメラを取得します。 //! 1.2.0 で廃止予定となります。 //! RenderContext::GetActiveCamera を呼び出すようにしてください。 NW_DEPRECATED_FUNCTION(Camera* GetActiveCamera()) { return this->m_Camera; } //! @brief 現在有効なカメラを取得します。 //! 1.2.0 で廃止予定となります。 //! RenderContext::GetActiveCamera を呼び出すようにしてください。 NW_DEPRECATED_FUNCTION(const Camera* GetActiveCamera() const) { return this->m_Camera; } //! @brief 現在有効なカメラインデクスを取得します。 //! 1.2.0 で廃止予定となります。 //! RenderContext::GetActiveCameraIndex を呼び出すようにしてください。 NW_DEPRECATED_FUNCTION(s32 GetActiveCameraIndex() const) { return this->m_CameraIndex; } //@} //---------------------------------------- //! @name フラグ関連 //@{ //! @brief フラグメントライトを設定しなおすかどうかを表すフラグを取得します。 //! 暫定的な機能となります。 bool IsFragmentLightsDirty() const { return m_FragmentLightsDirty; } //! @brief フラグメントライトを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetFragmentLightsDirty(bool fragmentLightsDirty) { m_FragmentLightsDirty = fragmentLightsDirty; } //! @brief アンビエントライトを設定しなおすかどうかを表すフラグを取得します。 //! 暫定的な機能となります。 bool IsAmbientLightDirty() const { return m_AmbientLightDirty; } //! @brief アンビエントライトを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetAmbientLightDirty(bool ambientLightDirty) { m_AmbientLightDirty = ambientLightDirty; } //! @brief 頂点ライトを設定しなおすかどうかを表すフラグを取得します。 //! 暫定的な機能となります。 bool IsVertexLightsDirty() const { #if defined(NW_GFX_VERTEX_LIGHT_ENABLED) return m_VertexLightsDirty; #else return false; #endif } //! @brief 頂点ライトを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetVertexLightsDirty(bool vertexLightsDirty) { m_VertexLightsDirty = vertexLightsDirty; } //! @brief 半球ライトを設定しなおすかどうかを表すフラグを取得します。 //! 暫定的な機能となります。 bool IsHemiSphereLightDirty() const { return m_HemiSphereLightDirty; } //! @brief 半球ライトを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetHemiSphereLightDirty(bool hemiSphereLightDirty) { m_HemiSphereLightDirty = hemiSphereLightDirty; } //! @brief フォグを設定しなおすかどうかを表すフラグを取得します。 //! 暫定的な機能となります。 bool IsFogDirty() const { return m_FogDirty; } //! @brief フォグを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetFogDirty(bool fogDirty) { m_FogDirty = fogDirty; } //! @brief ライトやフォグを設定しなおすかどうかを表すフラグを設定します。 //! 暫定的な機能となります。 void SetAllFlagsDirty(bool flagsDirty) { m_FogDirty = flagsDirty; m_AmbientLightDirty = flagsDirty; m_FragmentLightsDirty = flagsDirty; #if defined(NW_GFX_VERTEX_LIGHT_ENABLED) m_VertexLightsDirty = flagsDirty; #endif m_HemiSphereLightDirty = flagsDirty; } //@} //---------------------------------------- //! @name ステート関連 //@{ //! @brief 全てのステートをリセットします。 void Reset(); //! @brief フラグメントライトのステートをリセットします。 void ResetFragmentLights(); //! @brief 頂点ライトのステートをリセットします。 void ResetVertexLights(); //! @brief 半球ライトのステートをリセットします。 void ResetHemiSphereLight(); //! @brief アンビエントライトのステートをリセットします。 void ResetAmbientLight(); //! @brief カメラのステートをリセットします。 //! 1.2.0 で廃止予定となります。 NW_DEPRECATED_FUNCTION(void ResetCamera()); //! @brief フォグのステートをリセットします。 void ResetFog(); //! @brief ライトセットのステートをリセットします。 void ResetLightSet(); //@} private: AmbientLight* m_AmbientLight; HemiSphereLight* m_HemiSphereLight; VertexLightArray m_VertexLights; FixedFragmentLightArray m_FragmentLights; Fog* m_Fog; Camera* m_Camera; CameraArray m_Cameras; s32 m_CameraIndex; FogArray m_Fogs; LightSetArray m_LightSets; s32 m_LightSetIndex; s32 m_ActiveVertexLightCount; s32 m_ActiveFragmentLightCount; bool m_FragmentLightsDirty; bool m_AmbientLightDirty; bool m_VertexLightsDirty; bool m_HemiSphereLightDirty; bool m_FogDirty; bool m_CameraDirty; friend class RenderContext; }; //! 互換性のための定義です。 typedef SceneEnvironment RenderEnvironment; } // namespace gfx } // namespace nw #endif // NW_GFX_SCENEENVIRONMENT_H_