1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_SceneUpdater.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision: 23256 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_GFX_SCENEUPDATER_H_ 17 #define NW_GFX_SCENEUPDATER_H_ 18 19 #include <nw/gfx/gfx_ISceneUpdater.h> 20 #include <nw/gfx/gfx_RenderQueue.h> 21 22 namespace nw 23 { 24 namespace gfx 25 { 26 27 class SkeletonUpdater; 28 class WorldMatrixUpdater; 29 class BillboardUpdater; 30 31 class SceneContext; 32 33 //--------------------------------------------------------------------------- 34 //! @brief シーンの更新を行うためのクラスです。 35 //--------------------------------------------------------------------------- 36 class SceneUpdater : public ISceneUpdater 37 { 38 private: 39 NW_DISALLOW_COPY_AND_ASSIGN(SceneUpdater); 40 41 public: 42 NW_UT_RUNTIME_TYPEINFO; 43 44 //---------------------------------------- 45 //! @name 作成 46 //@{ 47 48 //! シーンアップデータクラスを構築するためのクラスです。 49 class Builder 50 { 51 public: Builder()52 Builder() {} 53 54 //! @brief スケルトンアップデータを設定します。 55 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 SkeletonUpdaterPtr(SkeletonUpdater * skeletonUpdater)56 Builder& SkeletonUpdaterPtr(SkeletonUpdater* skeletonUpdater) 57 { 58 m_SkeletonUpdater.Reset(skeletonUpdater); 59 return *this; 60 } 61 62 //! @brief ワールドマトリクスアップデータを設定します。 63 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 WorldMatrixUpdaterPtr(WorldMatrixUpdater * worldMatrixUpdater)64 Builder& WorldMatrixUpdaterPtr(WorldMatrixUpdater* worldMatrixUpdater) 65 { 66 m_WorldMatrixUpdater.Reset(worldMatrixUpdater); 67 return *this; 68 } 69 70 //! @brief ビルボードアップデータを設定します。 71 //! 所有権が移動しますので SceneUpdater を破棄する際に一緒に破棄されます。 BillboardUpdaterPtr(BillboardUpdater * billboardUpdater)72 Builder& BillboardUpdaterPtr(BillboardUpdater* billboardUpdater) 73 { 74 m_BillboardUpdater.Reset(billboardUpdater); 75 return *this; 76 } 77 78 //! @brief シーンアップデータを生成します。 79 //! 80 //! @param[in] allocator 81 //! 82 //! @return 生成したシーンアップデータを返します。 83 //! 84 SceneUpdater* Create(os::IAllocator* allocator); 85 86 private: 87 GfxPtr<SkeletonUpdater> m_SkeletonUpdater; 88 GfxPtr<WorldMatrixUpdater> m_WorldMatrixUpdater; 89 GfxPtr<BillboardUpdater> m_BillboardUpdater; 90 }; 91 92 //@} 93 94 //---------------------------------------- 95 //! @name 取得/設定 96 //@{ 97 98 //! @brief 深度ソートモードを取得します。 GetDepthSortMode()99 virtual DepthSortMode GetDepthSortMode() const { return m_DepthSortMode; } 100 101 //! @brief 深度ソートモードを設定します。 SetDepthSortMode(DepthSortMode depthSortMode)102 virtual void SetDepthSortMode(DepthSortMode depthSortMode) 103 { 104 m_DepthSortMode = depthSortMode; 105 } 106 107 //@} 108 109 //---------------------------------------- 110 //! @name 更新 111 //@{ 112 113 //! @brief シーンを更新します。アニメーションの更新も同時に行います。 114 //! 115 //! 下記のメソッドを個別に呼び出す場合は UpdateAll を用いないようにしてください。 116 //! 117 //! ・UpdateTransformNode@n 118 //! ・UpdateSkeletalModel@n 119 //! ・UpdateAnim@n 120 //! ・EvaluateAnim@n 121 //! 122 //! @param[in] sceneContext 更新対象です。 123 //! 124 //! @sa UpdateTransformNode 125 //! @sa UpdateSkeletalModel 126 //! @sa UpdateAnim 127 //! @sa EvaluateAnim 128 //! 129 virtual void UpdateAll(SceneContext* sceneContext); 130 131 //! @brief トランスフォームノードのワールドマトリクスを更新します。 132 //! 133 //! @param[in] sceneContext 更新対象です。 134 //! 135 void UpdateTransformNode(SceneContext* sceneContext) const; 136 137 //! @brief スケルタルモデルのワールドマトリクスを更新します。 138 //! 139 //! @param[in] sceneContext 更新対象です。 140 //! 141 void UpdateSkeletalModel(SceneContext* sceneContext) const; 142 143 //! @brief アニメーションフレームを進めます。 144 //! 145 //! @param[in] sceneContext 更新対象です。 146 //! 147 void UpdateAnim(SceneContext* sceneContext) const; 148 149 //! @brief アニメーションを評価します。 150 //! 151 //! @param[in] sceneContext 更新対象です。 152 //! @param[in] timing アニメーションの評価タイミングです。 153 //! タイミングが一致するアニメーションのみが評価されます。 154 //! 155 void EvaluateAnim(SceneContext* sceneContext, anim::ResGraphicsAnimGroup::EvaluationTiming timing) const; 156 157 //@} 158 159 //---------------------------------------- 160 //! @name カメラによる更新 161 //@{ 162 163 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 164 //! 165 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 166 //! @param[in] sceneContext シーンコンテキストです。 167 //! @param[in] camera カメラです。 168 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 169 //! @param[in] renderSortMode 描画ソートモードです。 170 //! 171 virtual void SubmitView( 172 RenderQueue* renderQueue, 173 SceneContext* sceneContext, 174 const Camera& camera, 175 u8 layerId, 176 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 177 178 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 179 //! 180 //! パーティクルを別レイヤーで描画するための SubmitView です。 181 //! 182 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 183 //! @param[in] sceneContext シーンコンテキストです。 184 //! @param[in] camera カメラです。 185 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 186 //! @param[in] particleLayerId パーティクル描画用の layerId です。 187 //! @param[in] renderSortMode 描画ソートモードです。 188 //! 189 virtual void SubmitView( 190 RenderQueue* renderQueue, 191 SceneContext* sceneContext, 192 const Camera& camera, 193 u8 layerId, 194 u8 particleLayerId, 195 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 196 197 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 198 //! 199 //! パーティクルを別レイヤーで描画するための SubmitView です。 200 //! 201 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 202 //! @param[in] sceneContext シーンコンテキストです。 203 //! @param[in] camera カメラです。 204 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 205 //! @param[in] particleLayerId パーティクル描画用の layerId です。 206 //! @param[in] isVisibleModel 表示するモデルを識別するための関数オブジェクトです。 207 //! @param[in] renderSortMode 描画ソートモードです。 208 //! 209 virtual void SubmitView( 210 RenderQueue* renderQueue, 211 SceneContext* sceneContext, 212 const Camera& camera, 213 u8 layerId, 214 u8 particleLayerId, 215 IsVisibleModelFunctor* isVisibleModel, 216 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 217 218 //@} 219 220 protected: 221 //---------------------------------------- 222 //! @name コンストラクタ/デストラクタ 223 //@{ 224 225 //! コンストラクタです。 SceneUpdater(os::IAllocator * allocator,GfxPtr<SkeletonUpdater> skeletonUpdater,GfxPtr<WorldMatrixUpdater> worldMatrixUpdater,GfxPtr<BillboardUpdater> billboardUpdater)226 SceneUpdater(os::IAllocator* allocator, 227 GfxPtr<SkeletonUpdater> skeletonUpdater, 228 GfxPtr<WorldMatrixUpdater> worldMatrixUpdater, 229 GfxPtr<BillboardUpdater> billboardUpdater) 230 : ISceneUpdater(allocator), 231 m_SkeletonUpdater(skeletonUpdater), 232 m_WorldMatrixUpdater(worldMatrixUpdater), 233 m_BillboardUpdater(billboardUpdater), 234 m_DepthSortMode(SORT_DEPTH_OF_ALL_MESH) 235 {} 236 237 //! デストラクタです。 ~SceneUpdater()238 virtual ~SceneUpdater() {} 239 240 //@} 241 242 GfxPtr<SkeletonUpdater> m_SkeletonUpdater; 243 GfxPtr<WorldMatrixUpdater> m_WorldMatrixUpdater; 244 GfxPtr<BillboardUpdater> m_BillboardUpdater; 245 DepthSortMode m_DepthSortMode; 246 }; 247 248 } // namespace gfx 249 } // namespace nw 250 251 #endif // NW_GFX_SCENEUPDATER_H_ 252