1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_SceneContext.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: 24971 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_GFX_SCENECONTEXT_H_
17 #define NW_GFX_SCENECONTEXT_H_
18 
19 #include <nw/gfx/gfx_GfxObject.h>
20 
21 namespace nw
22 {
23 namespace gfx
24 {
25 
26 class SceneNode;
27 class Model;
28 class SkeletalModel;
29 class Light;
30 class FragmentLight;
31 class VertexLight;
32 class HemiSphereLight;
33 class AmbientLight;
34 class Camera;
35 class Fog;
36 class ParticleSet;
37 class ParticleEmitter;
38 class ParticleModel;
39 class LightSet;
40 
41 //! @brief シーンノードの Array の定義です。
42 typedef ut::MoveArray<SceneNode*> SceneNodeArray;
43 
44 //! @brief モデルの Array の定義です。
45 typedef ut::MoveArray<Model*> ModelArray;
46 
47 //! @brief スケルタルモデルの Array の定義です。
48 typedef ut::MoveArray<SkeletalModel*> SkeletalModelArray;
49 
50 //! @brief ライトの Array の定義です。
51 typedef ut::MoveArray<Light*> LightArray;
52 
53 //! @brief フラグメントライトの Array の定義です。
54 typedef ut::MoveArray<FragmentLight*> FragmentLightArray;
55 
56 //! @brief 頂点ライトの Array の定義です。
57 typedef ut::MoveArray<VertexLight*> VertexLightArray;
58 
59 //! @brief 半球ライトの Array の定義です。
60 typedef ut::MoveArray<HemiSphereLight*> HemiSphereLightArray;
61 
62 //! @brief アンビエントライトの Array の定義です。
63 typedef ut::MoveArray<AmbientLight*> AmbientLightArray;
64 
65 //! @brief カメラの Array の定義です。
66 typedef ut::MoveArray<Camera*> CameraArray;
67 
68 //! @brief フォグの Array の定義です。
69 typedef ut::MoveArray<Fog*> FogArray;
70 
71 //! @brief パーティクルセットの Array の定義です。
72 typedef ut::MoveArray<ParticleSet*> ParticleSetArray;
73 
74 //! @brief パーティクルエミッタの Array の定義です。
75 typedef ut::MoveArray<ParticleEmitter*> ParticleEmitterArray;
76 
77 //! @brief パーティクルモデルの Array の定義です。
78 typedef ut::MoveArray<ParticleModel*> ParticleModelArray;
79 
80 //! @brief ライトセットの配列です。
81 typedef ut::MoveArray<LightSet*> LightSetArray;
82 
83 //! @brief アニメーションするノードの Array の定義です。
84 typedef ut::MoveArray<SceneNode*> AnimatableNodeArray;
85 
86 //---------------------------------------------------------------------------
87 //! @brief        シーン解析時の内容を保持させるためのクラスです。
88 //---------------------------------------------------------------------------
89 class SceneContext : public GfxObject
90 {
91 private:
92     NW_DISALLOW_COPY_AND_ASSIGN(SceneContext);
93 
94 public:
95 
96     // [非推奨] 互換性のために残してありますが、こちらの定義は用いないでください。
97 
98     //! @details :private
99     typedef SceneNodeArray SceneNodeArray;
100     //! @details :private
101     typedef ModelArray ModelArray;
102     //! @details :private
103     typedef SkeletalModelArray SkeletalModelArray;
104     //! @details :private
105     typedef FragmentLightArray FragmentLightArray;
106     //! @details :private
107     typedef VertexLightArray VertexLightArray;
108     //! @details :private
109     typedef HemiSphereLightArray HemiSphereLightArray;
110     //! @details :private
111     typedef AmbientLightArray AmbientLightArray;
112     //! @details :private
113     typedef CameraArray CameraArray;
114     //! @details :private
115     typedef FogArray FogArray;
116     //! @details :private
117     typedef ParticleSetArray ParticleSetArray;
118     //! @details :private
119     typedef ParticleEmitterArray ParticleEmitterArray;
120     //! @details :private
121     typedef ParticleModelArray ParticleModelArray;
122 
123     enum
124     {
125         DEFAULT_MAX_SCENE_NODES = 64, //!< シーンノードのデフォルト最大数です。
126         DEFAULT_MAX_MODELS = 64, //!< モデルのデフォルト最大数です。
127         DEFAULT_MAX_SKELETAL_MODELS = 64, //!< スケルタルモデルのデフォルト最大数です。
128         DEFAULT_MAX_CAMERAS = 4, //!< カメラのデフォルト最大数です。
129         DEFAULT_MAX_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。
130         DEFAULT_MAX_FRAGMENT_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。
131         DEFAULT_MAX_VERTEX_LIGHTS = 8, //!< 頂点ライトのデフォルト最大数です。
132         DEFAULT_MAX_HEMISPHERE_LIGHTS = 4, //!< 半球ライトのデフォルト最大数です。
133         DEFAULT_MAX_AMBIENT_LIGHTS = 4, //!< アンビエントライトのデフォルト最大数です。
134         DEFAULT_MAX_FOGS = 4, //!< フォグのデフォルト最大数です。
135         DEFAULT_MAX_PARTICLESETS = 64, //!< パーティクルセットのデフォルト最大数です。
136         DEFAULT_MAX_PARTICLEEMITTERS = 64, //!< パーティクルエミッタのデフォルト最大数です。
137         DEFAULT_MAX_PARTICLEMODELS = 64, //!< パーティクルモデルのデフォルト最大数です。
138         DEFAULT_MAX_ANIMATABLE_NODES = 64 //!< アニメーションを行うシーンノードのデフォルト最大数です。
139     };
140 
141     //----------------------------------------
142     //! @name 作成
143     //@{
144 
145     //! @brief シーンコンテキストクラスを構築するためのクラスです。
146     //!
147     //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。
148     class Builder
149     {
150     public:
Builder()151         Builder()
152         : m_IsFixedSizeMemory(true),
153           m_MaxSceneNodes(DEFAULT_MAX_SCENE_NODES),
154           m_MaxModels(DEFAULT_MAX_MODELS),
155           m_MaxSkeletalModels(DEFAULT_MAX_SKELETAL_MODELS),
156           m_MaxCameras(DEFAULT_MAX_CAMERAS),
157           m_MaxLights(DEFAULT_MAX_LIGHTS),
158           m_MaxFragmentLights(DEFAULT_MAX_FRAGMENT_LIGHTS),
159           m_MaxVertexLights(DEFAULT_MAX_VERTEX_LIGHTS),
160           m_MaxHemiSphereLights(DEFAULT_MAX_HEMISPHERE_LIGHTS),
161           m_MaxAmbientLights(DEFAULT_MAX_AMBIENT_LIGHTS),
162           m_MaxFogs(DEFAULT_MAX_FOGS),
163           m_MaxParticleSets(DEFAULT_MAX_PARTICLESETS),
164           m_MaxParticleEmitters(DEFAULT_MAX_PARTICLEEMITTERS),
165           m_MaxParticleModels(DEFAULT_MAX_PARTICLEMODELS),
166           m_MaxAnimatableNodes(DEFAULT_MAX_ANIMATABLE_NODES)
167           {}
168 
169         //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。
170         //!
171         //!        true を指定すると、生成時のみ固定サイズのメモリ確保を行います。
172         //!
173         //!        false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。
IsFixedSizeMemory(bool isFixedSizeMemory)174         Builder& IsFixedSizeMemory(bool isFixedSizeMemory)
175         {
176             m_IsFixedSizeMemory = isFixedSizeMemory;
177             return *this;
178         }
179 
180         //! @brief シーンノードの最大数を設定します。
MaxSceneNodes(s32 max)181         Builder& MaxSceneNodes(s32 max) { m_MaxSceneNodes = max; return *this; }
182 
183         //! @brief モデルの最大数を設定します。
MaxModels(s32 max)184         Builder& MaxModels(s32 max) { m_MaxModels = max; return *this; }
185 
186         //! @brief スケルタルモデルの最大数を設定します。
MaxSkeletalModels(s32 max)187         Builder& MaxSkeletalModels(s32 max) { m_MaxSkeletalModels = max; return *this; }
188 
189         //! @brief カメラの最大数を設定します。
MaxCameras(s32 max)190         Builder& MaxCameras(s32 max) { m_MaxCameras = max; return *this; }
191 
192         //! @brief ライトの最大数を設定します。
MaxLights(s32 max)193         Builder& MaxLights(s32 max) { m_MaxLights = max; return *this; }
194 
195         //! @brief フラグメントライトの最大数を設定します。
MaxFragmentLights(s32 max)196         Builder& MaxFragmentLights(s32 max) { m_MaxFragmentLights = max; return *this; }
197 
198         //! @brief 頂点ライトの最大数を設定します。
MaxVertexLights(s32 max)199         Builder& MaxVertexLights(s32 max) { m_MaxVertexLights = max; return *this; }
200 
201         //! @brief 半球ライトの最大数を設定します。
MaxHemiSphereLights(s32 max)202         Builder& MaxHemiSphereLights(s32 max) { m_MaxHemiSphereLights = max; return *this; }
203 
204         //! @brief アンビエントライトの最大数を設定します。
MaxAmbientLights(s32 max)205         Builder& MaxAmbientLights(s32 max) { m_MaxAmbientLights = max; return *this; }
206 
207         //! @brief フォグの最大数を設定します。
MaxFogs(s32 max)208         Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; }
209 
210         //! @brief パーティクルセットの最大数を設定します。
MaxParticleSets(s32 max)211         Builder& MaxParticleSets(s32 max) { m_MaxParticleSets = max; return *this; }
212 
213         //! @brief パーティクルエミッタの最大数を設定します。
MaxParticleEmitters(s32 max)214         Builder& MaxParticleEmitters(s32 max) { m_MaxParticleEmitters = max; return *this; }
215 
216         //! @brief パーティクルモデルの最大数を設定します。
MaxParticleModels(s32 max)217         Builder& MaxParticleModels(s32 max) { m_MaxParticleModels = max; return *this; }
218 
219         //! @brief アニメーションを行うシーンノードの最大数を設定します。
MaxAnimatableNodes(s32 max)220         Builder& MaxAnimatableNodes(s32 max) { m_MaxAnimatableNodes = max; return *this; }
221 
222         //! @brief シーンコンテキストを生成します。
223         SceneContext* Create(os::IAllocator* allocator);
224 
225     private:
226         bool m_IsFixedSizeMemory;
227         s32 m_MaxSceneNodes;
228         s32 m_MaxModels;
229         s32 m_MaxSkeletalModels;
230         s32 m_MaxCameras;
231         s32 m_MaxLights;
232         s32 m_MaxFragmentLights;
233         s32 m_MaxVertexLights;
234         s32 m_MaxHemiSphereLights;
235         s32 m_MaxAmbientLights;
236         s32 m_MaxFogs;
237         s32 m_MaxParticleSets;
238         s32 m_MaxParticleEmitters;
239         s32 m_MaxParticleModels;
240         s32 m_MaxAnimatableNodes;
241     };
242 
243     //@}
244 
245     //----------------------------------------
246     //! @name 更新
247     //@{
248 
249     //! シーン解析結果をクリアします。
Clear()250     void Clear()
251     {
252         m_SceneNodes.clear();
253         m_Models.clear();
254         m_SkeletalModels.clear();
255         m_Lights.clear();
256         m_FragmentLights.clear();
257         m_VertexLights.clear();
258         m_HemiSphereLights.clear();
259         m_AmbientLights.clear();
260         m_Cameras.clear();
261         m_Fogs.clear();
262         m_ParticleSets.clear();
263         m_ParticleEmitters.clear();
264         m_ParticleModels.clear();
265         m_AnimatableNodes.clear();
266     }
267 
268     //@}
269 
270     //----------------------------------------
271     //! @name 取得/設定
272     //@{
273 
274     //! @brief        直列化シーンノードを追加します。
275     //!
276     //! @param[in]    node 追加するシーンノードです。
277     //!
PushSceneNode(SceneNode * node)278     void PushSceneNode(SceneNode* node)
279     {
280         bool isPushed = m_SceneNodes.push_back(node);
281         NW_ASSERT(isPushed);
282     }
283 
284     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
285     //!
286     //! @return       シーンノードの先頭を指すイテレータです。
287     //!
GetSceneNodesBegin()288     SceneNodeArray::iterator GetSceneNodesBegin()
289     {
290         return m_SceneNodes.begin();
291     }
292 
293     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
294     //!
295     //! @return       シーンノードの先頭を指すイテレータです。
296     //!
GetSceneNodesBegin()297     SceneNodeArray::const_iterator GetSceneNodesBegin() const
298     {
299         return m_SceneNodes.begin();
300     }
301 
302     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
303     //!
304     //!  @return       シーンノードの終端を指すイテレータです。
305     //!
GetSceneNodesEnd()306     SceneNodeArray::iterator GetSceneNodesEnd()
307     {
308         return m_SceneNodes.end();
309     }
310 
311     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
312     //!
313     //!  @return       シーンノードの終端を指すイテレータです。
314     //!
GetSceneNodesEnd()315     SceneNodeArray::const_iterator GetSceneNodesEnd() const
316     {
317         return m_SceneNodes.end();
318     }
319 
320     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
321     //!
322     //!  @return       シーンノードの先頭と終端を指すイテレータです。
323     //!
GetSceneNodes()324     std::pair<SceneNodeArray::iterator, SceneNodeArray::iterator> GetSceneNodes()
325     {
326         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
327     }
328 
329     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
330     //!
331     //!  @return       シーンノードの先頭と終端を指すイテレータです。
332     //!
GetSceneNodes()333     std::pair<SceneNodeArray::const_iterator, SceneNodeArray::const_iterator> GetSceneNodes() const
334     {
335         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
336     }
337 
338     //@}
339 
340     //----------------------------------------
341     //! @name モデル関連
342     //@{
343 
344     //! @brief        モデルを追加します。
345     //!               「モデル」には、派生クラス(SkeletalModelなど)も含まれます。
346     //!
347     //! @param[in]    model モデルです。
348     //!
PushModel(Model * model)349     void PushModel(Model* model)
350     {
351         bool isPushed = m_Models.push_back(model);
352         NW_ASSERT(isPushed);
353     }
354 
355     //!  @brief        モデルの先頭を指すイテレータを取得します。
356     //!
357     //!  @return       モデルの先頭を指すイテレータです。
358     //!
GetModelsBegin()359     ModelArray::iterator GetModelsBegin()
360     {
361         return m_Models.begin();
362     }
363 
364     //!  @brief        モデルの先頭を指すイテレータを取得します。
365     //!
366     //!  @return       モデルの先頭を指すイテレータです。
367     //!
GetModelsBegin()368     ModelArray::const_iterator GetModelsBegin() const
369     {
370         return m_Models.begin();
371     }
372 
373     //!  @brief        モデルの終端を指すイテレータを取得します。
374     //!
375     //!  @return       モデルの終端を指すイテレータです。
376     //!
GetModelsEnd()377     ModelArray::iterator GetModelsEnd()
378     {
379         return m_Models.end();
380     }
381 
382     //!  @brief        モデルの終端を指すイテレータを取得します。
383     //!
384     //!  @return       モデルの終端を指すイテレータです。
385     //!
GetModelsEnd()386     ModelArray::const_iterator GetModelsEnd() const
387     {
388         return m_Models.end();
389     }
390 
391     //! @brief        スケルタルモデルを追加します。
392     //!
393     //! @param[in]    skeletalModel スケルタルモデルです。
394     //!
PushSkeletalModel(SkeletalModel * skeletalModel)395     void PushSkeletalModel(SkeletalModel* skeletalModel)
396     {
397         bool isPushed = m_SkeletalModels.push_back(skeletalModel);
398         NW_ASSERT(isPushed);
399     }
400 
401     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
402     //!
403     //!  @return       スケルタルモデルの先頭を指すイテレータです。
404     //!
GetSkeletalModelsBegin()405     SkeletalModelArray::iterator GetSkeletalModelsBegin()
406     {
407         return m_SkeletalModels.begin();
408     }
409 
410     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
411     //!
412     //!  @return       スケルタルモデルの先頭を指すイテレータです。
413     //!
GetSkeletalModelsBegin()414     SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const
415     {
416         return m_SkeletalModels.begin();
417     }
418 
419     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
420     //!
421     //!  @return       スケルタルモデルの終端を指すイテレータです。
422     //!
GetSkeletalModelsEnd()423     SkeletalModelArray::iterator GetSkeletalModelsEnd()
424     {
425         return m_SkeletalModels.end();
426     }
427 
428     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
429     //!
430     //!  @return       スケルタルモデルの終端を指すイテレータです。
431     //!
GetSkeletalModelsEnd()432     SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const
433     {
434         return m_SkeletalModels.end();
435     }
436 
437     //@}
438 
439     //----------------------------------------
440     //! @name ライト関連
441     //@{
442 
443     //! @brief        ライトを追加します。
444     //!               「ライト」には、派生クラス(FragmentLightなど)も含まれます。
445     //!
446     //! @param[in]    light ライトです。
447     //!
PushLight(Light * light)448     void PushLight(Light* light)
449     {
450         bool isPushed = m_Lights.push_back(light);
451         NW_ASSERT(isPushed);
452     }
453 
454     //!  @brief        ライトの先頭を指すイテレータを取得します。
455     //!
456     //!  @return       ライトの先頭を指すイテレータです。
457     //!
GetLightsBegin()458     LightArray::iterator GetLightsBegin()
459     {
460         return m_Lights.begin();
461     }
462 
463     //!  @brief        ライトの先頭を指すイテレータを取得します。
464     //!
465     //!  @return       ライトの先頭を指すイテレータです。
466     //!
GetLightsBegin()467     LightArray::const_iterator GetLightsBegin() const
468     {
469         return m_Lights.begin();
470     }
471 
472     //!  @brief        ライトの終端を指すイテレータを取得します。
473     //!
474     //!  @return       ライトの終端を指すイテレータです。
475     //!
GetLightsEnd()476     LightArray::iterator GetLightsEnd()
477     {
478         return m_Lights.end();
479     }
480 
481     //!  @brief        ライトの終端を指すイテレータを取得します。
482     //!
483     //!  @return       ライトの終端を指すイテレータです。
484     //!
GetLightsEnd()485     LightArray::const_iterator GetLightsEnd() const
486     {
487         return m_Lights.end();
488     }
489 
490     //! @brief        フラグメントライトを追加します。
491     //!
492     //! @param[in]    light フラグメントライトです。
493     //!
PushFragmentLight(FragmentLight * light)494     void PushFragmentLight(FragmentLight* light)
495     {
496         bool isPushed = m_FragmentLights.push_back(light);
497         NW_ASSERT(isPushed);
498     }
499 
500     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
501     //!
502     //!  @return       フラグメントライトの先頭を指すイテレータです。
503     //!
GetFragmentLightsBegin()504     FragmentLightArray::iterator GetFragmentLightsBegin()
505     {
506         return m_FragmentLights.begin();
507     }
508 
509     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
510     //!
511     //!  @return       フラグメントライトの先頭を指すイテレータです。
512     //!
GetFragmentLightsBegin()513     FragmentLightArray::const_iterator GetFragmentLightsBegin() const
514     {
515         return m_FragmentLights.begin();
516     }
517 
518     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
519     //!
520     //!  @return       フラグメントライトの終端を指すイテレータです。
521     //!
GetFragmentLightsEnd()522     FragmentLightArray::iterator GetFragmentLightsEnd()
523     {
524         return m_FragmentLights.end();
525     }
526 
527     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
528     //!
529     //!  @return       フラグメントライトの終端を指すイテレータです。
530     //!
GetFragmentLightsEnd()531     FragmentLightArray::const_iterator GetFragmentLightsEnd() const
532     {
533         return m_FragmentLights.end();
534     }
535 
536     //! @brief        頂点ライトを追加します。
537     //!
538     //! @param[in]    light 頂点ライトです。
539     //!
PushVertexLight(VertexLight * light)540     void PushVertexLight(VertexLight* light)
541     {
542         bool isPushed = m_VertexLights.push_back(light);
543         NW_ASSERT(isPushed);
544     }
545 
546     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
547     //!
548     //!  @return        頂点ライトの先頭を指すイテレータです。
549     //!
GetVertexLightsBegin()550     VertexLightArray::iterator GetVertexLightsBegin()
551     {
552         return m_VertexLights.begin();
553     }
554 
555     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
556     //!
557     //!  @return        頂点ライトの先頭を指すイテレータです。
558     //!
GetVertexLightsBegin()559     VertexLightArray::const_iterator GetVertexLightsBegin() const
560     {
561         return m_VertexLights.begin();
562     }
563 
564     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
565     //!
566     //!  @return        頂点ライトの終端を指すイテレータです。
567     //!
GetVertexLightsEnd()568     VertexLightArray::iterator GetVertexLightsEnd()
569     {
570         return m_VertexLights.end();
571     }
572 
573     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
574     //!
575     //!  @return        頂点ライトの終端を指すイテレータです。
576     //!
GetVertexLightsEnd()577     VertexLightArray::const_iterator GetVertexLightsEnd() const
578     {
579         return m_VertexLights.end();
580     }
581 
582     //! @brief        半球ライトを追加します。
583     //!
584     //! @param[in]    light 半球ライトです。
585     //!
PushHemiSphereLight(HemiSphereLight * light)586     void PushHemiSphereLight(HemiSphereLight* light)
587     {
588         bool isPushed = m_HemiSphereLights.push_back(light);
589         NW_ASSERT(isPushed);
590     }
591 
592     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
593     //!
594     //!  @return       半球ライトの先頭を指すイテレータです。
595     //!
GetHemiSphereLightsBegin()596     HemiSphereLightArray::iterator GetHemiSphereLightsBegin()
597     {
598         return m_HemiSphereLights.begin();
599     }
600 
601     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
602     //!
603     //!  @return       半球ライトの先頭を指すイテレータです。
604     //!
GetHemiSphereLightsBegin()605     HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const
606     {
607         return m_HemiSphereLights.begin();
608     }
609 
610     //!  @brief        半球ライトの終端を指すイテレータを取得します。
611     //!
612     //!  @return       半球ライトの終端を指すイテレータです。
613     //!
GetHemiSphereLightsEnd()614     HemiSphereLightArray::iterator GetHemiSphereLightsEnd()
615     {
616         return m_HemiSphereLights.end();
617     }
618 
619     //!  @brief        半球ライトの終端を指すイテレータを取得します。
620     //!
621     //!  @return       半球ライトの終端を指すイテレータです。
622     //!
GetHemiSphereLightsEnd()623     HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const
624     {
625         return m_HemiSphereLights.end();
626     }
627 
628     //! @brief        アンビエントライトを追加します。
629     //!
630     //! @param[in]    light アンビエントライトです。
631     //!
PushAmbientLight(AmbientLight * light)632     void PushAmbientLight(AmbientLight* light)
633     {
634         bool isPushed = m_AmbientLights.push_back(light);
635         NW_ASSERT(isPushed);
636     }
637 
638     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
639     //!
640     //!  @return       アンビエントライトの先頭を指すイテレータです。
641     //!
GetAmbientLightsBegin()642     AmbientLightArray::iterator GetAmbientLightsBegin()
643     {
644         return m_AmbientLights.begin();
645     }
646 
647     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
648     //!
649     //!  @return       アンビエントライトの先頭を指すイテレータです。
650     //!
GetAmbientLightsBegin()651     AmbientLightArray::const_iterator GetAmbientLightsBegin() const
652     {
653         return m_AmbientLights.begin();
654     }
655 
656     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
657     //!
658     //!  @return       アンビエントライトの終端を指すイテレータです。
659     //!
GetAmbientLightsEnd()660     AmbientLightArray::iterator GetAmbientLightsEnd()
661     {
662         return m_AmbientLights.end();
663     }
664 
665     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
666     //!
667     //!  @return       アンビエントライトの終端を指すイテレータです。
668     //!
GetAmbientLightsEnd()669     AmbientLightArray::const_iterator GetAmbientLightsEnd() const
670     {
671         return m_AmbientLights.end();
672     }
673 
674     //@}
675 
676     //----------------------------------------
677     //! @name カメラ関連
678     //@{
679 
680     //! @brief        カメラを追加します。
681     //!
682     //! @param[in]    camera カメラです。
683     //!
PushCamera(Camera * camera)684     void PushCamera(Camera* camera)
685     {
686         bool isPushed = m_Cameras.push_back(camera);
687         NW_ASSERT(isPushed);
688     }
689 
690     //!  @brief        カメラの先頭を指すイテレータを取得します。
691     //!
692     //!  @return       カメラの先頭を指すイテレータです。
693     //!
GetCameraBegin()694     CameraArray::iterator GetCameraBegin()
695     {
696         return m_Cameras.begin();
697     }
698 
699     //!  @brief        カメラの先頭を指すイテレータを取得します。
700     //!
701     //!  @return       カメラの先頭を指すイテレータです。
702     //!
GetCameraBegin()703     CameraArray::const_iterator GetCameraBegin() const
704     {
705         return m_Cameras.begin();
706     }
707 
708     //!  @brief        カメラの終端を指すイテレータを取得します。
709     //!
710     //!  @return       カメラの終端を指すイテレータです。
711     //!
GetCameraEnd()712     CameraArray::iterator GetCameraEnd()
713     {
714         return m_Cameras.end();
715     }
716 
717     //!  @brief        カメラの終端を指すイテレータを取得します。
718     //!
719     //!  @return       カメラの終端を指すイテレータです。
720     //!
GetCameraEnd()721     CameraArray::const_iterator GetCameraEnd() const
722     {
723         return m_Cameras.end();
724     }
725 
726     //@}
727 
728     //----------------------------------------
729     //! @name フォグ関連
730     //@{
731 
732     //! @brief        フォグを追加します。
733     //!
734     //! @param[in]    fog フォグです。
735     //!
PushFog(Fog * fog)736     void PushFog(Fog* fog)
737     {
738         bool isPushed = m_Fogs.push_back(fog);
739         NW_ASSERT(isPushed);
740     }
741 
742     //!  @brief        フォグの先頭を指すイテレータを取得します。
743     //!
744     //!  @return       フォグの先頭を指すイテレータです。
745     //!
GetFogBegin()746     FogArray::iterator GetFogBegin()
747     {
748         return m_Fogs.begin();
749     }
750 
751     //!  @brief        フォグの先頭を指すイテレータを取得します。
752     //!
753     //!  @return       フォグの先頭を指すイテレータです。
754     //!
GetFogBegin()755     FogArray::const_iterator GetFogBegin() const
756     {
757         return m_Fogs.begin();
758     }
759 
760     //!  @brief        フォグの終端を指すイテレータを取得します。
761     //!
762     //!  @return       フォグの終端を指すイテレータです。
763     //!
GetFogEnd()764     FogArray::iterator GetFogEnd()
765     {
766         return m_Fogs.end();
767     }
768 
769     //!  @brief        フォグの終端を指すイテレータを取得します。
770     //!
771     //!  @return       フォグの終端を指すイテレータです。
772     //!
GetFogEnd()773     FogArray::const_iterator GetFogEnd() const
774     {
775         return m_Fogs.end();
776     }
777 
778     //@}
779 
780     //----------------------------------------
781     //! @name パーティクルセット関連
782     //@{
783 
784     //! @brief        パーティクルセットを追加します。
785     //!
786     //! @param[in]    particleSet パーティクルセットです。
787     //!
PushParticleSet(ParticleSet * particleSet)788     void PushParticleSet(ParticleSet* particleSet)
789     {
790         bool isPushed = m_ParticleSets.push_back(particleSet);
791         NW_ASSERT(isPushed);
792     }
793 
794     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
795     //!
796     //!  @return       パーティクルセットの先頭を指すイテレータです。
797     //!
GetParticleSetBegin()798     ParticleSetArray::iterator GetParticleSetBegin()
799     {
800         return m_ParticleSets.begin();
801     }
802 
803     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
804     //!
805     //!  @return       パーティクルセットの先頭を指すイテレータです。
806     //!
GetParticleSetBegin()807     ParticleSetArray::const_iterator GetParticleSetBegin() const
808     {
809         return m_ParticleSets.begin();
810     }
811 
812     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
813     //!
814     //!  @return       パーティクルセットの終端を指すイテレータです。
815     //!
GetParticleSetEnd()816     ParticleSetArray::iterator GetParticleSetEnd()
817     {
818         return m_ParticleSets.end();
819     }
820 
821     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
822     //!
823     //!  @return       パーティクルセットの終端を指すイテレータです。
824     //!
GetParticleSetEnd()825     ParticleSetArray::const_iterator GetParticleSetEnd() const
826     {
827         return m_ParticleSets.end();
828     }
829 
830     //@}
831 
832     //----------------------------------------
833     //! @name パーティクルエミッタ関連
834     //@{
835 
836     //! @brief        パーティクルエミッタを追加します。
837     //!
838     //! @param[in]    particleEmitter パーティクルエミッタです。
839     //!
PushParticleEmitter(ParticleEmitter * particleEmitter)840     void PushParticleEmitter(ParticleEmitter* particleEmitter)
841     {
842         bool isPushed = m_ParticleEmitters.push_back(particleEmitter);
843         NW_ASSERT(isPushed);
844     }
845 
846     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
847     //!
848     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
849     //!
GetParticleEmitterBegin()850     ParticleEmitterArray::iterator GetParticleEmitterBegin()
851     {
852         return m_ParticleEmitters.begin();
853     }
854 
855     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
856     //!
857     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
858     //!
GetParticleEmitterBegin()859     ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const
860     {
861         return m_ParticleEmitters.begin();
862     }
863 
864     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
865     //!
866     //!  @return       パーティクルエミッタの終端を指すイテレータです。
867     //!
GetParticleEmitterEnd()868     ParticleEmitterArray::iterator GetParticleEmitterEnd()
869     {
870         return m_ParticleEmitters.end();
871     }
872 
873     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
874     //!
875     //!  @return       パーティクルエミッタの終端を指すイテレータです。
876     //!
GetParticleEmitterEnd()877     ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const
878     {
879         return m_ParticleEmitters.end();
880     }
881 
882     //@}
883 
884     //----------------------------------------
885     //! @name パーティクルモデル関連
886     //@{
887 
888     //! @brief        パーティクルモデルを追加します。
889     //!
890     //! @param[in]    particleModel パーティクルモデルです。
891     //!
PushParticleModel(ParticleModel * particleModel)892     void PushParticleModel(ParticleModel* particleModel)
893     {
894         bool isPushed = m_ParticleModels.push_back(particleModel);
895         NW_ASSERT(isPushed);
896     }
897 
898     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
899     //!
900     //!  @return       パーティクルモデルの先頭を指すイテレータです。
901     //!
GetParticleModelBegin()902     ParticleModelArray::iterator GetParticleModelBegin()
903     {
904         return m_ParticleModels.begin();
905     }
906 
907     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
908     //!
909     //!  @return       パーティクルモデルの先頭を指すイテレータです。
910     //!
GetParticleModelBegin()911     ParticleModelArray::const_iterator GetParticleModelBegin() const
912     {
913         return m_ParticleModels.begin();
914     }
915 
916     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
917     //!
918     //!  @return       パーティクルモデルの終端を指すイテレータです。
919     //!
GetParticleModelEnd()920     ParticleModelArray::iterator GetParticleModelEnd()
921     {
922         return m_ParticleModels.end();
923     }
924 
925     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
926     //!
927     //!  @return       パーティクルモデルの終端を指すイテレータです。
928     //!
GetParticleModelEnd()929     ParticleModelArray::const_iterator GetParticleModelEnd() const
930     {
931         return m_ParticleModels.end();
932     }
933 
934     //@}
935 
936     //! @name アニメーション関連
937     //@{
938 
939     //! @brief        アニメーションを行うノードを追加します。
940     //!
941     //! アニメーションを行わないノードについては、引数に渡されても無視します。
942     //!
943     //! @param[in]    sceneNode アニメーションを行うノードです。
944     //!
PushAnimatableNode(SceneNode * sceneNode)945     void PushAnimatableNode(SceneNode* sceneNode)
946     {
947         if (sceneNode->GetAnimBinding() != NULL)
948         {
949             bool isPushed = m_AnimatableNodes.push_back(sceneNode);
950             NW_ASSERT(isPushed);
951         }
952     }
953 
954     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
955     //!
956     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
957     //!
GetAnimatableNodesBegin()958     AnimatableNodeArray::iterator GetAnimatableNodesBegin()
959     {
960         return m_AnimatableNodes.begin();
961     }
962 
963     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
964     //!
965     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
966     //!
GetAnimatableNodesBegin()967     AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const
968     {
969         return m_AnimatableNodes.begin();
970     }
971 
972     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
973     //!
974     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
975     //!
GetAnimatableNodesEnd()976     AnimatableNodeArray::iterator GetAnimatableNodesEnd()
977     {
978         return m_AnimatableNodes.end();
979     }
980 
981     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
982     //!
983     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
984     //!
GetAnimatableNodesEnd()985     AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const
986     {
987         return m_AnimatableNodes.end();
988     }
989 
990     //@}
991 
992 private:
SceneContext(os::IAllocator * allocator,SceneNodeArray sceneNodes,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)993     SceneContext(
994         os::IAllocator* allocator,
995         SceneNodeArray sceneNodes,
996         ModelArray models,
997         SkeletalModelArray skeletalModels,
998         CameraArray cameras,
999         FogArray fogs,
1000         LightArray lights,
1001         FragmentLightArray fragmentLights,
1002         VertexLightArray vertexLights,
1003         HemiSphereLightArray hemiSphereLights,
1004         AmbientLightArray ambientLights,
1005         ParticleSetArray particleSets,
1006         ParticleEmitterArray particleEmitters,
1007         ParticleModelArray particleModels,
1008         AnimatableNodeArray animatableNodes)
1009     : GfxObject(allocator),
1010       m_SceneNodes(sceneNodes),
1011       m_Models(models),
1012       m_SkeletalModels(skeletalModels),
1013       m_Cameras(cameras),
1014       m_Fogs(fogs),
1015       m_Lights(lights),
1016       m_FragmentLights(fragmentLights),
1017       m_VertexLights(vertexLights),
1018       m_HemiSphereLights(hemiSphereLights),
1019       m_AmbientLights(ambientLights),
1020       m_ParticleSets(particleSets),
1021       m_ParticleEmitters(particleEmitters),
1022       m_ParticleModels(particleModels),
1023       m_AnimatableNodes(animatableNodes)
1024     {}
~SceneContext()1025     virtual ~SceneContext() {}
1026 
1027     SceneNodeArray m_SceneNodes;
1028     ModelArray m_Models;
1029     SkeletalModelArray m_SkeletalModels;
1030     CameraArray m_Cameras;
1031     FogArray m_Fogs;
1032     LightArray m_Lights;
1033     FragmentLightArray m_FragmentLights;
1034     VertexLightArray m_VertexLights;
1035     HemiSphereLightArray m_HemiSphereLights;
1036     AmbientLightArray m_AmbientLights;
1037     ParticleSetArray m_ParticleSets;
1038     ParticleEmitterArray m_ParticleEmitters;
1039     ParticleModelArray m_ParticleModels;
1040     AnimatableNodeArray m_AnimatableNodes;
1041 };
1042 
1043 } // namespace gfx
1044 } // namespace nw
1045 
1046 #endif // NW_GFX_SCENECONTEXT_H_
1047