/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_SceneEnvironmentSetting.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. 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. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_SCENEENVIRONMENTSETTING_H_ #define NW_GFX_SCENEENVIRONMENTSETTING_H_ #include #include #include #include namespace nw { namespace gfx { class Fog; class Camera; class LightSet; //--------------------------------------------------------------------------- //! @brief シーン環境設定を表すクラスです。 //--------------------------------------------------------------------------- class SceneEnvironmentSetting : public SceneObject { private: NW_DISALLOW_COPY_AND_ASSIGN(SceneEnvironmentSetting); public: NW_UT_RUNTIME_TYPEINFO; //! @brief ライトセットをバインドするための構造体です。 struct LightSetBinder { LightSetBinder() : index(-1) {} s32 index; GfxPtr lightSet; }; //! @brief カメラをバインドするための構造体です。 struct CameraBinder { CameraBinder() : index(-1), camera(NULL) {} s32 index; Camera* camera; }; //! @brief フォグをバインドするための構造体です。 struct FogBinder { FogBinder() : index(-1), fog(NULL) {} s32 index; Fog* fog; }; typedef ut::MoveArray LightSetBinderArray; typedef ut::MoveArray CameraBinderArray; typedef ut::MoveArray FogBinderArray; //! @brief 設定内容です。 struct Description { //! @brief コンストラクタです。 Description(){} }; //---------------------------------------- //! @name 作成/破棄 //@{ //! @brief シーン環境設定を生成します。 //! //! @param[in] resource リソースです。 //! @param[in] description 設定内容です。 //! @param[in] allocator アロケータです。 //! //! @return 生成したシーン環境設定です。 //! static SceneEnvironmentSetting* Create( ResSceneObject resource, const SceneEnvironmentSetting::Description& description, os::IAllocator* allocator); //! @brief 生成時に必要なメモリサイズを取得します。 //! //! @param[in] resource リソースです。 //! @param[in] description 設定内容です。 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 static size_t GetMemorySize( ResSceneEnvironmentSetting resource, Description description, size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT ) { os::MemorySizeCalculator size(alignment); GetMemorySizeInternal(&size, resource, description); return size.GetSizeWithPadding(alignment); } //! @details :private static void GetMemorySizeInternal( os::MemorySizeCalculator* pSize, ResSceneEnvironmentSetting resource, Description description); //@} //---------------------------------------- //! @name 更新 //@{ //! @brief シーンコンテキストを用いて参照解決を行います。 //! //! @param[in] sceneContext 参照解決に用いるシーンコンテキストです。 //! void ResolveReference(const SceneContext& sceneContext); //! @brief 参照解決したシーン環境設定をクリアします。 //! SceneContext を変更して再度 ResolveReference を行う場合に用いて下さい。 //! void Clear(); //@} //---------------------------------------- //! @name 取得/設定 //@{ //! @brief リソースを取得します。 //! //! @return ResSceneEnvironmentSetting です。 //! ResSceneEnvironmentSetting GetResSceneEnvironmentSetting() { return ResDynamicCast(this->GetResSceneObject()); } //! @brief リソースを取得します。 //! //! @return ResSceneEnvironmentSetting です。 //! const ResSceneEnvironmentSetting GetResSceneEnvironmentSetting() const { return ResDynamicCast(this->GetResSceneObject()); } //! @brief カメラの先頭を指すイテレータを取得します。 //! //! @return カメラの先頭を指すイテレータです。 //! CameraBinderArray::iterator GetCameraBegin() { return m_Cameras.begin(); } //! @brief カメラの先頭を指すイテレータを取得します。 //! //! @return カメラの先頭を指すイテレータです。 //! CameraBinderArray::const_iterator GetCameraBegin() const { return m_Cameras.begin(); } //! @brief カメラの終端を指すイテレータを取得します。 //! //! @return カメラの終端を指すイテレータです。 //! CameraBinderArray::iterator GetCameraEnd() { return m_Cameras.end(); } //! @brief カメラの終端を指すイテレータを取得します。 //! //! @return カメラの終端を指すイテレータです。 //! CameraBinderArray::const_iterator GetCameraEnd() const { return m_Cameras.end(); } //! @brief フォグの先頭を指すイテレータを取得します。 //! //! @return フォグの先頭を指すイテレータです。 //! FogBinderArray::iterator GetFogBegin() { return m_Fogs.begin(); } //! @brief フォグの先頭を指すイテレータを取得します。 //! //! @return フォグの先頭を指すイテレータです。 //! FogBinderArray::const_iterator GetFogBegin() const { return m_Fogs.begin(); } //! @brief フォグの終端を指すイテレータを取得します。 //! //! @return フォグの終端を指すイテレータです。 //! FogBinderArray::iterator GetFogEnd() { return m_Fogs.end(); } //! @brief フォグの終端を指すイテレータを取得します。 //! //! @return フォグの終端を指すイテレータです。 //! FogBinderArray::const_iterator GetFogEnd() const { return m_Fogs.end(); } //! @brief ライトセットの先頭を指すイテレータを取得します。 //! //! @return ライトセットの先頭を指すイテレータです。 //! LightSetBinderArray::iterator GetLightSetBegin() { return m_LightSets.begin(); } //! @brief ライトセットの先頭を指すイテレータを取得します。 //! //! @return ライトセットの先頭を指すイテレータです。 //! LightSetBinderArray::const_iterator GetLightSetBegin() const { return m_LightSets.begin(); } //! @brief ライトセットの終端を指すイテレータを取得します。 //! //! @return ライトセットの終端を指すイテレータです。 //! LightSetBinderArray::iterator GetLightSetEnd() { return m_LightSets.end(); } //! @brief ライトセットの終端を指すイテレータを取得します。 //! //! @return ライトセットの終端を指すイテレータです。 //! LightSetBinderArray::const_iterator GetLightSetEnd() const { return m_LightSets.end(); } //@} protected: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 SceneEnvironmentSetting( os::IAllocator* allocator, ResSceneEnvironmentSetting resSetting, const SceneEnvironmentSetting::Description& description ) : SceneObject(allocator, resSetting) { NW_UNUSED_VARIABLE(description); } //! デストラクタです。 virtual ~SceneEnvironmentSetting() {} //@} private: //! シーン環境の配列を作成します。 void CreateEnvironmentArray(os::IAllocator* allocator, ResSceneEnvironmentSetting ); //! @brief ResReferenceSceneObject の名前比較用構造体です。 template struct SceneObjectCompare: public std::unary_function { SceneObjectCompare(ResReferenceSceneObject referenceSceneObject): m_Object(referenceSceneObject){} ResReferenceSceneObject m_Object; bool operator()(TObject* lhs) const { if (lhs->GetName() != NULL && m_Object.GetPath() != NULL && std::strcmp(lhs->GetName(), m_Object.GetPath()) == 0) { return true; } return false; } }; LightSetBinderArray m_LightSets; CameraBinderArray m_Cameras; FogBinderArray m_Fogs; }; } // namespace gfx } // namespace nw #endif // NW_GFX_SCENEENVIRONMENTSETTING_H_