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