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: 28045 $
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     //! @param[in]    node 追加するシーンノードです。
287     //!
288     //! @return       追加に成功すると true が返ります。
289     //!
TryPushSceneNode(SceneNode * node)290     bool TryPushSceneNode(SceneNode* node)
291     {
292         bool isPushed = m_SceneNodes.push_back(node);
293         return isPushed;
294     }
295 
296     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
297     //!
298     //! @return       シーンノードの先頭を指すイテレータです。
299     //!
GetSceneNodesBegin()300     SceneNodeArray::iterator GetSceneNodesBegin()
301     {
302         return m_SceneNodes.begin();
303     }
304 
305     //! @brief        直列化したシーンノードの先頭を指すイテレータを取得します。
306     //!
307     //! @return       シーンノードの先頭を指すイテレータです。
308     //!
GetSceneNodesBegin()309     SceneNodeArray::const_iterator GetSceneNodesBegin() const
310     {
311         return m_SceneNodes.begin();
312     }
313 
314     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
315     //!
316     //!  @return       シーンノードの終端を指すイテレータです。
317     //!
GetSceneNodesEnd()318     SceneNodeArray::iterator GetSceneNodesEnd()
319     {
320         return m_SceneNodes.end();
321     }
322 
323     //!  @brief        直列化したシーンノードの終端を指すイテレータを取得します。
324     //!
325     //!  @return       シーンノードの終端を指すイテレータです。
326     //!
GetSceneNodesEnd()327     SceneNodeArray::const_iterator GetSceneNodesEnd() const
328     {
329         return m_SceneNodes.end();
330     }
331 
332     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
333     //!
334     //!  @return       シーンノードの先頭と終端を指すイテレータです。
335     //!
GetSceneNodes()336     std::pair<SceneNodeArray::iterator, SceneNodeArray::iterator> GetSceneNodes()
337     {
338         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
339     }
340 
341     //!  @brief        直列化したシーンノードの先頭と終端を指すイテレータを取得します。
342     //!
343     //!  @return       シーンノードの先頭と終端を指すイテレータです。
344     //!
GetSceneNodes()345     std::pair<SceneNodeArray::const_iterator, SceneNodeArray::const_iterator> GetSceneNodes() const
346     {
347         return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end());
348     }
349 
350     //@}
351 
352     //----------------------------------------
353     //! @name モデル関連
354     //@{
355 
356     //! @brief        モデルを追加します。
357     //!               「モデル」には、派生クラス(SkeletalModelなど)も含まれます。
358     //!
359     //! @param[in]    model モデルです。
360     //!
PushModel(Model * model)361     void PushModel(Model* model)
362     {
363         bool isPushed = m_Models.push_back(model);
364         NW_ASSERT(isPushed);
365     }
366 
367     //! @brief        モデルを追加します。
368     //!               「モデル」には、派生クラス(SkeletalModelなど)も含まれます。
369     //!
370     //! @param[in]    model モデルです。
371     //!
372     //! @return       追加に成功すると true が返ります。
373     //!
TryPushModel(Model * model)374     bool TryPushModel(Model* model)
375     {
376         bool isPushed = m_Models.push_back(model);
377         return isPushed;
378     }
379 
380     //!  @brief        モデルの先頭を指すイテレータを取得します。
381     //!
382     //!  @return       モデルの先頭を指すイテレータです。
383     //!
GetModelsBegin()384     ModelArray::iterator GetModelsBegin()
385     {
386         return m_Models.begin();
387     }
388 
389     //!  @brief        モデルの先頭を指すイテレータを取得します。
390     //!
391     //!  @return       モデルの先頭を指すイテレータです。
392     //!
GetModelsBegin()393     ModelArray::const_iterator GetModelsBegin() const
394     {
395         return m_Models.begin();
396     }
397 
398     //!  @brief        モデルの終端を指すイテレータを取得します。
399     //!
400     //!  @return       モデルの終端を指すイテレータです。
401     //!
GetModelsEnd()402     ModelArray::iterator GetModelsEnd()
403     {
404         return m_Models.end();
405     }
406 
407     //!  @brief        モデルの終端を指すイテレータを取得します。
408     //!
409     //!  @return       モデルの終端を指すイテレータです。
410     //!
GetModelsEnd()411     ModelArray::const_iterator GetModelsEnd() const
412     {
413         return m_Models.end();
414     }
415 
416     //! @brief        スケルタルモデルを追加します。
417     //!
418     //! @param[in]    skeletalModel スケルタルモデルです。
419     //!
PushSkeletalModel(SkeletalModel * skeletalModel)420     void PushSkeletalModel(SkeletalModel* skeletalModel)
421     {
422         bool isPushed = m_SkeletalModels.push_back(skeletalModel);
423         NW_ASSERT(isPushed);
424     }
425 
426     //! @brief        スケルタルモデルを追加します。
427     //!
428     //! @param[in]    skeletalModel スケルタルモデルです。
429     //!
430     //! @return       追加に成功すると true が返ります。
431     //!
TryPushSkeletalModel(SkeletalModel * skeletalModel)432     bool TryPushSkeletalModel(SkeletalModel* skeletalModel)
433     {
434         bool isPushed = m_SkeletalModels.push_back(skeletalModel);
435         return isPushed;
436     }
437 
438     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
439     //!
440     //!  @return       スケルタルモデルの先頭を指すイテレータです。
441     //!
GetSkeletalModelsBegin()442     SkeletalModelArray::iterator GetSkeletalModelsBegin()
443     {
444         return m_SkeletalModels.begin();
445     }
446 
447     //!  @brief        スケルタルモデルの先頭を指すイテレータを取得します。
448     //!
449     //!  @return       スケルタルモデルの先頭を指すイテレータです。
450     //!
GetSkeletalModelsBegin()451     SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const
452     {
453         return m_SkeletalModels.begin();
454     }
455 
456     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
457     //!
458     //!  @return       スケルタルモデルの終端を指すイテレータです。
459     //!
GetSkeletalModelsEnd()460     SkeletalModelArray::iterator GetSkeletalModelsEnd()
461     {
462         return m_SkeletalModels.end();
463     }
464 
465     //!  @brief        スケルタルモデルの終端を指すイテレータを取得します。
466     //!
467     //!  @return       スケルタルモデルの終端を指すイテレータです。
468     //!
GetSkeletalModelsEnd()469     SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const
470     {
471         return m_SkeletalModels.end();
472     }
473 
474     //@}
475 
476     //----------------------------------------
477     //! @name ライト関連
478     //@{
479 
480     //! @brief        ライトを追加します。
481     //!               「ライト」には、派生クラス(FragmentLightなど)も含まれます。
482     //!
483     //! @param[in]    light ライトです。
484     //!
PushLight(Light * light)485     void PushLight(Light* light)
486     {
487         bool isPushed = m_Lights.push_back(light);
488         NW_ASSERT(isPushed);
489     }
490 
491     //! @brief        ライトを追加します。
492     //!               「ライト」には、派生クラス(FragmentLightなど)も含まれます。
493     //!
494     //! @param[in]    light ライトです。
495     //!
496     //! @return       追加に成功すると true が返ります。
497     //!
TryPushLight(Light * light)498     bool TryPushLight(Light* light)
499     {
500         bool isPushed = m_Lights.push_back(light);
501         return isPushed;
502     }
503 
504     //!  @brief        ライトの先頭を指すイテレータを取得します。
505     //!
506     //!  @return       ライトの先頭を指すイテレータです。
507     //!
GetLightsBegin()508     LightArray::iterator GetLightsBegin()
509     {
510         return m_Lights.begin();
511     }
512 
513     //!  @brief        ライトの先頭を指すイテレータを取得します。
514     //!
515     //!  @return       ライトの先頭を指すイテレータです。
516     //!
GetLightsBegin()517     LightArray::const_iterator GetLightsBegin() const
518     {
519         return m_Lights.begin();
520     }
521 
522     //!  @brief        ライトの終端を指すイテレータを取得します。
523     //!
524     //!  @return       ライトの終端を指すイテレータです。
525     //!
GetLightsEnd()526     LightArray::iterator GetLightsEnd()
527     {
528         return m_Lights.end();
529     }
530 
531     //!  @brief        ライトの終端を指すイテレータを取得します。
532     //!
533     //!  @return       ライトの終端を指すイテレータです。
534     //!
GetLightsEnd()535     LightArray::const_iterator GetLightsEnd() const
536     {
537         return m_Lights.end();
538     }
539 
540     //! @brief        フラグメントライトを追加します。
541     //!
542     //! @param[in]    light フラグメントライトです。
543     //!
PushFragmentLight(FragmentLight * light)544     void PushFragmentLight(FragmentLight* light)
545     {
546         bool isPushed = m_FragmentLights.push_back(light);
547         NW_ASSERT(isPushed);
548     }
549 
550     //! @brief        フラグメントライトを追加します。
551     //!
552     //! @param[in]    light フラグメントライトです。
553     //!
554     //! @return       追加に成功すると true が返ります。
555     //!
TryPushFragmentLight(FragmentLight * light)556     bool TryPushFragmentLight(FragmentLight* light)
557     {
558         bool isPushed = m_FragmentLights.push_back(light);
559         return isPushed;
560     }
561 
562     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
563     //!
564     //!  @return       フラグメントライトの先頭を指すイテレータです。
565     //!
GetFragmentLightsBegin()566     FragmentLightArray::iterator GetFragmentLightsBegin()
567     {
568         return m_FragmentLights.begin();
569     }
570 
571     //!  @brief        フラグメントライトの先頭を指すイテレータを取得します。
572     //!
573     //!  @return       フラグメントライトの先頭を指すイテレータです。
574     //!
GetFragmentLightsBegin()575     FragmentLightArray::const_iterator GetFragmentLightsBegin() const
576     {
577         return m_FragmentLights.begin();
578     }
579 
580     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
581     //!
582     //!  @return       フラグメントライトの終端を指すイテレータです。
583     //!
GetFragmentLightsEnd()584     FragmentLightArray::iterator GetFragmentLightsEnd()
585     {
586         return m_FragmentLights.end();
587     }
588 
589     //!  @brief        フラグメントライトの終端を指すイテレータを取得します。
590     //!
591     //!  @return       フラグメントライトの終端を指すイテレータです。
592     //!
GetFragmentLightsEnd()593     FragmentLightArray::const_iterator GetFragmentLightsEnd() const
594     {
595         return m_FragmentLights.end();
596     }
597 
598     //! @brief        頂点ライトを追加します。
599     //!
600     //! @param[in]    light 頂点ライトです。
601     //!
PushVertexLight(VertexLight * light)602     void PushVertexLight(VertexLight* light)
603     {
604         bool isPushed = m_VertexLights.push_back(light);
605         NW_ASSERT(isPushed);
606     }
607 
608     //! @brief        頂点ライトを追加します。
609     //!
610     //! @param[in]    light 頂点ライトです。
611     //!
612     //! @return       追加に成功すると true が返ります。
613     //!
TryPushVertexLight(VertexLight * light)614     bool TryPushVertexLight(VertexLight* light)
615     {
616         bool isPushed = m_VertexLights.push_back(light);
617         return isPushed;
618     }
619 
620     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
621     //!
622     //!  @return        頂点ライトの先頭を指すイテレータです。
623     //!
GetVertexLightsBegin()624     VertexLightArray::iterator GetVertexLightsBegin()
625     {
626         return m_VertexLights.begin();
627     }
628 
629     //!  @brief         頂点ライトの先頭を指すイテレータを取得します。
630     //!
631     //!  @return        頂点ライトの先頭を指すイテレータです。
632     //!
GetVertexLightsBegin()633     VertexLightArray::const_iterator GetVertexLightsBegin() const
634     {
635         return m_VertexLights.begin();
636     }
637 
638     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
639     //!
640     //!  @return        頂点ライトの終端を指すイテレータです。
641     //!
GetVertexLightsEnd()642     VertexLightArray::iterator GetVertexLightsEnd()
643     {
644         return m_VertexLights.end();
645     }
646 
647     //!  @brief         頂点ライトの終端を指すイテレータを取得します。
648     //!
649     //!  @return        頂点ライトの終端を指すイテレータです。
650     //!
GetVertexLightsEnd()651     VertexLightArray::const_iterator GetVertexLightsEnd() const
652     {
653         return m_VertexLights.end();
654     }
655 
656     //! @brief        半球ライトを追加します。
657     //!
658     //! @param[in]    light 半球ライトです。
659     //!
PushHemiSphereLight(HemiSphereLight * light)660     void PushHemiSphereLight(HemiSphereLight* light)
661     {
662         bool isPushed = m_HemiSphereLights.push_back(light);
663         NW_ASSERT(isPushed);
664     }
665 
666     //! @brief        半球ライトを追加します。
667     //!
668     //! @param[in]    light 半球ライトです。
669     //!
670     //! @return       追加に成功すると true が返ります。
671     //!
TryPushHemiSphereLight(HemiSphereLight * light)672     bool TryPushHemiSphereLight(HemiSphereLight* light)
673     {
674         bool isPushed = m_HemiSphereLights.push_back(light);
675         return isPushed;
676     }
677 
678     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
679     //!
680     //!  @return       半球ライトの先頭を指すイテレータです。
681     //!
GetHemiSphereLightsBegin()682     HemiSphereLightArray::iterator GetHemiSphereLightsBegin()
683     {
684         return m_HemiSphereLights.begin();
685     }
686 
687     //!  @brief        半球ライトの先頭を指すイテレータを取得します。
688     //!
689     //!  @return       半球ライトの先頭を指すイテレータです。
690     //!
GetHemiSphereLightsBegin()691     HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const
692     {
693         return m_HemiSphereLights.begin();
694     }
695 
696     //!  @brief        半球ライトの終端を指すイテレータを取得します。
697     //!
698     //!  @return       半球ライトの終端を指すイテレータです。
699     //!
GetHemiSphereLightsEnd()700     HemiSphereLightArray::iterator GetHemiSphereLightsEnd()
701     {
702         return m_HemiSphereLights.end();
703     }
704 
705     //!  @brief        半球ライトの終端を指すイテレータを取得します。
706     //!
707     //!  @return       半球ライトの終端を指すイテレータです。
708     //!
GetHemiSphereLightsEnd()709     HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const
710     {
711         return m_HemiSphereLights.end();
712     }
713 
714     //! @brief        アンビエントライトを追加します。
715     //!
716     //! @param[in]    light アンビエントライトです。
717     //!
PushAmbientLight(AmbientLight * light)718     void PushAmbientLight(AmbientLight* light)
719     {
720         bool isPushed = m_AmbientLights.push_back(light);
721         NW_ASSERT(isPushed);
722     }
723 
724     //! @brief        アンビエントライトを追加します。
725     //!
726     //! @param[in]    light アンビエントライトです。
727     //!
728     //! @return       追加に成功すると true が返ります。
729     //!
TryPushAmbientLight(AmbientLight * light)730     bool TryPushAmbientLight(AmbientLight* light)
731     {
732         bool isPushed = m_AmbientLights.push_back(light);
733         return isPushed;
734     }
735 
736     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
737     //!
738     //!  @return       アンビエントライトの先頭を指すイテレータです。
739     //!
GetAmbientLightsBegin()740     AmbientLightArray::iterator GetAmbientLightsBegin()
741     {
742         return m_AmbientLights.begin();
743     }
744 
745     //!  @brief        アンビエントライトの先頭を指すイテレータを取得します。
746     //!
747     //!  @return       アンビエントライトの先頭を指すイテレータです。
748     //!
GetAmbientLightsBegin()749     AmbientLightArray::const_iterator GetAmbientLightsBegin() const
750     {
751         return m_AmbientLights.begin();
752     }
753 
754     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
755     //!
756     //!  @return       アンビエントライトの終端を指すイテレータです。
757     //!
GetAmbientLightsEnd()758     AmbientLightArray::iterator GetAmbientLightsEnd()
759     {
760         return m_AmbientLights.end();
761     }
762 
763     //!  @brief        アンビエントライトの終端を指すイテレータを取得します。
764     //!
765     //!  @return       アンビエントライトの終端を指すイテレータです。
766     //!
GetAmbientLightsEnd()767     AmbientLightArray::const_iterator GetAmbientLightsEnd() const
768     {
769         return m_AmbientLights.end();
770     }
771 
772     //@}
773 
774     //----------------------------------------
775     //! @name カメラ関連
776     //@{
777 
778     //! @brief        カメラを追加します。
779     //!
780     //! @param[in]    camera カメラです。
781     //!
PushCamera(Camera * camera)782     void PushCamera(Camera* camera)
783     {
784         bool isPushed = m_Cameras.push_back(camera);
785         NW_ASSERT(isPushed);
786     }
787 
788     //! @brief        カメラを追加します。
789     //!
790     //! @param[in]    camera カメラです。
791     //!
792     //! @return       追加に成功すると true が返ります。
793     //!
TryPushCamera(Camera * camera)794     bool TryPushCamera(Camera* camera)
795     {
796         bool isPushed = m_Cameras.push_back(camera);
797         return isPushed;
798     }
799 
800     //!  @brief        カメラの先頭を指すイテレータを取得します。
801     //!
802     //!  @return       カメラの先頭を指すイテレータです。
803     //!
GetCameraBegin()804     CameraArray::iterator GetCameraBegin()
805     {
806         return m_Cameras.begin();
807     }
808 
809     //!  @brief        カメラの先頭を指すイテレータを取得します。
810     //!
811     //!  @return       カメラの先頭を指すイテレータです。
812     //!
GetCameraBegin()813     CameraArray::const_iterator GetCameraBegin() const
814     {
815         return m_Cameras.begin();
816     }
817 
818     //!  @brief        カメラの終端を指すイテレータを取得します。
819     //!
820     //!  @return       カメラの終端を指すイテレータです。
821     //!
GetCameraEnd()822     CameraArray::iterator GetCameraEnd()
823     {
824         return m_Cameras.end();
825     }
826 
827     //!  @brief        カメラの終端を指すイテレータを取得します。
828     //!
829     //!  @return       カメラの終端を指すイテレータです。
830     //!
GetCameraEnd()831     CameraArray::const_iterator GetCameraEnd() const
832     {
833         return m_Cameras.end();
834     }
835 
836     //@}
837 
838     //----------------------------------------
839     //! @name フォグ関連
840     //@{
841 
842     //! @brief        フォグを追加します。
843     //!
844     //! @param[in]    fog フォグです。
845     //!
PushFog(Fog * fog)846     void PushFog(Fog* fog)
847     {
848         bool isPushed = m_Fogs.push_back(fog);
849         NW_ASSERT(isPushed);
850     }
851 
852     //! @brief        フォグを追加します。
853     //!
854     //! @param[in]    fog フォグです。
855     //!
856     //! @return       追加に成功すると true が返ります。
857     //!
TryPushFog(Fog * fog)858     bool TryPushFog(Fog* fog)
859     {
860         bool isPushed = m_Fogs.push_back(fog);
861         return isPushed;
862     }
863 
864     //!  @brief        フォグの先頭を指すイテレータを取得します。
865     //!
866     //!  @return       フォグの先頭を指すイテレータです。
867     //!
GetFogBegin()868     FogArray::iterator GetFogBegin()
869     {
870         return m_Fogs.begin();
871     }
872 
873     //!  @brief        フォグの先頭を指すイテレータを取得します。
874     //!
875     //!  @return       フォグの先頭を指すイテレータです。
876     //!
GetFogBegin()877     FogArray::const_iterator GetFogBegin() const
878     {
879         return m_Fogs.begin();
880     }
881 
882     //!  @brief        フォグの終端を指すイテレータを取得します。
883     //!
884     //!  @return       フォグの終端を指すイテレータです。
885     //!
GetFogEnd()886     FogArray::iterator GetFogEnd()
887     {
888         return m_Fogs.end();
889     }
890 
891     //!  @brief        フォグの終端を指すイテレータを取得します。
892     //!
893     //!  @return       フォグの終端を指すイテレータです。
894     //!
GetFogEnd()895     FogArray::const_iterator GetFogEnd() const
896     {
897         return m_Fogs.end();
898     }
899 
900     //@}
901 
902     //----------------------------------------
903     //! @name パーティクルセット関連
904     //@{
905 
906     //! @brief        パーティクルセットを追加します。
907     //!
908     //! @param[in]    particleSet パーティクルセットです。
909     //!
PushParticleSet(ParticleSet * particleSet)910     void PushParticleSet(ParticleSet* particleSet)
911     {
912         bool isPushed = m_ParticleSets.push_back(particleSet);
913         NW_ASSERT(isPushed);
914     }
915 
916     //! @brief        パーティクルセットを追加します。
917     //!
918     //! @param[in]    particleSet パーティクルセットです。
919     //!
920     //! @return       追加に成功すると true が返ります。
921     //!
TryPushParticleSet(ParticleSet * particleSet)922     bool TryPushParticleSet(ParticleSet* particleSet)
923     {
924         bool isPushed = m_ParticleSets.push_back(particleSet);
925         return isPushed;
926     }
927 
928     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
929     //!
930     //!  @return       パーティクルセットの先頭を指すイテレータです。
931     //!
GetParticleSetBegin()932     ParticleSetArray::iterator GetParticleSetBegin()
933     {
934         return m_ParticleSets.begin();
935     }
936 
937     //!  @brief        パーティクルセットの先頭を指すイテレータを取得します。
938     //!
939     //!  @return       パーティクルセットの先頭を指すイテレータです。
940     //!
GetParticleSetBegin()941     ParticleSetArray::const_iterator GetParticleSetBegin() const
942     {
943         return m_ParticleSets.begin();
944     }
945 
946     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
947     //!
948     //!  @return       パーティクルセットの終端を指すイテレータです。
949     //!
GetParticleSetEnd()950     ParticleSetArray::iterator GetParticleSetEnd()
951     {
952         return m_ParticleSets.end();
953     }
954 
955     //!  @brief        パーティクルセットの終端を指すイテレータを取得します。
956     //!
957     //!  @return       パーティクルセットの終端を指すイテレータです。
958     //!
GetParticleSetEnd()959     ParticleSetArray::const_iterator GetParticleSetEnd() const
960     {
961         return m_ParticleSets.end();
962     }
963 
964     //@}
965 
966     //----------------------------------------
967     //! @name パーティクルエミッタ関連
968     //@{
969 
970     //! @brief        パーティクルエミッタを追加します。
971     //!
972     //! @param[in]    particleEmitter パーティクルエミッタです。
973     //!
PushParticleEmitter(ParticleEmitter * particleEmitter)974     void PushParticleEmitter(ParticleEmitter* particleEmitter)
975     {
976         bool isPushed = m_ParticleEmitters.push_back(particleEmitter);
977         NW_ASSERT(isPushed);
978     }
979 
980     //! @brief        パーティクルエミッタを追加します。
981     //!
982     //! @param[in]    particleEmitter パーティクルエミッタです。
983     //!
984     //! @return       追加に成功すると true が返ります。
985     //!
TryPushParticleEmitter(ParticleEmitter * particleEmitter)986     bool TryPushParticleEmitter(ParticleEmitter* particleEmitter)
987     {
988         bool isPushed = m_ParticleEmitters.push_back(particleEmitter);
989         return isPushed;
990     }
991 
992     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
993     //!
994     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
995     //!
GetParticleEmitterBegin()996     ParticleEmitterArray::iterator GetParticleEmitterBegin()
997     {
998         return m_ParticleEmitters.begin();
999     }
1000 
1001     //!  @brief        パーティクルエミッタの先頭を指すイテレータを取得します。
1002     //!
1003     //!  @return       パーティクルエミッタの先頭を指すイテレータです。
1004     //!
GetParticleEmitterBegin()1005     ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const
1006     {
1007         return m_ParticleEmitters.begin();
1008     }
1009 
1010     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
1011     //!
1012     //!  @return       パーティクルエミッタの終端を指すイテレータです。
1013     //!
GetParticleEmitterEnd()1014     ParticleEmitterArray::iterator GetParticleEmitterEnd()
1015     {
1016         return m_ParticleEmitters.end();
1017     }
1018 
1019     //!  @brief        パーティクルエミッタの終端を指すイテレータを取得します。
1020     //!
1021     //!  @return       パーティクルエミッタの終端を指すイテレータです。
1022     //!
GetParticleEmitterEnd()1023     ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const
1024     {
1025         return m_ParticleEmitters.end();
1026     }
1027 
1028     //@}
1029 
1030     //----------------------------------------
1031     //! @name パーティクルモデル関連
1032     //@{
1033 
1034     //! @brief        パーティクルモデルを追加します。
1035     //!
1036     //! @param[in]    particleModel パーティクルモデルです。
1037     //!
PushParticleModel(ParticleModel * particleModel)1038     void PushParticleModel(ParticleModel* particleModel)
1039     {
1040         bool isPushed = m_ParticleModels.push_back(particleModel);
1041         NW_ASSERT(isPushed);
1042     }
1043 
1044     //! @brief        パーティクルモデルを追加します。
1045     //!
1046     //! @param[in]    particleModel パーティクルモデルです。
1047     //!
1048     //! @return       追加に成功すると true が返ります。
1049     //!
TryPushParticleModel(ParticleModel * particleModel)1050     bool TryPushParticleModel(ParticleModel* particleModel)
1051     {
1052         bool isPushed = m_ParticleModels.push_back(particleModel);
1053         return isPushed;
1054     }
1055 
1056     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
1057     //!
1058     //!  @return       パーティクルモデルの先頭を指すイテレータです。
1059     //!
GetParticleModelBegin()1060     ParticleModelArray::iterator GetParticleModelBegin()
1061     {
1062         return m_ParticleModels.begin();
1063     }
1064 
1065     //!  @brief        パーティクルモデルの先頭を指すイテレータを取得します。
1066     //!
1067     //!  @return       パーティクルモデルの先頭を指すイテレータです。
1068     //!
GetParticleModelBegin()1069     ParticleModelArray::const_iterator GetParticleModelBegin() const
1070     {
1071         return m_ParticleModels.begin();
1072     }
1073 
1074     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
1075     //!
1076     //!  @return       パーティクルモデルの終端を指すイテレータです。
1077     //!
GetParticleModelEnd()1078     ParticleModelArray::iterator GetParticleModelEnd()
1079     {
1080         return m_ParticleModels.end();
1081     }
1082 
1083     //!  @brief        パーティクルモデルの終端を指すイテレータを取得します。
1084     //!
1085     //!  @return       パーティクルモデルの終端を指すイテレータです。
1086     //!
GetParticleModelEnd()1087     ParticleModelArray::const_iterator GetParticleModelEnd() const
1088     {
1089         return m_ParticleModels.end();
1090     }
1091 
1092     //@}
1093 
1094     //! @name アニメーション関連
1095     //@{
1096 
1097     //! @brief        アニメーションを行うノードを追加します。
1098     //!
1099     //! アニメーションを行わないノードについては、引数に渡されても無視します。
1100     //!
1101     //! @param[in]    sceneNode アニメーションを行うノードです。
1102     //!
PushAnimatableNode(SceneNode * sceneNode)1103     void PushAnimatableNode(SceneNode* sceneNode)
1104     {
1105         if (sceneNode->GetAnimBinding() != NULL)
1106         {
1107             bool isPushed = m_AnimatableNodes.push_back(sceneNode);
1108             NW_ASSERT(isPushed);
1109         }
1110     }
1111 
1112     //! @brief        アニメーションを行うノードを追加します。
1113     //!
1114     //! アニメーションを行わないノードについては、引数に渡されても無視します。
1115     //!
1116     //! @param[in]    sceneNode アニメーションを行うノードです。
1117     //!
1118     //! @return       追加に成功すると true が返ります。
1119     //!
TryPushAnimatableNode(SceneNode * sceneNode)1120     bool TryPushAnimatableNode(SceneNode* sceneNode)
1121     {
1122         bool isPushed = true;
1123         if (sceneNode->GetAnimBinding() != NULL)
1124         {
1125             isPushed = m_AnimatableNodes.push_back(sceneNode);
1126         }
1127         return isPushed;
1128     }
1129 
1130     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
1131     //!
1132     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
1133     //!
GetAnimatableNodesBegin()1134     AnimatableNodeArray::iterator GetAnimatableNodesBegin()
1135     {
1136         return m_AnimatableNodes.begin();
1137     }
1138 
1139     //!  @brief        アニメーションを行うノードの先頭を指すイテレータを取得します。
1140     //!
1141     //!  @return       アニメーションを行うノードの先頭を指すイテレータです。
1142     //!
GetAnimatableNodesBegin()1143     AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const
1144     {
1145         return m_AnimatableNodes.begin();
1146     }
1147 
1148     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
1149     //!
1150     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
1151     //!
GetAnimatableNodesEnd()1152     AnimatableNodeArray::iterator GetAnimatableNodesEnd()
1153     {
1154         return m_AnimatableNodes.end();
1155     }
1156 
1157     //!  @brief        アニメーションを行うノードの終端を指すイテレータを取得します。
1158     //!
1159     //!  @return       アニメーションを行うノードの終端を指すイテレータです。
1160     //!
GetAnimatableNodesEnd()1161     AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const
1162     {
1163         return m_AnimatableNodes.end();
1164     }
1165 
1166     //@}
1167 
1168 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)1169     SceneContext(
1170         os::IAllocator* allocator,
1171         SceneNodeArray sceneNodes,
1172         ModelArray models,
1173         SkeletalModelArray skeletalModels,
1174         CameraArray cameras,
1175         FogArray fogs,
1176         LightArray lights,
1177         FragmentLightArray fragmentLights,
1178         VertexLightArray vertexLights,
1179         HemiSphereLightArray hemiSphereLights,
1180         AmbientLightArray ambientLights,
1181         ParticleSetArray particleSets,
1182         ParticleEmitterArray particleEmitters,
1183         ParticleModelArray particleModels,
1184         AnimatableNodeArray animatableNodes)
1185     : GfxObject(allocator),
1186       m_SceneNodes(sceneNodes),
1187       m_Models(models),
1188       m_SkeletalModels(skeletalModels),
1189       m_Cameras(cameras),
1190       m_Fogs(fogs),
1191       m_Lights(lights),
1192       m_FragmentLights(fragmentLights),
1193       m_VertexLights(vertexLights),
1194       m_HemiSphereLights(hemiSphereLights),
1195       m_AmbientLights(ambientLights),
1196       m_ParticleSets(particleSets),
1197       m_ParticleEmitters(particleEmitters),
1198       m_ParticleModels(particleModels),
1199       m_AnimatableNodes(animatableNodes)
1200     {}
~SceneContext()1201     virtual ~SceneContext() {}
1202 
1203     SceneNodeArray m_SceneNodes;
1204     ModelArray m_Models;
1205     SkeletalModelArray m_SkeletalModels;
1206     CameraArray m_Cameras;
1207     FogArray m_Fogs;
1208     LightArray m_Lights;
1209     FragmentLightArray m_FragmentLights;
1210     VertexLightArray m_VertexLights;
1211     HemiSphereLightArray m_HemiSphereLights;
1212     AmbientLightArray m_AmbientLights;
1213     ParticleSetArray m_ParticleSets;
1214     ParticleEmitterArray m_ParticleEmitters;
1215     ParticleModelArray m_ParticleModels;
1216     AnimatableNodeArray m_AnimatableNodes;
1217 };
1218 
1219 } // namespace gfx
1220 } // namespace nw
1221 
1222 #endif // NW_GFX_SCENECONTEXT_H_
1223