/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_SceneContext.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_SCENECONTEXT_H_ #define NW_GFX_SCENECONTEXT_H_ #include namespace nw { namespace gfx { class SceneNode; class UserRenderNode; class Model; class SkeletalModel; class Light; class FragmentLight; class VertexLight; class HemiSphereLight; class AmbientLight; class Camera; class Fog; class ParticleSet; class ParticleEmitter; class ParticleModel; class LightSet; //! @brief シーンノードの Array の定義です。 typedef ut::MoveArray SceneNodeArray; //! @brief ユーザ定義の描画ノードの Array の定義です。 typedef ut::MoveArray UserRenderNodeArray; //! @brief モデルの Array の定義です。 typedef ut::MoveArray ModelArray; //! @brief スケルタルモデルの Array の定義です。 typedef ut::MoveArray SkeletalModelArray; //! @brief ライトの Array の定義です。 typedef ut::MoveArray LightArray; //! @brief フラグメントライトの Array の定義です。 typedef ut::MoveArray FragmentLightArray; //! @brief 頂点ライトの Array の定義です。 typedef ut::MoveArray VertexLightArray; //! @brief 半球ライトの Array の定義です。 typedef ut::MoveArray HemiSphereLightArray; //! @brief アンビエントライトの Array の定義です。 typedef ut::MoveArray AmbientLightArray; //! @brief カメラの Array の定義です。 typedef ut::MoveArray CameraArray; //! @brief フォグの Array の定義です。 typedef ut::MoveArray FogArray; //! @brief パーティクルセットの Array の定義です。 typedef ut::MoveArray ParticleSetArray; //! @brief パーティクルエミッタの Array の定義です。 typedef ut::MoveArray ParticleEmitterArray; //! @brief パーティクルモデルの Array の定義です。 typedef ut::MoveArray ParticleModelArray; //! @brief ライトセットの配列です。 typedef ut::MoveArray LightSetArray; //! @brief アニメーションするノードの Array の定義です。 typedef ut::MoveArray AnimatableNodeArray; //--------------------------------------------------------------------------- //! @brief シーン解析時の内容を保持させるためのクラスです。 //--------------------------------------------------------------------------- class SceneContext : public GfxObject { private: NW_DISALLOW_COPY_AND_ASSIGN(SceneContext); public: // [非推奨] 互換性のために残してありますが、こちらの定義は用いないでください。 //! @details :private typedef SceneNodeArray SceneNodeArray; //! @details :private typedef ModelArray ModelArray; //! @details :private typedef SkeletalModelArray SkeletalModelArray; //! @details :private typedef FragmentLightArray FragmentLightArray; //! @details :private typedef VertexLightArray VertexLightArray; //! @details :private typedef HemiSphereLightArray HemiSphereLightArray; //! @details :private typedef AmbientLightArray AmbientLightArray; //! @details :private typedef CameraArray CameraArray; //! @details :private typedef FogArray FogArray; //! @details :private typedef ParticleSetArray ParticleSetArray; //! @details :private typedef ParticleEmitterArray ParticleEmitterArray; //! @details :private typedef ParticleModelArray ParticleModelArray; enum { DEFAULT_MAX_SCENE_NODES = 64, //!< シーンノードのデフォルト最大数です。 DEFAULT_MAX_MODELS = 64, //!< モデルのデフォルト最大数です。 DEFAULT_MAX_SKELETAL_MODELS = 64, //!< スケルタルモデルのデフォルト最大数です。 DEFAULT_MAX_CAMERAS = 4, //!< カメラのデフォルト最大数です。 DEFAULT_MAX_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 DEFAULT_MAX_FRAGMENT_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 DEFAULT_MAX_VERTEX_LIGHTS = 8, //!< 頂点ライトのデフォルト最大数です。 DEFAULT_MAX_HEMISPHERE_LIGHTS = 4, //!< 半球ライトのデフォルト最大数です。 DEFAULT_MAX_AMBIENT_LIGHTS = 4, //!< アンビエントライトのデフォルト最大数です。 DEFAULT_MAX_FOGS = 4, //!< フォグのデフォルト最大数です。 DEFAULT_MAX_PARTICLESETS = 64, //!< パーティクルセットのデフォルト最大数です。 DEFAULT_MAX_PARTICLEEMITTERS = 64, //!< パーティクルエミッタのデフォルト最大数です。 DEFAULT_MAX_PARTICLEMODELS = 64, //!< パーティクルモデルのデフォルト最大数です。 DEFAULT_MAX_ANIMATABLE_NODES = 64, //!< アニメーションを行うシーンノードのデフォルト最大数です。 DEFAULT_MAX_USER_RENDER_NODES = 0 //!< ユーザ定義の描画ノードのデフォルト最大数です。 }; //---------------------------------------- //! @name 作成 //@{ //! @brief シーンコンテキストクラスを構築するためのクラスです。 //! //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 class Builder { public: Builder() : m_IsFixedSizeMemory(true), m_MaxSceneNodes(DEFAULT_MAX_SCENE_NODES), m_MaxUserRenderNodes(DEFAULT_MAX_USER_RENDER_NODES), m_MaxModels(DEFAULT_MAX_MODELS), m_MaxSkeletalModels(DEFAULT_MAX_SKELETAL_MODELS), m_MaxCameras(DEFAULT_MAX_CAMERAS), m_MaxLights(DEFAULT_MAX_LIGHTS), m_MaxFragmentLights(DEFAULT_MAX_FRAGMENT_LIGHTS), m_MaxVertexLights(DEFAULT_MAX_VERTEX_LIGHTS), m_MaxHemiSphereLights(DEFAULT_MAX_HEMISPHERE_LIGHTS), m_MaxAmbientLights(DEFAULT_MAX_AMBIENT_LIGHTS), m_MaxFogs(DEFAULT_MAX_FOGS), m_MaxParticleSets(DEFAULT_MAX_PARTICLESETS), m_MaxParticleEmitters(DEFAULT_MAX_PARTICLEEMITTERS), m_MaxParticleModels(DEFAULT_MAX_PARTICLEMODELS), m_MaxAnimatableNodes(DEFAULT_MAX_ANIMATABLE_NODES) {} //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 //! //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 //! //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 Builder& IsFixedSizeMemory(bool isFixedSizeMemory) { m_IsFixedSizeMemory = isFixedSizeMemory; return *this; } //! @brief シーンノードの最大数を設定します。 Builder& MaxSceneNodes(s32 max) { m_MaxSceneNodes = max; return *this; } //! @brief ユーザ定義の描画ノードの最大数を設定します。 Builder& MaxUserRenderNodes(s32 max) { m_MaxUserRenderNodes = max; return *this; } //! @brief モデルの最大数を設定します。 Builder& MaxModels(s32 max) { m_MaxModels = max; return *this; } //! @brief スケルタルモデルの最大数を設定します。 Builder& MaxSkeletalModels(s32 max) { m_MaxSkeletalModels = max; return *this; } //! @brief カメラの最大数を設定します。 Builder& MaxCameras(s32 max) { m_MaxCameras = max; return *this; } //! @brief ライトの最大数を設定します。 Builder& MaxLights(s32 max) { m_MaxLights = max; return *this; } //! @brief フラグメントライトの最大数を設定します。 Builder& MaxFragmentLights(s32 max) { m_MaxFragmentLights = max; return *this; } //! @brief 頂点ライトの最大数を設定します。 Builder& MaxVertexLights(s32 max) { m_MaxVertexLights = max; return *this; } //! @brief 半球ライトの最大数を設定します。 Builder& MaxHemiSphereLights(s32 max) { m_MaxHemiSphereLights = max; return *this; } //! @brief アンビエントライトの最大数を設定します。 Builder& MaxAmbientLights(s32 max) { m_MaxAmbientLights = max; return *this; } //! @brief フォグの最大数を設定します。 Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; } //! @brief パーティクルセットの最大数を設定します。 Builder& MaxParticleSets(s32 max) { m_MaxParticleSets = max; return *this; } //! @brief パーティクルエミッタの最大数を設定します。 Builder& MaxParticleEmitters(s32 max) { m_MaxParticleEmitters = max; return *this; } //! @brief パーティクルモデルの最大数を設定します。 Builder& MaxParticleModels(s32 max) { m_MaxParticleModels = max; return *this; } //! @brief アニメーションを行うシーンノードの最大数を設定します。 Builder& MaxAnimatableNodes(s32 max) { m_MaxAnimatableNodes = max; return *this; } //! @brief シーンコンテキストを生成します。 SceneContext* Create(os::IAllocator* allocator); private: bool m_IsFixedSizeMemory; s32 m_MaxSceneNodes; s32 m_MaxUserRenderNodes; s32 m_MaxModels; s32 m_MaxSkeletalModels; s32 m_MaxCameras; s32 m_MaxLights; s32 m_MaxFragmentLights; s32 m_MaxVertexLights; s32 m_MaxHemiSphereLights; s32 m_MaxAmbientLights; s32 m_MaxFogs; s32 m_MaxParticleSets; s32 m_MaxParticleEmitters; s32 m_MaxParticleModels; s32 m_MaxAnimatableNodes; }; //@} //---------------------------------------- //! @name 更新 //@{ //! シーン解析結果をクリアします。 void Clear() { m_SceneNodes.clear(); m_UserRenderNodes.clear(); m_Models.clear(); m_SkeletalModels.clear(); m_Lights.clear(); m_FragmentLights.clear(); m_VertexLights.clear(); m_HemiSphereLights.clear(); m_AmbientLights.clear(); m_Cameras.clear(); m_Fogs.clear(); m_ParticleSets.clear(); m_ParticleEmitters.clear(); m_ParticleModels.clear(); m_AnimatableNodes.clear(); } //@} //---------------------------------------- //! @name 取得/設定 //@{ //! @brief 直列化シーンノードを追加します。 //! //! @param[in] node 追加するシーンノードです。 //! void PushSceneNode(SceneNode* node) { bool isPushed = m_SceneNodes.push_back(node); NW_ASSERT(isPushed); } //! @brief 直列化シーンノードを追加します。 //! //! @param[in] node 追加するシーンノードです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushSceneNode(SceneNode* node) { bool isPushed = m_SceneNodes.push_back(node); return isPushed; } //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 //! //! @return シーンノードの先頭を指すイテレータです。 //! SceneNodeArray::iterator GetSceneNodesBegin() { return m_SceneNodes.begin(); } //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 //! //! @return シーンノードの先頭を指すイテレータです。 //! SceneNodeArray::const_iterator GetSceneNodesBegin() const { return m_SceneNodes.begin(); } //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 //! //! @return シーンノードの終端を指すイテレータです。 //! SceneNodeArray::iterator GetSceneNodesEnd() { return m_SceneNodes.end(); } //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 //! //! @return シーンノードの終端を指すイテレータです。 //! SceneNodeArray::const_iterator GetSceneNodesEnd() const { return m_SceneNodes.end(); } //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 //! //! @return シーンノードの先頭と終端を指すイテレータです。 //! std::pair GetSceneNodes() { return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); } //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 //! //! @return シーンノードの先頭と終端を指すイテレータです。 //! std::pair GetSceneNodes() const { return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); } //@} //---------------------------------------- //! @name UserRenderNode 関連 //@{ //! @brief 直列化ユーザ定義の描画ノードを追加します。 //! //! @param[in] node 追加するユーザ定義の描画ノードです。 //! void PushUserRenderNode(UserRenderNode* node) { bool isPushed = m_UserRenderNodes.push_back(node); NW_ASSERT(isPushed); } //! @brief 直列化ユーザ定義の描画ノードを追加します。 //! //! @param[in] node 追加するユーザ定義の描画ノードです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushUserRenderNode(UserRenderNode* node) { bool isPushed = m_UserRenderNodes.push_back(node); return isPushed; } //! @brief 直列化したユーザ定義の描画ノードの先頭を指すイテレータを取得します。 //! //! @return UserRenderNode の先頭を指すイテレータです。 //! UserRenderNodeArray::iterator GetUserRenderNodesBegin() { return m_UserRenderNodes.begin(); } //! @brief 直列化したユーザ定義の描画ノードの先頭を指すイテレータを取得します。 //! //! @return ユーザ定義の描画ノードの先頭を指すイテレータです。 //! UserRenderNodeArray::const_iterator GetUserRenderNodesBegin() const { return m_UserRenderNodes.begin(); } //! @brief 直列化したユーザ定義の描画ノードの終端を指すイテレータを取得します。 //! //! @return ユーザ定義の描画ノードの終端を指すイテレータです。 //! UserRenderNodeArray::iterator GetUserRenderNodesEnd() { return m_UserRenderNodes.end(); } //! @brief 直列化したユーザ定義の描画ノードの終端を指すイテレータを取得します。 //! //! @return ユーザ定義の描画ノードの終端を指すイテレータです。 //! UserRenderNodeArray::const_iterator GetUserRenderNodesEnd() const { return m_UserRenderNodes.end(); } //! @brief 直列化したユーザ定義の描画ノードの先頭と終端を指すイテレータを取得します。 //! //! @return ユーザ定義の描画ノードの先頭と終端を指すイテレータです。 //! std::pair GetUserRenderNodes() { return std::make_pair(m_UserRenderNodes.begin(), m_UserRenderNodes.end()); } //! @brief 直列化したユーザ定義の描画ノードの先頭と終端を指すイテレータを取得します。 //! //! @return ユーザ定義の描画ノードの先頭と終端を指すイテレータです。 //! std::pair GetUserRenderNodes() const { return std::make_pair(m_UserRenderNodes.begin(), m_UserRenderNodes.end()); } //@} //---------------------------------------- //! @name モデル関連 //@{ //! @brief モデルを追加します。 //! 「モデル」には、派生クラス(SkeletalModelなど)も含まれます。 //! //! @param[in] model モデルです。 //! void PushModel(Model* model) { bool isPushed = m_Models.push_back(model); NW_ASSERT(isPushed); } //! @brief モデルを追加します。 //! 「モデル」には、派生クラス(SkeletalModelなど)も含まれます。 //! //! @param[in] model モデルです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushModel(Model* model) { bool isPushed = m_Models.push_back(model); return isPushed; } //! @brief モデルの先頭を指すイテレータを取得します。 //! //! @return モデルの先頭を指すイテレータです。 //! ModelArray::iterator GetModelsBegin() { return m_Models.begin(); } //! @brief モデルの先頭を指すイテレータを取得します。 //! //! @return モデルの先頭を指すイテレータです。 //! ModelArray::const_iterator GetModelsBegin() const { return m_Models.begin(); } //! @brief モデルの終端を指すイテレータを取得します。 //! //! @return モデルの終端を指すイテレータです。 //! ModelArray::iterator GetModelsEnd() { return m_Models.end(); } //! @brief モデルの終端を指すイテレータを取得します。 //! //! @return モデルの終端を指すイテレータです。 //! ModelArray::const_iterator GetModelsEnd() const { return m_Models.end(); } //! @brief スケルタルモデルを追加します。 //! //! @param[in] skeletalModel スケルタルモデルです。 //! void PushSkeletalModel(SkeletalModel* skeletalModel) { bool isPushed = m_SkeletalModels.push_back(skeletalModel); NW_ASSERT(isPushed); } //! @brief スケルタルモデルを追加します。 //! //! @param[in] skeletalModel スケルタルモデルです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushSkeletalModel(SkeletalModel* skeletalModel) { bool isPushed = m_SkeletalModels.push_back(skeletalModel); return isPushed; } //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 //! //! @return スケルタルモデルの先頭を指すイテレータです。 //! SkeletalModelArray::iterator GetSkeletalModelsBegin() { return m_SkeletalModels.begin(); } //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 //! //! @return スケルタルモデルの先頭を指すイテレータです。 //! SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const { return m_SkeletalModels.begin(); } //! @brief スケルタルモデルの終端を指すイテレータを取得します。 //! //! @return スケルタルモデルの終端を指すイテレータです。 //! SkeletalModelArray::iterator GetSkeletalModelsEnd() { return m_SkeletalModels.end(); } //! @brief スケルタルモデルの終端を指すイテレータを取得します。 //! //! @return スケルタルモデルの終端を指すイテレータです。 //! SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const { return m_SkeletalModels.end(); } //@} //---------------------------------------- //! @name ライト関連 //@{ //! @brief ライトを追加します。 //! 「ライト」には、派生クラス(FragmentLightなど)も含まれます。 //! //! @param[in] light ライトです。 //! void PushLight(Light* light) { bool isPushed = m_Lights.push_back(light); NW_ASSERT(isPushed); } //! @brief ライトを追加します。 //! 「ライト」には、派生クラス(FragmentLightなど)も含まれます。 //! //! @param[in] light ライトです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushLight(Light* light) { bool isPushed = m_Lights.push_back(light); return isPushed; } //! @brief ライトの先頭を指すイテレータを取得します。 //! //! @return ライトの先頭を指すイテレータです。 //! LightArray::iterator GetLightsBegin() { return m_Lights.begin(); } //! @brief ライトの先頭を指すイテレータを取得します。 //! //! @return ライトの先頭を指すイテレータです。 //! LightArray::const_iterator GetLightsBegin() const { return m_Lights.begin(); } //! @brief ライトの終端を指すイテレータを取得します。 //! //! @return ライトの終端を指すイテレータです。 //! LightArray::iterator GetLightsEnd() { return m_Lights.end(); } //! @brief ライトの終端を指すイテレータを取得します。 //! //! @return ライトの終端を指すイテレータです。 //! LightArray::const_iterator GetLightsEnd() const { return m_Lights.end(); } //! @brief フラグメントライトを追加します。 //! //! @param[in] light フラグメントライトです。 //! void PushFragmentLight(FragmentLight* light) { bool isPushed = m_FragmentLights.push_back(light); NW_ASSERT(isPushed); } //! @brief フラグメントライトを追加します。 //! //! @param[in] light フラグメントライトです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushFragmentLight(FragmentLight* light) { bool isPushed = m_FragmentLights.push_back(light); return isPushed; } //! @brief フラグメントライトの先頭を指すイテレータを取得します。 //! //! @return フラグメントライトの先頭を指すイテレータです。 //! FragmentLightArray::iterator GetFragmentLightsBegin() { return m_FragmentLights.begin(); } //! @brief フラグメントライトの先頭を指すイテレータを取得します。 //! //! @return フラグメントライトの先頭を指すイテレータです。 //! FragmentLightArray::const_iterator GetFragmentLightsBegin() const { return m_FragmentLights.begin(); } //! @brief フラグメントライトの終端を指すイテレータを取得します。 //! //! @return フラグメントライトの終端を指すイテレータです。 //! FragmentLightArray::iterator GetFragmentLightsEnd() { return m_FragmentLights.end(); } //! @brief フラグメントライトの終端を指すイテレータを取得します。 //! //! @return フラグメントライトの終端を指すイテレータです。 //! FragmentLightArray::const_iterator GetFragmentLightsEnd() const { return m_FragmentLights.end(); } //! @brief 頂点ライトを追加します。 //! //! @param[in] light 頂点ライトです。 //! void PushVertexLight(VertexLight* light) { bool isPushed = m_VertexLights.push_back(light); NW_ASSERT(isPushed); } //! @brief 頂点ライトを追加します。 //! //! @param[in] light 頂点ライトです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushVertexLight(VertexLight* light) { bool isPushed = m_VertexLights.push_back(light); return isPushed; } //! @brief 頂点ライトの先頭を指すイテレータを取得します。 //! //! @return 頂点ライトの先頭を指すイテレータです。 //! VertexLightArray::iterator GetVertexLightsBegin() { return m_VertexLights.begin(); } //! @brief 頂点ライトの先頭を指すイテレータを取得します。 //! //! @return 頂点ライトの先頭を指すイテレータです。 //! VertexLightArray::const_iterator GetVertexLightsBegin() const { return m_VertexLights.begin(); } //! @brief 頂点ライトの終端を指すイテレータを取得します。 //! //! @return 頂点ライトの終端を指すイテレータです。 //! VertexLightArray::iterator GetVertexLightsEnd() { return m_VertexLights.end(); } //! @brief 頂点ライトの終端を指すイテレータを取得します。 //! //! @return 頂点ライトの終端を指すイテレータです。 //! VertexLightArray::const_iterator GetVertexLightsEnd() const { return m_VertexLights.end(); } //! @brief 半球ライトを追加します。 //! //! @param[in] light 半球ライトです。 //! void PushHemiSphereLight(HemiSphereLight* light) { bool isPushed = m_HemiSphereLights.push_back(light); NW_ASSERT(isPushed); } //! @brief 半球ライトを追加します。 //! //! @param[in] light 半球ライトです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushHemiSphereLight(HemiSphereLight* light) { bool isPushed = m_HemiSphereLights.push_back(light); return isPushed; } //! @brief 半球ライトの先頭を指すイテレータを取得します。 //! //! @return 半球ライトの先頭を指すイテレータです。 //! HemiSphereLightArray::iterator GetHemiSphereLightsBegin() { return m_HemiSphereLights.begin(); } //! @brief 半球ライトの先頭を指すイテレータを取得します。 //! //! @return 半球ライトの先頭を指すイテレータです。 //! HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const { return m_HemiSphereLights.begin(); } //! @brief 半球ライトの終端を指すイテレータを取得します。 //! //! @return 半球ライトの終端を指すイテレータです。 //! HemiSphereLightArray::iterator GetHemiSphereLightsEnd() { return m_HemiSphereLights.end(); } //! @brief 半球ライトの終端を指すイテレータを取得します。 //! //! @return 半球ライトの終端を指すイテレータです。 //! HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const { return m_HemiSphereLights.end(); } //! @brief アンビエントライトを追加します。 //! //! @param[in] light アンビエントライトです。 //! void PushAmbientLight(AmbientLight* light) { bool isPushed = m_AmbientLights.push_back(light); NW_ASSERT(isPushed); } //! @brief アンビエントライトを追加します。 //! //! @param[in] light アンビエントライトです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushAmbientLight(AmbientLight* light) { bool isPushed = m_AmbientLights.push_back(light); return isPushed; } //! @brief アンビエントライトの先頭を指すイテレータを取得します。 //! //! @return アンビエントライトの先頭を指すイテレータです。 //! AmbientLightArray::iterator GetAmbientLightsBegin() { return m_AmbientLights.begin(); } //! @brief アンビエントライトの先頭を指すイテレータを取得します。 //! //! @return アンビエントライトの先頭を指すイテレータです。 //! AmbientLightArray::const_iterator GetAmbientLightsBegin() const { return m_AmbientLights.begin(); } //! @brief アンビエントライトの終端を指すイテレータを取得します。 //! //! @return アンビエントライトの終端を指すイテレータです。 //! AmbientLightArray::iterator GetAmbientLightsEnd() { return m_AmbientLights.end(); } //! @brief アンビエントライトの終端を指すイテレータを取得します。 //! //! @return アンビエントライトの終端を指すイテレータです。 //! AmbientLightArray::const_iterator GetAmbientLightsEnd() const { return m_AmbientLights.end(); } //@} //---------------------------------------- //! @name カメラ関連 //@{ //! @brief カメラを追加します。 //! //! @param[in] camera カメラです。 //! void PushCamera(Camera* camera) { bool isPushed = m_Cameras.push_back(camera); NW_ASSERT(isPushed); } //! @brief カメラを追加します。 //! //! @param[in] camera カメラです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushCamera(Camera* camera) { bool isPushed = m_Cameras.push_back(camera); return isPushed; } //! @brief カメラの先頭を指すイテレータを取得します。 //! //! @return カメラの先頭を指すイテレータです。 //! CameraArray::iterator GetCameraBegin() { return m_Cameras.begin(); } //! @brief カメラの先頭を指すイテレータを取得します。 //! //! @return カメラの先頭を指すイテレータです。 //! CameraArray::const_iterator GetCameraBegin() const { return m_Cameras.begin(); } //! @brief カメラの終端を指すイテレータを取得します。 //! //! @return カメラの終端を指すイテレータです。 //! CameraArray::iterator GetCameraEnd() { return m_Cameras.end(); } //! @brief カメラの終端を指すイテレータを取得します。 //! //! @return カメラの終端を指すイテレータです。 //! CameraArray::const_iterator GetCameraEnd() const { return m_Cameras.end(); } //@} //---------------------------------------- //! @name フォグ関連 //@{ //! @brief フォグを追加します。 //! //! @param[in] fog フォグです。 //! void PushFog(Fog* fog) { bool isPushed = m_Fogs.push_back(fog); NW_ASSERT(isPushed); } //! @brief フォグを追加します。 //! //! @param[in] fog フォグです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushFog(Fog* fog) { bool isPushed = m_Fogs.push_back(fog); return isPushed; } //! @brief フォグの先頭を指すイテレータを取得します。 //! //! @return フォグの先頭を指すイテレータです。 //! FogArray::iterator GetFogBegin() { return m_Fogs.begin(); } //! @brief フォグの先頭を指すイテレータを取得します。 //! //! @return フォグの先頭を指すイテレータです。 //! FogArray::const_iterator GetFogBegin() const { return m_Fogs.begin(); } //! @brief フォグの終端を指すイテレータを取得します。 //! //! @return フォグの終端を指すイテレータです。 //! FogArray::iterator GetFogEnd() { return m_Fogs.end(); } //! @brief フォグの終端を指すイテレータを取得します。 //! //! @return フォグの終端を指すイテレータです。 //! FogArray::const_iterator GetFogEnd() const { return m_Fogs.end(); } //@} //---------------------------------------- //! @name パーティクルセット関連 //@{ //! @brief パーティクルセットを追加します。 //! //! @param[in] particleSet パーティクルセットです。 //! void PushParticleSet(ParticleSet* particleSet) { bool isPushed = m_ParticleSets.push_back(particleSet); NW_ASSERT(isPushed); } //! @brief パーティクルセットを追加します。 //! //! @param[in] particleSet パーティクルセットです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushParticleSet(ParticleSet* particleSet) { bool isPushed = m_ParticleSets.push_back(particleSet); return isPushed; } //! @brief パーティクルセットの先頭を指すイテレータを取得します。 //! //! @return パーティクルセットの先頭を指すイテレータです。 //! ParticleSetArray::iterator GetParticleSetBegin() { return m_ParticleSets.begin(); } //! @brief パーティクルセットの先頭を指すイテレータを取得します。 //! //! @return パーティクルセットの先頭を指すイテレータです。 //! ParticleSetArray::const_iterator GetParticleSetBegin() const { return m_ParticleSets.begin(); } //! @brief パーティクルセットの終端を指すイテレータを取得します。 //! //! @return パーティクルセットの終端を指すイテレータです。 //! ParticleSetArray::iterator GetParticleSetEnd() { return m_ParticleSets.end(); } //! @brief パーティクルセットの終端を指すイテレータを取得します。 //! //! @return パーティクルセットの終端を指すイテレータです。 //! ParticleSetArray::const_iterator GetParticleSetEnd() const { return m_ParticleSets.end(); } //@} //---------------------------------------- //! @name パーティクルエミッタ関連 //@{ //! @brief パーティクルエミッタを追加します。 //! //! @param[in] particleEmitter パーティクルエミッタです。 //! void PushParticleEmitter(ParticleEmitter* particleEmitter) { bool isPushed = m_ParticleEmitters.push_back(particleEmitter); NW_ASSERT(isPushed); } //! @brief パーティクルエミッタを追加します。 //! //! @param[in] particleEmitter パーティクルエミッタです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushParticleEmitter(ParticleEmitter* particleEmitter) { bool isPushed = m_ParticleEmitters.push_back(particleEmitter); return isPushed; } //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 //! //! @return パーティクルエミッタの先頭を指すイテレータです。 //! ParticleEmitterArray::iterator GetParticleEmitterBegin() { return m_ParticleEmitters.begin(); } //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 //! //! @return パーティクルエミッタの先頭を指すイテレータです。 //! ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const { return m_ParticleEmitters.begin(); } //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 //! //! @return パーティクルエミッタの終端を指すイテレータです。 //! ParticleEmitterArray::iterator GetParticleEmitterEnd() { return m_ParticleEmitters.end(); } //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 //! //! @return パーティクルエミッタの終端を指すイテレータです。 //! ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const { return m_ParticleEmitters.end(); } //@} //---------------------------------------- //! @name パーティクルモデル関連 //@{ //! @brief パーティクルモデルを追加します。 //! //! @param[in] particleModel パーティクルモデルです。 //! void PushParticleModel(ParticleModel* particleModel) { bool isPushed = m_ParticleModels.push_back(particleModel); NW_ASSERT(isPushed); } //! @brief パーティクルモデルを追加します。 //! //! @param[in] particleModel パーティクルモデルです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushParticleModel(ParticleModel* particleModel) { bool isPushed = m_ParticleModels.push_back(particleModel); return isPushed; } //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 //! //! @return パーティクルモデルの先頭を指すイテレータです。 //! ParticleModelArray::iterator GetParticleModelBegin() { return m_ParticleModels.begin(); } //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 //! //! @return パーティクルモデルの先頭を指すイテレータです。 //! ParticleModelArray::const_iterator GetParticleModelBegin() const { return m_ParticleModels.begin(); } //! @brief パーティクルモデルの終端を指すイテレータを取得します。 //! //! @return パーティクルモデルの終端を指すイテレータです。 //! ParticleModelArray::iterator GetParticleModelEnd() { return m_ParticleModels.end(); } //! @brief パーティクルモデルの終端を指すイテレータを取得します。 //! //! @return パーティクルモデルの終端を指すイテレータです。 //! ParticleModelArray::const_iterator GetParticleModelEnd() const { return m_ParticleModels.end(); } //@} //! @name アニメーション関連 //@{ //! @brief アニメーションを行うノードを追加します。 //! //! アニメーションを行わないノードについては、引数に渡されても無視します。 //! //! @param[in] sceneNode アニメーションを行うノードです。 //! void PushAnimatableNode(SceneNode* sceneNode) { if (sceneNode->GetAnimBinding() != NULL) { bool isPushed = m_AnimatableNodes.push_back(sceneNode); NW_ASSERT(isPushed); } } //! @brief アニメーションを行うノードを追加します。 //! //! アニメーションを行わないノードについては、引数に渡されても無視します。 //! //! @param[in] sceneNode アニメーションを行うノードです。 //! //! @return 追加に成功すると true が返ります。 //! bool TryPushAnimatableNode(SceneNode* sceneNode) { bool isPushed = true; if (sceneNode->GetAnimBinding() != NULL) { isPushed = m_AnimatableNodes.push_back(sceneNode); } return isPushed; } //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 //! //! @return アニメーションを行うノードの先頭を指すイテレータです。 //! AnimatableNodeArray::iterator GetAnimatableNodesBegin() { return m_AnimatableNodes.begin(); } //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 //! //! @return アニメーションを行うノードの先頭を指すイテレータです。 //! AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const { return m_AnimatableNodes.begin(); } //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 //! //! @return アニメーションを行うノードの終端を指すイテレータです。 //! AnimatableNodeArray::iterator GetAnimatableNodesEnd() { return m_AnimatableNodes.end(); } //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 //! //! @return アニメーションを行うノードの終端を指すイテレータです。 //! AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const { return m_AnimatableNodes.end(); } //@} private: SceneContext( os::IAllocator* allocator, SceneNodeArray sceneNodes, UserRenderNodeArray userRenderNodes, ModelArray models, SkeletalModelArray skeletalModels, CameraArray cameras, FogArray fogs, LightArray lights, FragmentLightArray fragmentLights, VertexLightArray vertexLights, HemiSphereLightArray hemiSphereLights, AmbientLightArray ambientLights, ParticleSetArray particleSets, ParticleEmitterArray particleEmitters, ParticleModelArray particleModels, AnimatableNodeArray animatableNodes) : GfxObject(allocator), m_SceneNodes(sceneNodes), m_UserRenderNodes(userRenderNodes), m_Models(models), m_SkeletalModels(skeletalModels), m_Cameras(cameras), m_Fogs(fogs), m_Lights(lights), m_FragmentLights(fragmentLights), m_VertexLights(vertexLights), m_HemiSphereLights(hemiSphereLights), m_AmbientLights(ambientLights), m_ParticleSets(particleSets), m_ParticleEmitters(particleEmitters), m_ParticleModels(particleModels), m_AnimatableNodes(animatableNodes) {} virtual ~SceneContext() {} SceneNodeArray m_SceneNodes; UserRenderNodeArray m_UserRenderNodes; ModelArray m_Models; SkeletalModelArray m_SkeletalModels; CameraArray m_Cameras; FogArray m_Fogs; LightArray m_Lights; FragmentLightArray m_FragmentLights; VertexLightArray m_VertexLights; HemiSphereLightArray m_HemiSphereLights; AmbientLightArray m_AmbientLights; ParticleSetArray m_ParticleSets; ParticleEmitterArray m_ParticleEmitters; ParticleModelArray m_ParticleModels; AnimatableNodeArray m_AnimatableNodes; }; } // namespace gfx } // namespace nw #endif // NW_GFX_SCENECONTEXT_H_