/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_SceneEnvironmentSetting.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: 21233 $ *---------------------------------------------------------------------------*/ #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); //@} //---------------------------------------- //! @name 更新 //@{ //! @brief シーンコンテキストを用いて参照解決を行います。 //! //! @param[in] sceneContext 参照解決に用いるシーンコンテキストです。 //! void ResolveReference(const SceneContext& sceneContext); //@} //---------------------------------------- //! @name 取得/設定 //@{ //! リソースを取得します。 ResSceneEnvironmentSetting GetResSceneEnvironmentSetting() { return ResDynamicCast(this->GetResSceneObject()); } //! リソースを取得します。 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); this->CreateEnvironmentArray(allocator, resSetting); } //! デストラクタです。 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_