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