1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_SceneInitializer.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_SCENEINITIALIZER_H_
19 #define NW_GFX_SCENEINITIALIZER_H_
20 
21 #include <nw/gfx/gfx_ISceneVisitor.h>
22 
23 namespace nw
24 {
25 namespace gfx
26 {
27 
28 class IMaterialIdGenerator;
29 
30 //---------------------------------------------------------------------------
31 //! @brief        シーン内を探索して初期化を行います。
32 //---------------------------------------------------------------------------
33 class SceneInitializer : public ISceneVisitor
34 {
35 private:
36     NW_DISALLOW_COPY_AND_ASSIGN(SceneInitializer);
37 
38 public:
39     NW_UT_RUNTIME_TYPEINFO;
40 
41     //! @brief 設定内容です。
42     struct Description
43     {
44         IMaterialIdGenerator* materialIdGenerator; //!< マテリアルIDのジェネレータです。
45 
46         //! @brief コンストラクタです。
DescriptionDescription47         Description()
48          : materialIdGenerator(NULL)
49         {}
50     };
51 
52     //! シーンイニシャライザーを構築するためのクラスです。
53     class Builder
54     {
55     public:
56         //! @brief マテリアルIDジェネレーターを設定します。
57         //!        所有権が移動しますので SceneInitializer を破棄する際に一緒に破棄されます。
MaterialIdGenerator(IMaterialIdGenerator * materialIdGenerator)58         Builder& MaterialIdGenerator(IMaterialIdGenerator* materialIdGenerator)
59         {
60             m_Description.materialIdGenerator = materialIdGenerator;
61             return *this;
62         }
63 
64         //! @brief        シーンイニシャライザーを生成します。
65         //!
66         //! @param[in]    allocator アロケータです。
67         //!
68         //! @return       生成したイニシャライザーを返します。
69         //!
70         SceneInitializer* Create(os::IAllocator* allocator);
71 
72     private:
73         Description m_Description;
74     };
75 
76     //! @brief        シーンイニシャライズの前処理を行います。
77     //!
78     void Begin();
79 
80     //! @brief シーンイニシャライズの後処理を行います。
81     //!
82     //! マテリアルIDの生成などが行われますので、必ず呼び出す必要があります。
83     //!
84     void End();
85 
86     //----------------------------------------
87     //! @name ビジターの実装
88     //@{
89 
VisitSceneNode(SceneNode *)90     virtual void VisitSceneNode(SceneNode*) {}
VisitTransformNode(TransformNode *)91     virtual void VisitTransformNode(TransformNode*) {}
VisitUserRenderNode(UserRenderNode *)92     virtual void VisitUserRenderNode(UserRenderNode*) {}
93     virtual void VisitModel(Model* model);
94     virtual void VisitSkeletalModel(SkeletalModel* model);
VisitCamera(Camera *)95     virtual void VisitCamera(Camera*) {}
VisitFog(Fog *)96     virtual void VisitFog(Fog*) {}
VisitLight(Light *)97     virtual void VisitLight(Light*) {}
VisitFragmentLight(FragmentLight *)98     virtual void VisitFragmentLight(FragmentLight*) {}
99 #if defined(NW_GFX_VERTEX_LIGHT_ENABLED)
VisitVertexLight(VertexLight *)100     virtual void VisitVertexLight(VertexLight*) {}
101 #endif
VisitAmbientLight(AmbientLight *)102     virtual void VisitAmbientLight(AmbientLight*) {}
VisitHemiSphereLight(HemiSphereLight *)103     virtual void VisitHemiSphereLight(HemiSphereLight*) {}
VisitParticleSet(ParticleSet *)104     virtual void VisitParticleSet(ParticleSet*) {}
VisitParticleEmitter(ParticleEmitter *)105     virtual void VisitParticleEmitter(ParticleEmitter*) {}
106     virtual void VisitParticleModel(ParticleModel*);
107 
108     //@}
109 
110 private:
111 
SceneInitializer(os::IAllocator * allocator,Description description)112     SceneInitializer(os::IAllocator* allocator, Description description)
113         : ISceneVisitor(allocator),
114           m_MaterialIdGenerator(description.materialIdGenerator)
115     {}
116 
~SceneInitializer()117     virtual ~SceneInitializer() {}
118 
119     GfxPtr<IMaterialIdGenerator> m_MaterialIdGenerator;
120 };
121 
122 } // namespace gfx
123 } // namespace nw
124 
125 #endif // NW_GFX_SCENEINITIALIZER_H_
126