/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_SceneUpdater.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_SCENEUPDATER_H_ #define NW_GFX_SCENEUPDATER_H_ #include #include namespace nw { namespace gfx { class SkeletonUpdater; class WorldMatrixUpdater; class BillboardUpdater; class SceneContext; //--------------------------------------------------------------------------- //! @brief シーンの更新を行うためのクラスです。 //--------------------------------------------------------------------------- class SceneUpdater : public ISceneUpdater { private: NW_DISALLOW_COPY_AND_ASSIGN(SceneUpdater); public: NW_UT_RUNTIME_TYPEINFO; //---------------------------------------- //! @name 作成 //@{ //! シーンアップデータクラスを構築するためのクラスです。 class Builder { public: Builder() {} //! @brief スケルトンアップデータを設定します。 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 Builder& SkeletonUpdaterPtr(SkeletonUpdater* skeletonUpdater) { m_SkeletonUpdater.Reset(skeletonUpdater); return *this; } //! @brief ワールドマトリクスアップデータを設定します。 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 Builder& WorldMatrixUpdaterPtr(WorldMatrixUpdater* worldMatrixUpdater) { m_WorldMatrixUpdater.Reset(worldMatrixUpdater); return *this; } //! @brief ビルボードアップデータを設定します。 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 Builder& BillboardUpdaterPtr(BillboardUpdater* billboardUpdater) { m_BillboardUpdater.Reset(billboardUpdater); return *this; } //! @brief シーンアップデータを生成します。 //! //! @param[in] allocator //! //! @return 生成したシーンアップデータを返します。 //! SceneUpdater* Create(os::IAllocator* allocator); private: GfxPtr m_SkeletonUpdater; GfxPtr m_WorldMatrixUpdater; GfxPtr m_BillboardUpdater; }; //@} //---------------------------------------- //! @name 取得/設定 //@{ //! @brief 深度ソートモードを取得します。 virtual DepthSortMode GetDepthSortMode() const { return m_DepthSortMode; } //! @brief 深度ソートモードを設定します。 virtual void SetDepthSortMode(DepthSortMode depthSortMode) { m_DepthSortMode = depthSortMode; } //@} //---------------------------------------- //! @name 更新 //@{ //! @brief シーンを更新します。アニメーションの更新も同時に行います。 //! //! 下記のメソッドを個別に呼び出す場合は UpdateAll を用いないようにしてください。 //! //! ・UpdateTransformNode@n //! ・UpdateSkeletalModel@n //! ・UpdateAnim@n //! ・EvaluateAnim@n //! //! @param[in] sceneContext 更新対象です。 //! //! @sa UpdateTransformNode //! @sa UpdateSkeletalModel //! @sa UpdateAnim //! @sa EvaluateAnim //! virtual void UpdateAll(SceneContext* sceneContext); //! @brief トランスフォームノードのワールドマトリクスを更新します。 //! //! @param[in] sceneContext 更新対象です。 //! void UpdateTransformNode(SceneContext* sceneContext) const; //! @brief スケルタルモデルのワールドマトリクスを更新します。 //! //! SkeletalModel::GetFullBakedAnimEnabled が true の場合は、更新が省略されます。 //! //! @param[in] sceneContext 更新対象です。 //! void UpdateSkeletalModel(SceneContext* sceneContext) const; //! @brief アニメーションフレームを進めます。 //! //! @param[in] sceneContext 更新対象です。 //! void UpdateAnim(SceneContext* sceneContext) const; //! @brief アニメーションを評価します。 //! //! @param[in] sceneContext 更新対象です。 //! @param[in] timing アニメーションの評価タイミングです。 //! タイミングが一致するアニメーションのみが評価されます。 //! void EvaluateAnim(SceneContext* sceneContext, anim::ResGraphicsAnimGroup::EvaluationTiming timing) const; //@} //---------------------------------------- //! @name カメラによる更新 //@{ //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 //! //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 //! @param[in] sceneContext シーンコンテキストです。 //! @param[in] camera カメラです。 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 //! @param[in] renderSortMode 描画ソートモードです。 //! virtual void SubmitView( RenderQueue* renderQueue, SceneContext* sceneContext, const Camera& camera, u8 layerId, RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 //! //! パーティクルを別レイヤーで描画するための SubmitView です。 //! //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 //! @param[in] sceneContext シーンコンテキストです。 //! @param[in] camera カメラです。 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 //! @param[in] particleLayerId パーティクル描画用の layerId です。 //! @param[in] renderSortMode 描画ソートモードです。 //! virtual void SubmitView( RenderQueue* renderQueue, SceneContext* sceneContext, const Camera& camera, u8 layerId, u8 particleLayerId, RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 //! //! パーティクルを別レイヤーで描画するための SubmitView です。 //! //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 //! @param[in] sceneContext シーンコンテキストです。 //! @param[in] camera カメラです。 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 //! @param[in] particleLayerId パーティクル描画用の layerId です。 //! @param[in] isVisibleModel 表示するモデルを識別するための関数オブジェクトです。 //! @param[in] renderSortMode 描画ソートモードです。 //! virtual void SubmitView( RenderQueue* renderQueue, SceneContext* sceneContext, const Camera& camera, u8 layerId, u8 particleLayerId, IsVisibleModelFunctor* isVisibleModel, RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); //@} protected: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 SceneUpdater(os::IAllocator* allocator, GfxPtr skeletonUpdater, GfxPtr worldMatrixUpdater, GfxPtr billboardUpdater) : ISceneUpdater(allocator), m_SkeletonUpdater(skeletonUpdater), m_WorldMatrixUpdater(worldMatrixUpdater), m_BillboardUpdater(billboardUpdater), m_DepthSortMode(SORT_DEPTH_OF_ALL_MESH) {} //! デストラクタです。 virtual ~SceneUpdater() {} //@} GfxPtr m_SkeletonUpdater; GfxPtr m_WorldMatrixUpdater; GfxPtr m_BillboardUpdater; DepthSortMode m_DepthSortMode; }; } // namespace gfx } // namespace nw #endif // NW_GFX_SCENEUPDATER_H_