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: 27617 $ 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 //! SkeletalModel::GetFullBakedAnimEnabled が true の場合は、更新が省略されます。 140 //! 141 //! @param[in] sceneContext 更新対象です。 142 //! 143 void UpdateSkeletalModel(SceneContext* sceneContext) const; 144 145 //! @brief アニメーションフレームを進めます。 146 //! 147 //! @param[in] sceneContext 更新対象です。 148 //! 149 void UpdateAnim(SceneContext* sceneContext) const; 150 151 //! @brief アニメーションを評価します。 152 //! 153 //! @param[in] sceneContext 更新対象です。 154 //! @param[in] timing アニメーションの評価タイミングです。 155 //! タイミングが一致するアニメーションのみが評価されます。 156 //! 157 void EvaluateAnim(SceneContext* sceneContext, anim::ResGraphicsAnimGroup::EvaluationTiming timing) const; 158 159 //@} 160 161 //---------------------------------------- 162 //! @name カメラによる更新 163 //@{ 164 165 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 166 //! 167 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 168 //! @param[in] sceneContext シーンコンテキストです。 169 //! @param[in] camera カメラです。 170 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 171 //! @param[in] renderSortMode 描画ソートモードです。 172 //! 173 virtual void SubmitView( 174 RenderQueue* renderQueue, 175 SceneContext* sceneContext, 176 const Camera& camera, 177 u8 layerId, 178 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 179 180 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 181 //! 182 //! パーティクルを別レイヤーで描画するための SubmitView です。 183 //! 184 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 185 //! @param[in] sceneContext シーンコンテキストです。 186 //! @param[in] camera カメラです。 187 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 188 //! @param[in] particleLayerId パーティクル描画用の layerId です。 189 //! @param[in] renderSortMode 描画ソートモードです。 190 //! 191 virtual void SubmitView( 192 RenderQueue* renderQueue, 193 SceneContext* sceneContext, 194 const Camera& camera, 195 u8 layerId, 196 u8 particleLayerId, 197 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 198 199 //! @brief カメラの視界に基づいてシーンを更新し、描画キューを構築します。 200 //! 201 //! パーティクルを別レイヤーで描画するための SubmitView です。 202 //! 203 //! @param[in] renderQueue 描画対象となる要素を集めたキューです。 204 //! @param[in] sceneContext シーンコンテキストです。 205 //! @param[in] camera カメラです。 206 //! @param[in] layerId 描画要素のソート時に最優先に区分される ID です。レイヤーやビューポートの描画を制御するのに用います。 207 //! @param[in] particleLayerId パーティクル描画用の layerId です。 208 //! @param[in] isVisibleModel 表示するモデルを識別するための関数オブジェクトです。 209 //! @param[in] renderSortMode 描画ソートモードです。 210 //! 211 virtual void SubmitView( 212 RenderQueue* renderQueue, 213 SceneContext* sceneContext, 214 const Camera& camera, 215 u8 layerId, 216 u8 particleLayerId, 217 IsVisibleModelFunctor* isVisibleModel, 218 RenderSortMode renderSortMode = ALL_MESH_BASE_SORT); 219 220 //@} 221 222 protected: 223 //---------------------------------------- 224 //! @name コンストラクタ/デストラクタ 225 //@{ 226 227 //! コンストラクタです。 SceneUpdater(os::IAllocator * allocator,GfxPtr<SkeletonUpdater> skeletonUpdater,GfxPtr<WorldMatrixUpdater> worldMatrixUpdater,GfxPtr<BillboardUpdater> billboardUpdater)228 SceneUpdater(os::IAllocator* allocator, 229 GfxPtr<SkeletonUpdater> skeletonUpdater, 230 GfxPtr<WorldMatrixUpdater> worldMatrixUpdater, 231 GfxPtr<BillboardUpdater> billboardUpdater) 232 : ISceneUpdater(allocator), 233 m_SkeletonUpdater(skeletonUpdater), 234 m_WorldMatrixUpdater(worldMatrixUpdater), 235 m_BillboardUpdater(billboardUpdater), 236 m_DepthSortMode(SORT_DEPTH_OF_ALL_MESH) 237 {} 238 239 //! デストラクタです。 ~SceneUpdater()240 virtual ~SceneUpdater() {} 241 242 //@} 243 244 GfxPtr<SkeletonUpdater> m_SkeletonUpdater; 245 GfxPtr<WorldMatrixUpdater> m_WorldMatrixUpdater; 246 GfxPtr<BillboardUpdater> m_BillboardUpdater; 247 DepthSortMode m_DepthSortMode; 248 }; 249 250 } // namespace gfx 251 } // namespace nw 252 253 #endif // NW_GFX_SCENEUPDATER_H_ 254