1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_SceneContext.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NW_GFX_SCENECONTEXT_H_
19 #define NW_GFX_SCENECONTEXT_H_
20 
21 #include <nw/gfx/gfx_GfxObject.h>
22 
23 namespace nw
24 {
25 namespace gfx
26 {
27 
28 class SceneNode;
29 class UserRenderNode;
30 class Model;
31 class SkeletalModel;
32 class Light;
33 class FragmentLight;
34 class VertexLight;
35 class HemiSphereLight;
36 class AmbientLight;
37 class Camera;
38 class Fog;
39 class ParticleSet;
40 class ParticleEmitter;
41 class ParticleModel;
42 class LightSet;
43 
44 //! @brief シーンノードの Array の定義です。
45 typedef ut::MoveArray<SceneNode*> SceneNodeArray;
46 
47 //! @brief ユーザ定義の描画ノードの Array の定義です。
48 typedef ut::MoveArray<UserRenderNode*> UserRenderNodeArray;
49 
50 //! @brief モデルの Array の定義です。
51 typedef ut::MoveArray<Model*> ModelArray;
52 
53 //! @brief スケルタルモデルの Array の定義です。
54 typedef ut::MoveArray<SkeletalModel*> SkeletalModelArray;
55 
56 //! @brief ライトの Array の定義です。
57 typedef ut::MoveArray<Light*> LightArray;
58 
59 //! @brief フラグメントライトの Array の定義です。
60 typedef ut::MoveArray<FragmentLight*> FragmentLightArray;
61 
62 //! @brief 頂点ライトの Array の定義です。
63 typedef ut::MoveArray<VertexLight*> VertexLightArray;
64 
65 //! @brief 半球ライトの Array の定義です。
66 typedef ut::MoveArray<HemiSphereLight*> HemiSphereLightArray;
67 
68 //! @brief アンビエントライトの Array の定義です。
69 typedef ut::MoveArray<AmbientLight*> AmbientLightArray;
70 
71 //! @brief カメラの Array の定義です。
72 typedef ut::MoveArray<Camera*> CameraArray;
73 
74 //! @brief フォグの Array の定義です。
75 typedef ut::MoveArray<Fog*> FogArray;
76 
77 //! @brief パーティクルセットの Array の定義です。
78 typedef ut::MoveArray<ParticleSet*> ParticleSetArray;
79 
80 //! @brief パーティクルエミッタの Array の定義です。
81 typedef ut::MoveArray<ParticleEmitter*> ParticleEmitterArray;
82 
83 //! @brief パーティクルモデルの Array の定義です。
84 typedef ut::MoveArray<ParticleModel*> ParticleModelArray;
85 
86 //! @brief ライトセットの配列です。
87 typedef ut::MoveArray<LightSet*> LightSetArray;
88 
89 //! @brief アニメーションするノードの Array の定義です。
90 typedef ut::MoveArray<SceneNode*> AnimatableNodeArray;
91 
92 //---------------------------------------------------------------------------
93 //! @brief        シーン解析時の内容を保持させるためのクラスです。
94 //---------------------------------------------------------------------------
95 class SceneContext : public GfxObject
96 {
97 private:
98     NW_DISALLOW_COPY_AND_ASSIGN(SceneContext);
99 
100 public:
101 
102     // [非推奨] 互換性のために残してありますが、こちらの定義は用いないでください。
103 
104     //! @details :private
105     typedef SceneNodeArray SceneNodeArray;
106     //! @details :private
107     typedef ModelArray ModelArray;
108     //! @details :private
109     typedef SkeletalModelArray SkeletalModelArray;
110     //! @details :private
111     typedef FragmentLightArray FragmentLightArray;
112     //! @details :private
113     typedef VertexLightArray VertexLightArray;
114     //! @details :private
115     typedef HemiSphereLightArray HemiSphereLightArray;
116     //! @details :private
117     typedef AmbientLightArray AmbientLightArray;
118     //! @details :private
119     typedef CameraArray CameraArray;
120     //! @details :private
121     typedef FogArray FogArray;
122     //! @details :private
123     typedef ParticleSetArray ParticleSetArray;
124     //! @details :private
125     typedef ParticleEmitterArray ParticleEmitterArray;
126     //! @details :private
127     typedef ParticleModelArray ParticleModelArray;
128 
129     enum
130     {
131         DEFAULT_MAX_SCENE_NODES = 64, //!< シーンノードのデフォルト最大数です。
132         DEFAULT_MAX_MODELS = 64, //!< モデルのデフォルト最大数です。
133         DEFAULT_MAX_SKELETAL_MODELS = 64, //!< スケルタルモデルのデフォルト最大数です。
134         DEFAULT_MAX_CAMERAS = 4, //!< カメラのデフォルト最大数です。
135         DEFAULT_MAX_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。
136         DEFAULT_MAX_FRAGMENT_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。
137         DEFAULT_MAX_VERTEX_LIGHTS = 8, //!< 頂点ライトのデフォルト最大数です。
138         DEFAULT_MAX_HEMISPHERE_LIGHTS = 4, //!< 半球ライトのデフォルト最大数です。
139         DEFAULT_MAX_AMBIENT_LIGHTS = 4, //!< アンビエントライトのデフォルト最大数です。
140         DEFAULT_MAX_FOGS = 4, //!< フォグのデフォルト最大数です。
141         DEFAULT_MAX_PARTICLESETS = 64, //!< パーティクルセットのデフォルト最大数です。
142         DEFAULT_MAX_PARTICLEEMITTERS = 64, //!< パーティクルエミッタのデフォルト最大数です。
143         DEFAULT_MAX_PARTICLEMODELS = 64, //!< パーティクルモデルのデフォルト最大数です。
144         DEFAULT_MAX_ANIMATABLE_NODES = 64, //!< アニメーションを行うシーンノードのデフォルト最大数です。
145         DEFAULT_MAX_USER_RENDER_NODES = 0  //!< ユーザ定義の描画ノードのデフォルト最大数です。
146     };
147 
148     //----------------------------------------
149     //! @name 作成
150     //@{
151 
152     //! @brief シーンコンテキストクラスを構築するためのクラスです。
153     //!
154     //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。
155     class Builder
156     {
157     public:
Builder()158         Builder()
159         : m_IsFixedSizeMemory(true),
160           m_MaxSceneNodes(DEFAULT_MAX_SCENE_NODES),
161           m_MaxUserRenderNodes(DEFAULT_MAX_USER_RENDER_NODES),
162           m_MaxModels(DEFAULT_MAX_MODELS),
163           m_MaxSkeletalModels(DEFAULT_MAX_SKELETAL_MODELS),
164           m_MaxCameras(DEFAULT_MAX_CAMERAS),
165           m_MaxLights(DEFAULT_MAX_LIGHTS),
166           m_MaxFragmentLights(DEFAULT_MAX_FRAGMENT_LIGHTS),
167           m_MaxVertexLights(DEFAULT_MAX_VERTEX_LIGHTS),
168           m_MaxHemiSphereLights(DEFAULT_MAX_HEMISPHERE_LIGHTS),
169           m_MaxAmbientLights(DEFAULT_MAX_AMBIENT_LIGHTS),
170           m_MaxFogs(DEFAULT_MAX_FOGS),
171           m_MaxParticleSets(DEFAULT_MAX_PARTICLESETS),
172           m_MaxParticleEmitters(DEFAULT_MAX_PARTICLEEMITTERS),
173           m_MaxParticleModels(DEFAULT_MAX_PARTICLEMODELS),
174           m_MaxAnimatableNodes(DEFAULT_MAX_ANIMATABLE_NODES)
175           {}
176 
177         //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。
178         //!
179         //!        true を指定すると、生成時のみ固定サイズのメモリ確保を行います。
180         //!
181         //!        false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。
IsFixedSizeMemory(bool isFixedSizeMemory)182         Builder& IsFixedSizeMemory(bool isFixedSizeMemory)
183         {
184             m_IsFixedSizeMemory = isFixedSizeMemory;
185             return *this;
186         }
187 
188         //! @brief シーンノードの最大数を設定します。
MaxSceneNodes(s32 max)189         Builder& MaxSceneNodes(s32 max) { m_MaxSceneNodes = max; return *this; }
190 
191         //! @brief ユーザ定義の描画ノードの最大数を設定します。
MaxUserRenderNodes(s32 max)192         Builder& MaxUserRenderNodes(s32 max) { m_MaxUserRenderNodes = max; return *this; }
193 
194         //! @brief モデルの最大数を設定します。
MaxModels(s32 max)195         Builder& MaxModels(s32 max) { m_MaxModels = max; return *this; }
196 
197         //! @brief スケルタルモデルの最大数を設定します。
MaxSkeletalModels(s32 max)198         Builder& MaxSkeletalModels(s32 max) { m_MaxSkeletalModels = max; return *this; }
199 
200         //! @brief カメラの最大数を設定します。
MaxCameras(s32 max)201         Builder& MaxCameras(s32 max) { m_MaxCameras = max; return *this; }
202 
203         //! @brief ライトの最大数を設定します。
MaxLights(s32 max)204         Builder& MaxLights(s32 max) { m_MaxLights = max; return *this; }
205 
206         //! @brief フラグメントライトの最大数を設定します。
MaxFragmentLights(s32 max)207         Builder& MaxFragmentLights(s32 max) { m_MaxFragmentLights = max; return *this; }
208 
209         //! @brief 頂点ライトの最大数を設定します。
MaxVertexLights(s32 max)210         Builder& MaxVertexLights(s32 max) { m_MaxVertexLights = max; return *this; }
211 
212         //! @brief 半球ライトの最大数を設定します。
MaxHemiSphereLights(s32 max)213         Builder& MaxHemiSphereLights(s32 max) { m_MaxHemiSphereLights = max; return *this; }
214 
215         //! @brief アンビエントライトの最大数を設定します。
MaxAmbientLights(s32 max)216         Builder& MaxAmbientLights(s32 max) { m_MaxAmbientLights = max; return *this; }
217 
218         //! @brief フォグの最大数を設定します。
MaxFogs(s32 max)219         Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; }
220 
221         //! @brief パーティクルセットの最大数を設定します。
MaxParticleSets(s32 max)222         Builder& MaxParticleSets(s32 max) { m_MaxParticleSets = max; return *this; }
223 
224         //! @brief パーティクルエミッタの最大数を設定します。
MaxParticleEmitters(s32 max)225         Builder& MaxParticleEmitters(s32 max) { m_MaxParticleEmitters = max; return *this; }
226 
227         //! @brief パーティクルモデルの最大数を設定します。
MaxParticleModels(s32 max)228         Builder& MaxParticleModels(s32 max) { m_MaxParticleModels = max; return *this; }
229 
230         //! @brief アニメーションを行うシーンノードの最大数を設定します。
MaxAnimatableNodes(s32 max)231         Builder& MaxAnimatableNodes(s32 max) { m_MaxAnimatableNodes = max; return *this; }
232 
233         //! @brief シーンコンテキストを生成します。
234         SceneContext* Create(os::IAllocator* allocator);
235 
236     private:
237         bool m_IsFixedSizeMemory;
238         s32 m_MaxSceneNodes;
239         s32 m_MaxUserRenderNodes;
240         s32 m_MaxModels;
241         s32 m_MaxSkeletalModels;
242         s32 m_MaxCameras;
243         s32 m_MaxLights;
244         s32 m_MaxFragmentLights;
245         s32 m_MaxVertexLights;
246         s32 m_MaxHemiSphereLights;
247         s32 m_MaxAmbientLights;
248         s32 m_MaxFogs;
249         s32 m_MaxParticleSets;
250         s32 m_MaxParticleEmitters;
251         s32 m_MaxParticleModels;
252         s32 m_MaxAnimatableNodes;
253     };
254 
255     //@}
256 
257     //----------------------------------------
258     //! @name 更新
259     //@{
260 
261     //! シーン解析結果をクリアします。
Clear()262     void Clear()
263     {
264         m_SceneNodes.clear();
265         m_UserRenderNodes.clear();
266         m_Models.clear();
267         m_SkeletalModels.clear();
268         m_Lights.clear();
269         m_FragmentLights.clear();
270         m_VertexLights.clear();
271         m_HemiSphereLights.clear();
272         m_AmbientLights.clear();
273         m_Cameras.clear();
274         m_Fogs.clear();
275         m_ParticleSets.clear();
276         m_ParticleEmitters.clear();
277         m_ParticleModels.clear();
278         m_AnimatableNodes.clear();
279     }
280 
281     //@}
282 
283     //----------------------------------------
284     //! @name 取得/設定
285     //@{
286 
287     //! @brief        直列化シーンノードを追加します。
288     //!
289     //! @param[in]    node 追加するシーンノードです。
290     //!
PushSceneNode(SceneNode * node)291     void PushSceneNode(SceneNode* node)
292     {
293         bool isPushed = m_SceneNodes.push_back(node);
294         NW_ASSERT(isPushed);
295     }
296 
297     //! @brief        直列化シーンノードを追加します。
298     //!
299     //! @param[in]    node 追加するシーンノードです。
300     //!
301     //! @return       追加に成功すると true が返ります。
302     //!
TryPushSceneNode(SceneNode * node)303     bool TryPushSceneNode(SceneNode* node)
304     {
305         bool isPushed = m_SceneNodes.push_back(node);
306         return isPushed;
307     }
308 
309     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
310     //!
311     //! @return       シーンノードの先頭を指すイテレータです。
312     //!
GetSceneNodesBegin()313     SceneNodeArray::iterator GetSceneNodesBegin()
314     {
315         return m_SceneNodes.begin();
316     }
317 
318     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
319     //!
320     //! @return       シーンノードの先頭を指すイテレータです。
321     //!
GetSceneNodesBegin()322     SceneNodeArray::const_iterator GetSceneNodesBegin() const
323     {
324         return m_SceneNodes.begin();
325     }
326 
327     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
328     //!
329     //!  @return       シーンノードの終端を指すイテレータです。
330     //!
GetSceneNodesEnd()331     SceneNodeArray::iterator GetSceneNodesEnd()
332     {
333         return m_SceneNodes.end();
334     }
335 
336     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
337     //!
338     //!  @return       シーンノードの終端を指すイテレータです。
339     //!
GetSceneNodesEnd()340     SceneNodeArray::const_iterator GetSceneNodesEnd() const
341     {
342         return m_SceneNodes.end();
343     }
344 
345     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
346     //!
347     //!  @return       シーンノードの先頭と終端を指すイテレータです。
348     //!
GetSceneNodes()349     std::pair<SceneNodeArray::iterator, SceneNodeArray::iterator> GetSceneNodes()
350     {
351         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
352     }
353 
354     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
355     //!
356     //!  @return       シーンノードの先頭と終端を指すイテレータです。
357     //!
GetSceneNodes()358     std::pair<SceneNodeArray::const_iterator, SceneNodeArray::const_iterator> GetSceneNodes() const
359     {
360         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
361     }
362 
363     //@}
364 
365     //----------------------------------------
366     //! @name UserRenderNode 関連
367     //@{
368 
369     //! @brief        直列化ユーザ定義の描画ノードを追加します。
370     //!
371     //! @param[in]    node 追加するユーザ定義の描画ノードです。
372     //!
PushUserRenderNode(UserRenderNode * node)373     void PushUserRenderNode(UserRenderNode* node)
374     {
375         bool isPushed = m_UserRenderNodes.push_back(node);
376         NW_ASSERT(isPushed);
377     }
378 
379     //! @brief        直列化ユーザ定義の描画ノードを追加します。
380     //!
381     //! @param[in]    node 追加するユーザ定義の描画ノードです。
382     //!
383     //! @return       追加に成功すると true が返ります。
384     //!
TryPushUserRenderNode(UserRenderNode * node)385     bool TryPushUserRenderNode(UserRenderNode* node)
386     {
387         bool isPushed = m_UserRenderNodes.push_back(node);
388         return isPushed;
389     }
390 
391     //! @brief        直列化したユーザ定義の描画ノードの先頭を指すイテレータを取得します。
392     //!
393     //! @return        UserRenderNode の先頭を指すイテレータです。
394     //!
GetUserRenderNodesBegin()395     UserRenderNodeArray::iterator GetUserRenderNodesBegin()
396     {
397         return m_UserRenderNodes.begin();
398     }
399 
400     //! @brief        直列化したユーザ定義の描画ノードの先頭を指すイテレータを取得します。
401     //!
402     //! @return       ユーザ定義の描画ノードの先頭を指すイテレータです。
403     //!
GetUserRenderNodesBegin()404     UserRenderNodeArray::const_iterator GetUserRenderNodesBegin() const
405     {
406         return m_UserRenderNodes.begin();
407     }
408 
409     //!  @brief        直列化したユーザ定義の描画ノードの終端を指すイテレータを取得します。
410     //!
411     //!  @return       ユーザ定義の描画ノードの終端を指すイテレータです。
412     //!
GetUserRenderNodesEnd()413     UserRenderNodeArray::iterator GetUserRenderNodesEnd()
414     {
415         return m_UserRenderNodes.end();
416     }
417 
418     //!  @brief        直列化したユーザ定義の描画ノードの終端を指すイテレータを取得します。
419     //!
420     //!  @return       ユーザ定義の描画ノードの終端を指すイテレータです。
421     //!
GetUserRenderNodesEnd()422     UserRenderNodeArray::const_iterator GetUserRenderNodesEnd() const
423     {
424         return m_UserRenderNodes.end();
425     }
426 
427     //!  @brief        直列化したユーザ定義の描画ノードの先頭と終端を指すイテレータを取得します。
428     //!
429     //!  @return       ユーザ定義の描画ノードの先頭と終端を指すイテレータです。
430     //!
GetUserRenderNodes()431     std::pair<UserRenderNodeArray::iterator, UserRenderNodeArray::iterator> GetUserRenderNodes()
432     {
433         return std::make_pair(m_UserRenderNodes.begin(), m_UserRenderNodes.end());
434     }
435 
436     //!  @brief        直列化したユーザ定義の描画ノードの先頭と終端を指すイテレータを取得します。
437     //!
438     //!  @return       ユーザ定義の描画ノードの先頭と終端を指すイテレータです。
439     //!
GetUserRenderNodes()440     std::pair<UserRenderNodeArray::const_iterator, UserRenderNodeArray::const_iterator> GetUserRenderNodes() const
441     {
442         return std::make_pair(m_UserRenderNodes.begin(), m_UserRenderNodes.end());
443     }
444 
445     //@}
446 
447     //----------------------------------------
448     //! @name モデル関連
449     //@{
450 
451     //! @brief        モデルを追加します。
452     //!               「モデル」には、派生クラス(SkeletalModelなど)も含まれます。
453     //!
454     //! @param[in]    model モデルです。
455     //!
PushModel(Model * model)456     void PushModel(Model* model)
457     {
458         bool isPushed = m_Models.push_back(model);
459         NW_ASSERT(isPushed);
460     }
461 
462     //! @brief        モデルを追加します。
463     //!               「モデル」には、派生クラス(SkeletalModelなど)も含まれます。
464     //!
465     //! @param[in]    model モデルです。
466     //!
467     //! @return       追加に成功すると true が返ります。
468     //!
TryPushModel(Model * model)469     bool TryPushModel(Model* model)
470     {
471         bool isPushed = m_Models.push_back(model);
472         return isPushed;
473     }
474 
475     //!  @brief        モデルの先頭を指すイテレータを取得します。
476     //!
477     //!  @return       モデルの先頭を指すイテレータです。
478     //!
GetModelsBegin()479     ModelArray::iterator GetModelsBegin()
480     {
481         return m_Models.begin();
482     }
483 
484     //!  @brief        モデルの先頭を指すイテレータを取得します。
485     //!
486     //!  @return       モデルの先頭を指すイテレータです。
487     //!
GetModelsBegin()488     ModelArray::const_iterator GetModelsBegin() const
489     {
490         return m_Models.begin();
491     }
492 
493     //!  @brief        モデルの終端を指すイテレータを取得します。
494     //!
495     //!  @return       モデルの終端を指すイテレータです。
496     //!
GetModelsEnd()497     ModelArray::iterator GetModelsEnd()
498     {
499         return m_Models.end();
500     }
501 
502     //!  @brief        モデルの終端を指すイテレータを取得します。
503     //!
504     //!  @return       モデルの終端を指すイテレータです。
505     //!
GetModelsEnd()506     ModelArray::const_iterator GetModelsEnd() const
507     {
508         return m_Models.end();
509     }
510 
511     //! @brief        スケルタルモデルを追加します。
512     //!
513     //! @param[in]    skeletalModel スケルタルモデルです。
514     //!
PushSkeletalModel(SkeletalModel * skeletalModel)515     void PushSkeletalModel(SkeletalModel* skeletalModel)
516     {
517         bool isPushed = m_SkeletalModels.push_back(skeletalModel);
518         NW_ASSERT(isPushed);
519     }
520 
521     //! @brief        スケルタルモデルを追加します。
522     //!
523     //! @param[in]    skeletalModel スケルタルモデルです。
524     //!
525     //! @return       追加に成功すると true が返ります。
526     //!
TryPushSkeletalModel(SkeletalModel * skeletalModel)527     bool TryPushSkeletalModel(SkeletalModel* skeletalModel)
528     {
529         bool isPushed = m_SkeletalModels.push_back(skeletalModel);
530         return isPushed;
531     }
532 
533     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
534     //!
535     //!  @return       スケルタルモデルの先頭を指すイテレータです。
536     //!
GetSkeletalModelsBegin()537     SkeletalModelArray::iterator GetSkeletalModelsBegin()
538     {
539         return m_SkeletalModels.begin();
540     }
541 
542     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
543     //!
544     //!  @return       スケルタルモデルの先頭を指すイテレータです。
545     //!
GetSkeletalModelsBegin()546     SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const
547     {
548         return m_SkeletalModels.begin();
549     }
550 
551     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
552     //!
553     //!  @return       スケルタルモデルの終端を指すイテレータです。
554     //!
GetSkeletalModelsEnd()555     SkeletalModelArray::iterator GetSkeletalModelsEnd()
556     {
557         return m_SkeletalModels.end();
558     }
559 
560     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
561     //!
562     //!  @return       スケルタルモデルの終端を指すイテレータです。
563     //!
GetSkeletalModelsEnd()564     SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const
565     {
566         return m_SkeletalModels.end();
567     }
568 
569     //@}
570 
571     //----------------------------------------
572     //! @name ライト関連
573     //@{
574 
575     //! @brief        ライトを追加します。
576     //!               「ライト」には、派生クラス(FragmentLightなど)も含まれます。
577     //!
578     //! @param[in]    light ライトです。
579     //!
PushLight(Light * light)580     void PushLight(Light* light)
581     {
582         bool isPushed = m_Lights.push_back(light);
583         NW_ASSERT(isPushed);
584     }
585 
586     //! @brief        ライトを追加します。
587     //!               「ライト」には、派生クラス(FragmentLightなど)も含まれます。
588     //!
589     //! @param[in]    light ライトです。
590     //!
591     //! @return       追加に成功すると true が返ります。
592     //!
TryPushLight(Light * light)593     bool TryPushLight(Light* light)
594     {
595         bool isPushed = m_Lights.push_back(light);
596         return isPushed;
597     }
598 
599     //!  @brief        ライトの先頭を指すイテレータを取得します。
600     //!
601     //!  @return       ライトの先頭を指すイテレータです。
602     //!
GetLightsBegin()603     LightArray::iterator GetLightsBegin()
604     {
605         return m_Lights.begin();
606     }
607 
608     //!  @brief        ライトの先頭を指すイテレータを取得します。
609     //!
610     //!  @return       ライトの先頭を指すイテレータです。
611     //!
GetLightsBegin()612     LightArray::const_iterator GetLightsBegin() const
613     {
614         return m_Lights.begin();
615     }
616 
617     //!  @brief        ライトの終端を指すイテレータを取得します。
618     //!
619     //!  @return       ライトの終端を指すイテレータです。
620     //!
GetLightsEnd()621     LightArray::iterator GetLightsEnd()
622     {
623         return m_Lights.end();
624     }
625 
626     //!  @brief        ライトの終端を指すイテレータを取得します。
627     //!
628     //!  @return       ライトの終端を指すイテレータです。
629     //!
GetLightsEnd()630     LightArray::const_iterator GetLightsEnd() const
631     {
632         return m_Lights.end();
633     }
634 
635     //! @brief        フラグメントライトを追加します。
636     //!
637     //! @param[in]    light フラグメントライトです。
638     //!
PushFragmentLight(FragmentLight * light)639     void PushFragmentLight(FragmentLight* light)
640     {
641         bool isPushed = m_FragmentLights.push_back(light);
642         NW_ASSERT(isPushed);
643     }
644 
645     //! @brief        フラグメントライトを追加します。
646     //!
647     //! @param[in]    light フラグメントライトです。
648     //!
649     //! @return       追加に成功すると true が返ります。
650     //!
TryPushFragmentLight(FragmentLight * light)651     bool TryPushFragmentLight(FragmentLight* light)
652     {
653         bool isPushed = m_FragmentLights.push_back(light);
654         return isPushed;
655     }
656 
657     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
658     //!
659     //!  @return       フラグメントライトの先頭を指すイテレータです。
660     //!
GetFragmentLightsBegin()661     FragmentLightArray::iterator GetFragmentLightsBegin()
662     {
663         return m_FragmentLights.begin();
664     }
665 
666     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
667     //!
668     //!  @return       フラグメントライトの先頭を指すイテレータです。
669     //!
GetFragmentLightsBegin()670     FragmentLightArray::const_iterator GetFragmentLightsBegin() const
671     {
672         return m_FragmentLights.begin();
673     }
674 
675     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
676     //!
677     //!  @return       フラグメントライトの終端を指すイテレータです。
678     //!
GetFragmentLightsEnd()679     FragmentLightArray::iterator GetFragmentLightsEnd()
680     {
681         return m_FragmentLights.end();
682     }
683 
684     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
685     //!
686     //!  @return       フラグメントライトの終端を指すイテレータです。
687     //!
GetFragmentLightsEnd()688     FragmentLightArray::const_iterator GetFragmentLightsEnd() const
689     {
690         return m_FragmentLights.end();
691     }
692 
693     //! @brief        頂点ライトを追加します。
694     //!
695     //! @param[in]    light 頂点ライトです。
696     //!
PushVertexLight(VertexLight * light)697     void PushVertexLight(VertexLight* light)
698     {
699         bool isPushed = m_VertexLights.push_back(light);
700         NW_ASSERT(isPushed);
701     }
702 
703     //! @brief        頂点ライトを追加します。
704     //!
705     //! @param[in]    light 頂点ライトです。
706     //!
707     //! @return       追加に成功すると true が返ります。
708     //!
TryPushVertexLight(VertexLight * light)709     bool TryPushVertexLight(VertexLight* light)
710     {
711         bool isPushed = m_VertexLights.push_back(light);
712         return isPushed;
713     }
714 
715     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
716     //!
717     //!  @return        頂点ライトの先頭を指すイテレータです。
718     //!
GetVertexLightsBegin()719     VertexLightArray::iterator GetVertexLightsBegin()
720     {
721         return m_VertexLights.begin();
722     }
723 
724     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
725     //!
726     //!  @return        頂点ライトの先頭を指すイテレータです。
727     //!
GetVertexLightsBegin()728     VertexLightArray::const_iterator GetVertexLightsBegin() const
729     {
730         return m_VertexLights.begin();
731     }
732 
733     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
734     //!
735     //!  @return        頂点ライトの終端を指すイテレータです。
736     //!
GetVertexLightsEnd()737     VertexLightArray::iterator GetVertexLightsEnd()
738     {
739         return m_VertexLights.end();
740     }
741 
742     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
743     //!
744     //!  @return        頂点ライトの終端を指すイテレータです。
745     //!
GetVertexLightsEnd()746     VertexLightArray::const_iterator GetVertexLightsEnd() const
747     {
748         return m_VertexLights.end();
749     }
750 
751     //! @brief        半球ライトを追加します。
752     //!
753     //! @param[in]    light 半球ライトです。
754     //!
PushHemiSphereLight(HemiSphereLight * light)755     void PushHemiSphereLight(HemiSphereLight* light)
756     {
757         bool isPushed = m_HemiSphereLights.push_back(light);
758         NW_ASSERT(isPushed);
759     }
760 
761     //! @brief        半球ライトを追加します。
762     //!
763     //! @param[in]    light 半球ライトです。
764     //!
765     //! @return       追加に成功すると true が返ります。
766     //!
TryPushHemiSphereLight(HemiSphereLight * light)767     bool TryPushHemiSphereLight(HemiSphereLight* light)
768     {
769         bool isPushed = m_HemiSphereLights.push_back(light);
770         return isPushed;
771     }
772 
773     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
774     //!
775     //!  @return       半球ライトの先頭を指すイテレータです。
776     //!
GetHemiSphereLightsBegin()777     HemiSphereLightArray::iterator GetHemiSphereLightsBegin()
778     {
779         return m_HemiSphereLights.begin();
780     }
781 
782     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
783     //!
784     //!  @return       半球ライトの先頭を指すイテレータです。
785     //!
GetHemiSphereLightsBegin()786     HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const
787     {
788         return m_HemiSphereLights.begin();
789     }
790 
791     //!  @brief        半球ライトの終端を指すイテレータを取得します。
792     //!
793     //!  @return       半球ライトの終端を指すイテレータです。
794     //!
GetHemiSphereLightsEnd()795     HemiSphereLightArray::iterator GetHemiSphereLightsEnd()
796     {
797         return m_HemiSphereLights.end();
798     }
799 
800     //!  @brief        半球ライトの終端を指すイテレータを取得します。
801     //!
802     //!  @return       半球ライトの終端を指すイテレータです。
803     //!
GetHemiSphereLightsEnd()804     HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const
805     {
806         return m_HemiSphereLights.end();
807     }
808 
809     //! @brief        アンビエントライトを追加します。
810     //!
811     //! @param[in]    light アンビエントライトです。
812     //!
PushAmbientLight(AmbientLight * light)813     void PushAmbientLight(AmbientLight* light)
814     {
815         bool isPushed = m_AmbientLights.push_back(light);
816         NW_ASSERT(isPushed);
817     }
818 
819     //! @brief        アンビエントライトを追加します。
820     //!
821     //! @param[in]    light アンビエントライトです。
822     //!
823     //! @return       追加に成功すると true が返ります。
824     //!
TryPushAmbientLight(AmbientLight * light)825     bool TryPushAmbientLight(AmbientLight* light)
826     {
827         bool isPushed = m_AmbientLights.push_back(light);
828         return isPushed;
829     }
830 
831     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
832     //!
833     //!  @return       アンビエントライトの先頭を指すイテレータです。
834     //!
GetAmbientLightsBegin()835     AmbientLightArray::iterator GetAmbientLightsBegin()
836     {
837         return m_AmbientLights.begin();
838     }
839 
840     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
841     //!
842     //!  @return       アンビエントライトの先頭を指すイテレータです。
843     //!
GetAmbientLightsBegin()844     AmbientLightArray::const_iterator GetAmbientLightsBegin() const
845     {
846         return m_AmbientLights.begin();
847     }
848 
849     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
850     //!
851     //!  @return       アンビエントライトの終端を指すイテレータです。
852     //!
GetAmbientLightsEnd()853     AmbientLightArray::iterator GetAmbientLightsEnd()
854     {
855         return m_AmbientLights.end();
856     }
857 
858     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
859     //!
860     //!  @return       アンビエントライトの終端を指すイテレータです。
861     //!
GetAmbientLightsEnd()862     AmbientLightArray::const_iterator GetAmbientLightsEnd() const
863     {
864         return m_AmbientLights.end();
865     }
866 
867     //@}
868 
869     //----------------------------------------
870     //! @name カメラ関連
871     //@{
872 
873     //! @brief        カメラを追加します。
874     //!
875     //! @param[in]    camera カメラです。
876     //!
PushCamera(Camera * camera)877     void PushCamera(Camera* camera)
878     {
879         bool isPushed = m_Cameras.push_back(camera);
880         NW_ASSERT(isPushed);
881     }
882 
883     //! @brief        カメラを追加します。
884     //!
885     //! @param[in]    camera カメラです。
886     //!
887     //! @return       追加に成功すると true が返ります。
888     //!
TryPushCamera(Camera * camera)889     bool TryPushCamera(Camera* camera)
890     {
891         bool isPushed = m_Cameras.push_back(camera);
892         return isPushed;
893     }
894 
895     //!  @brief        カメラの先頭を指すイテレータを取得します。
896     //!
897     //!  @return       カメラの先頭を指すイテレータです。
898     //!
GetCameraBegin()899     CameraArray::iterator GetCameraBegin()
900     {
901         return m_Cameras.begin();
902     }
903 
904     //!  @brief        カメラの先頭を指すイテレータを取得します。
905     //!
906     //!  @return       カメラの先頭を指すイテレータです。
907     //!
GetCameraBegin()908     CameraArray::const_iterator GetCameraBegin() const
909     {
910         return m_Cameras.begin();
911     }
912 
913     //!  @brief        カメラの終端を指すイテレータを取得します。
914     //!
915     //!  @return       カメラの終端を指すイテレータです。
916     //!
GetCameraEnd()917     CameraArray::iterator GetCameraEnd()
918     {
919         return m_Cameras.end();
920     }
921 
922     //!  @brief        カメラの終端を指すイテレータを取得します。
923     //!
924     //!  @return       カメラの終端を指すイテレータです。
925     //!
GetCameraEnd()926     CameraArray::const_iterator GetCameraEnd() const
927     {
928         return m_Cameras.end();
929     }
930 
931     //@}
932 
933     //----------------------------------------
934     //! @name フォグ関連
935     //@{
936 
937     //! @brief        フォグを追加します。
938     //!
939     //! @param[in]    fog フォグです。
940     //!
PushFog(Fog * fog)941     void PushFog(Fog* fog)
942     {
943         bool isPushed = m_Fogs.push_back(fog);
944         NW_ASSERT(isPushed);
945     }
946 
947     //! @brief        フォグを追加します。
948     //!
949     //! @param[in]    fog フォグです。
950     //!
951     //! @return       追加に成功すると true が返ります。
952     //!
TryPushFog(Fog * fog)953     bool TryPushFog(Fog* fog)
954     {
955         bool isPushed = m_Fogs.push_back(fog);
956         return isPushed;
957     }
958 
959     //!  @brief        フォグの先頭を指すイテレータを取得します。
960     //!
961     //!  @return       フォグの先頭を指すイテレータです。
962     //!
GetFogBegin()963     FogArray::iterator GetFogBegin()
964     {
965         return m_Fogs.begin();
966     }
967 
968     //!  @brief        フォグの先頭を指すイテレータを取得します。
969     //!
970     //!  @return       フォグの先頭を指すイテレータです。
971     //!
GetFogBegin()972     FogArray::const_iterator GetFogBegin() const
973     {
974         return m_Fogs.begin();
975     }
976 
977     //!  @brief        フォグの終端を指すイテレータを取得します。
978     //!
979     //!  @return       フォグの終端を指すイテレータです。
980     //!
GetFogEnd()981     FogArray::iterator GetFogEnd()
982     {
983         return m_Fogs.end();
984     }
985 
986     //!  @brief        フォグの終端を指すイテレータを取得します。
987     //!
988     //!  @return       フォグの終端を指すイテレータです。
989     //!
GetFogEnd()990     FogArray::const_iterator GetFogEnd() const
991     {
992         return m_Fogs.end();
993     }
994 
995     //@}
996 
997     //----------------------------------------
998     //! @name パーティクルセット関連
999     //@{
1000 
1001     //! @brief        パーティクルセットを追加します。
1002     //!
1003     //! @param[in]    particleSet パーティクルセットです。
1004     //!
PushParticleSet(ParticleSet * particleSet)1005     void PushParticleSet(ParticleSet* particleSet)
1006     {
1007         bool isPushed = m_ParticleSets.push_back(particleSet);
1008         NW_ASSERT(isPushed);
1009     }
1010 
1011     //! @brief        パーティクルセットを追加します。
1012     //!
1013     //! @param[in]    particleSet パーティクルセットです。
1014     //!
1015     //! @return       追加に成功すると true が返ります。
1016     //!
TryPushParticleSet(ParticleSet * particleSet)1017     bool TryPushParticleSet(ParticleSet* particleSet)
1018     {
1019         bool isPushed = m_ParticleSets.push_back(particleSet);
1020         return isPushed;
1021     }
1022 
1023     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
1024     //!
1025     //!  @return       パーティクルセットの先頭を指すイテレータです。
1026     //!
GetParticleSetBegin()1027     ParticleSetArray::iterator GetParticleSetBegin()
1028     {
1029         return m_ParticleSets.begin();
1030     }
1031 
1032     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
1033     //!
1034     //!  @return       パーティクルセットの先頭を指すイテレータです。
1035     //!
GetParticleSetBegin()1036     ParticleSetArray::const_iterator GetParticleSetBegin() const
1037     {
1038         return m_ParticleSets.begin();
1039     }
1040 
1041     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
1042     //!
1043     //!  @return       パーティクルセットの終端を指すイテレータです。
1044     //!
GetParticleSetEnd()1045     ParticleSetArray::iterator GetParticleSetEnd()
1046     {
1047         return m_ParticleSets.end();
1048     }
1049 
1050     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
1051     //!
1052     //!  @return       パーティクルセットの終端を指すイテレータです。
1053     //!
GetParticleSetEnd()1054     ParticleSetArray::const_iterator GetParticleSetEnd() const
1055     {
1056         return m_ParticleSets.end();
1057     }
1058 
1059     //@}
1060 
1061     //----------------------------------------
1062     //! @name パーティクルエミッタ関連
1063     //@{
1064 
1065     //! @brief        パーティクルエミッタを追加します。
1066     //!
1067     //! @param[in]    particleEmitter パーティクルエミッタです。
1068     //!
PushParticleEmitter(ParticleEmitter * particleEmitter)1069     void PushParticleEmitter(ParticleEmitter* particleEmitter)
1070     {
1071         bool isPushed = m_ParticleEmitters.push_back(particleEmitter);
1072         NW_ASSERT(isPushed);
1073     }
1074 
1075     //! @brief        パーティクルエミッタを追加します。
1076     //!
1077     //! @param[in]    particleEmitter パーティクルエミッタです。
1078     //!
1079     //! @return       追加に成功すると true が返ります。
1080     //!
TryPushParticleEmitter(ParticleEmitter * particleEmitter)1081     bool TryPushParticleEmitter(ParticleEmitter* particleEmitter)
1082     {
1083         bool isPushed = m_ParticleEmitters.push_back(particleEmitter);
1084         return isPushed;
1085     }
1086 
1087     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
1088     //!
1089     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
1090     //!
GetParticleEmitterBegin()1091     ParticleEmitterArray::iterator GetParticleEmitterBegin()
1092     {
1093         return m_ParticleEmitters.begin();
1094     }
1095 
1096     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
1097     //!
1098     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
1099     //!
GetParticleEmitterBegin()1100     ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const
1101     {
1102         return m_ParticleEmitters.begin();
1103     }
1104 
1105     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
1106     //!
1107     //!  @return       パーティクルエミッタの終端を指すイテレータです。
1108     //!
GetParticleEmitterEnd()1109     ParticleEmitterArray::iterator GetParticleEmitterEnd()
1110     {
1111         return m_ParticleEmitters.end();
1112     }
1113 
1114     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
1115     //!
1116     //!  @return       パーティクルエミッタの終端を指すイテレータです。
1117     //!
GetParticleEmitterEnd()1118     ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const
1119     {
1120         return m_ParticleEmitters.end();
1121     }
1122 
1123     //@}
1124 
1125     //----------------------------------------
1126     //! @name パーティクルモデル関連
1127     //@{
1128 
1129     //! @brief        パーティクルモデルを追加します。
1130     //!
1131     //! @param[in]    particleModel パーティクルモデルです。
1132     //!
PushParticleModel(ParticleModel * particleModel)1133     void PushParticleModel(ParticleModel* particleModel)
1134     {
1135         bool isPushed = m_ParticleModels.push_back(particleModel);
1136         NW_ASSERT(isPushed);
1137     }
1138 
1139     //! @brief        パーティクルモデルを追加します。
1140     //!
1141     //! @param[in]    particleModel パーティクルモデルです。
1142     //!
1143     //! @return       追加に成功すると true が返ります。
1144     //!
TryPushParticleModel(ParticleModel * particleModel)1145     bool TryPushParticleModel(ParticleModel* particleModel)
1146     {
1147         bool isPushed = m_ParticleModels.push_back(particleModel);
1148         return isPushed;
1149     }
1150 
1151     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
1152     //!
1153     //!  @return       パーティクルモデルの先頭を指すイテレータです。
1154     //!
GetParticleModelBegin()1155     ParticleModelArray::iterator GetParticleModelBegin()
1156     {
1157         return m_ParticleModels.begin();
1158     }
1159 
1160     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
1161     //!
1162     //!  @return       パーティクルモデルの先頭を指すイテレータです。
1163     //!
GetParticleModelBegin()1164     ParticleModelArray::const_iterator GetParticleModelBegin() const
1165     {
1166         return m_ParticleModels.begin();
1167     }
1168 
1169     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
1170     //!
1171     //!  @return       パーティクルモデルの終端を指すイテレータです。
1172     //!
GetParticleModelEnd()1173     ParticleModelArray::iterator GetParticleModelEnd()
1174     {
1175         return m_ParticleModels.end();
1176     }
1177 
1178     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
1179     //!
1180     //!  @return       パーティクルモデルの終端を指すイテレータです。
1181     //!
GetParticleModelEnd()1182     ParticleModelArray::const_iterator GetParticleModelEnd() const
1183     {
1184         return m_ParticleModels.end();
1185     }
1186 
1187     //@}
1188 
1189     //! @name アニメーション関連
1190     //@{
1191 
1192     //! @brief        アニメーションを行うノードを追加します。
1193     //!
1194     //! アニメーションを行わないノードについては、引数に渡されても無視します。
1195     //!
1196     //! @param[in]    sceneNode アニメーションを行うノードです。
1197     //!
PushAnimatableNode(SceneNode * sceneNode)1198     void PushAnimatableNode(SceneNode* sceneNode)
1199     {
1200         if (sceneNode->GetAnimBinding() != NULL)
1201         {
1202             bool isPushed = m_AnimatableNodes.push_back(sceneNode);
1203             NW_ASSERT(isPushed);
1204         }
1205     }
1206 
1207     //! @brief        アニメーションを行うノードを追加します。
1208     //!
1209     //! アニメーションを行わないノードについては、引数に渡されても無視します。
1210     //!
1211     //! @param[in]    sceneNode アニメーションを行うノードです。
1212     //!
1213     //! @return       追加に成功すると true が返ります。
1214     //!
TryPushAnimatableNode(SceneNode * sceneNode)1215     bool TryPushAnimatableNode(SceneNode* sceneNode)
1216     {
1217         bool isPushed = true;
1218         if (sceneNode->GetAnimBinding() != NULL)
1219         {
1220             isPushed = m_AnimatableNodes.push_back(sceneNode);
1221         }
1222         return isPushed;
1223     }
1224 
1225     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
1226     //!
1227     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
1228     //!
GetAnimatableNodesBegin()1229     AnimatableNodeArray::iterator GetAnimatableNodesBegin()
1230     {
1231         return m_AnimatableNodes.begin();
1232     }
1233 
1234     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
1235     //!
1236     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
1237     //!
GetAnimatableNodesBegin()1238     AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const
1239     {
1240         return m_AnimatableNodes.begin();
1241     }
1242 
1243     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
1244     //!
1245     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
1246     //!
GetAnimatableNodesEnd()1247     AnimatableNodeArray::iterator GetAnimatableNodesEnd()
1248     {
1249         return m_AnimatableNodes.end();
1250     }
1251 
1252     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
1253     //!
1254     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
1255     //!
GetAnimatableNodesEnd()1256     AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const
1257     {
1258         return m_AnimatableNodes.end();
1259     }
1260 
1261     //@}
1262 
1263 private:
SceneContext(os::IAllocator * allocator,SceneNodeArray sceneNodes,UserRenderNodeArray userRenderNodes,ModelArray models,SkeletalModelArray skeletalModels,CameraArray cameras,FogArray fogs,LightArray lights,FragmentLightArray fragmentLights,VertexLightArray vertexLights,HemiSphereLightArray hemiSphereLights,AmbientLightArray ambientLights,ParticleSetArray particleSets,ParticleEmitterArray particleEmitters,ParticleModelArray particleModels,AnimatableNodeArray animatableNodes)1264     SceneContext(
1265         os::IAllocator* allocator,
1266         SceneNodeArray sceneNodes,
1267         UserRenderNodeArray userRenderNodes,
1268         ModelArray models,
1269         SkeletalModelArray skeletalModels,
1270         CameraArray cameras,
1271         FogArray fogs,
1272         LightArray lights,
1273         FragmentLightArray fragmentLights,
1274         VertexLightArray vertexLights,
1275         HemiSphereLightArray hemiSphereLights,
1276         AmbientLightArray ambientLights,
1277         ParticleSetArray particleSets,
1278         ParticleEmitterArray particleEmitters,
1279         ParticleModelArray particleModels,
1280         AnimatableNodeArray animatableNodes)
1281     : GfxObject(allocator),
1282       m_SceneNodes(sceneNodes),
1283       m_UserRenderNodes(userRenderNodes),
1284       m_Models(models),
1285       m_SkeletalModels(skeletalModels),
1286       m_Cameras(cameras),
1287       m_Fogs(fogs),
1288       m_Lights(lights),
1289       m_FragmentLights(fragmentLights),
1290       m_VertexLights(vertexLights),
1291       m_HemiSphereLights(hemiSphereLights),
1292       m_AmbientLights(ambientLights),
1293       m_ParticleSets(particleSets),
1294       m_ParticleEmitters(particleEmitters),
1295       m_ParticleModels(particleModels),
1296       m_AnimatableNodes(animatableNodes)
1297     {}
~SceneContext()1298     virtual ~SceneContext() {}
1299 
1300     SceneNodeArray m_SceneNodes;
1301     UserRenderNodeArray m_UserRenderNodes;
1302     ModelArray m_Models;
1303     SkeletalModelArray m_SkeletalModels;
1304     CameraArray m_Cameras;
1305     FogArray m_Fogs;
1306     LightArray m_Lights;
1307     FragmentLightArray m_FragmentLights;
1308     VertexLightArray m_VertexLights;
1309     HemiSphereLightArray m_HemiSphereLights;
1310     AmbientLightArray m_AmbientLights;
1311     ParticleSetArray m_ParticleSets;
1312     ParticleEmitterArray m_ParticleEmitters;
1313     ParticleModelArray m_ParticleModels;
1314     AnimatableNodeArray m_AnimatableNodes;
1315 };
1316 
1317 } // namespace gfx
1318 } // namespace nw
1319 
1320 #endif // NW_GFX_SCENECONTEXT_H_
1321