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