1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_SceneEnvironment.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 #ifndef NW_GFX_SCENEENVIRONMENT_H_
18 #define NW_GFX_SCENEENVIRONMENT_H_
19 
20 #include <nw/gfx/gfx_Camera.h>
21 #include <nw/gfx/gfx_Fog.h>
22 #include <nw/gfx/gfx_SceneEnvironmentSetting.h>
23 #include <nw/gfx/gfx_LightSet.h>
24 
25 namespace nw
26 {
27 namespace gfx
28 {
29 
30 class FragmentLight;
31 class VertexLight;
32 class AmbientLight;
33 class Fog;
34 class HemiSphereLight;
35 class Camera;
36 
37 //---------------------------------------------------------------------------
38 //! @brief        シーン環境を表すクラスです。
39 //!
40 //! RenderEnvironment は廃止され、SceneEnvironment に変更されました。
41 //---------------------------------------------------------------------------
42 class SceneEnvironment
43 {
44 public:
45 
46     //! @brief シーン環境への設定内容です。
47     struct Description
48     {
49         CameraArray cameras;
50         FogArray fogs;
51         LightSetArray lightSets;
52         VertexLightArray vertexLights;
53     };
54 
55     //! コンストラクタです。
SceneEnvironment(const Description & description)56     SceneEnvironment(const Description& description)
57         : m_AmbientLight(NULL),
58           m_HemiSphereLight(NULL),
59           m_VertexLights(description.vertexLights),
60           m_Fog(NULL),
61           m_Camera(NULL),
62           m_Cameras(description.cameras),
63           m_CameraIndex(-1),
64           m_Fogs(description.fogs),
65           m_LightSets(description.lightSets),
66           m_LightSetIndex(-1),
67           m_ActiveVertexLightCount(0),
68           m_ActiveFragmentLightCount(0),
69           m_FragmentLightsDirty(true),
70           m_AmbientLightDirty(true),
71           m_VertexLightsDirty(true),
72           m_HemiSphereLightDirty(true),
73           m_FogDirty(true)
74     {
75         m_FragmentLights.resize(m_FragmentLights.capacity());
76         m_VertexLights.resize(m_VertexLights.capacity());
77 
78         m_Cameras.resize(m_Cameras.capacity());
79         std::fill(m_Cameras.begin(), m_Cameras.end(), static_cast<Camera*>(NULL));
80 
81         m_Fogs.resize(m_Fogs.capacity());
82         std::fill(m_Fogs.begin(), m_Fogs.end(), static_cast<Fog*>(NULL));
83 
84         m_LightSets.resize(m_LightSets.capacity());
85         std::fill(m_LightSets.begin(), m_LightSets.end(), static_cast<LightSet*>(NULL));
86     }
87 
88     //----------------------------------------
89     //! @name シーン環境設定関連
90     //@{
91 
92     //! @brief シーン環境設定からシーン環境を適用します。
93     //!
94     //! @param[in] setting 適用するシーン環境設定です。
95     //!
96     void ApplyFrom(const SceneEnvironmentSetting& setting);
97 
98     //! @brief シーン環境をクリアします。
99     void ClearSettings();
100 
101     //! @brief フォグ配列にフォグを設定します。
102     //!
103     //! @param[in] index 設定するインデクスです。
104     //! @param[in] fog 設定するフォグです。
105     //!
SetFog(s32 index,Fog * fog)106     void SetFog(s32 index, Fog* fog)
107     {
108         NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size());
109         m_Fogs[index] = fog;
110     }
111 
112     //! @brief フォグ配列からフォグを取得します。
113     //!
114     //! @param[in] index 取得するインデクスです。
115     //!
GetFog(s32 index)116     Fog* GetFog(s32 index)
117     {
118         NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size());
119         return m_Fogs[index];
120     }
121 
122     //! @brief フォグ配列からフォグを取得します。
123     //!
124     //! @param[in] index 取得するインデクスです。
125     //!
GetFog(s32 index)126     const Fog* GetFog(s32 index) const
127     {
128         NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size());
129         return m_Fogs[index];
130     }
131 
132     //! @brief カメラ配列にカメラを設定します。
133     //!
134     //! @param[in] index 設定するインデックスです。
135     //! @param[in] camera 設定するカメラです。
136     //!
SetCamera(int index,Camera * camera)137     void SetCamera(int index, Camera* camera)
138     {
139         NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size());
140         m_Cameras[index] = camera;
141     }
142 
143     //! @brief カメラ配列からカメラを取得します。
144     //!
145     //! @param[in] index 取得するカメラのインデックスです。
146     //!
GetCamera(int index)147     Camera* GetCamera(int index)
148     {
149         NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size());
150         return m_Cameras[index];
151     }
152 
153     //! @brief カメラ配列からカメラを取得します。
154     //!
155     //! @param[in] index 取得するカメラのインデックスです。
156     //!
GetCamera(int index)157     const Camera* GetCamera(int index) const
158     {
159         NW_MINMAXLT_ASSERT(index, 0, m_Cameras.size());
160         return m_Cameras[index];
161     }
162 
163     //! @brief ライトセット配列にライトセットを設定します。
164     //!
165     //! @param[in] index 設定するインデックスです。
166     //! @param[in] lightSet 設定するカメラです。
167     //!
SetLightSet(int index,LightSet * lightSet)168     void SetLightSet(int index, LightSet* lightSet)
169     {
170         NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size());
171         m_LightSets[index] = lightSet;
172     }
173 
174     //! @brief ライトセット配列からライトセットを取得します。
175     //!
176     //! @param[in] index 取得するライトセットのインデックスです。
177     //!
GetLightSet(int index)178     LightSet* GetLightSet(int index)
179     {
180         NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size());
181         return m_LightSets[index];
182     }
183 
184     //! @brief ライトセットの配列からライトセットを取得します。
185     //!
186     //! @param[in] index 取得するライトセットのインデックスです。
187     //!
GetLightSet(int index)188     const LightSet* GetLightSet(int index) const
189     {
190         NW_MINMAXLT_ASSERT(index, 0, m_LightSets.size());
191         return m_LightSets[index];
192     }
193 
194     //@}
195 
196     //----------------------------------------
197     //! @name ライト関連
198     //@{
199 
200     //! @brief        フラグメントライトを設定します。
201     //!
202     //! 全種類の光源はディレクションの方向をライトの向きとするように
203     //! しています。
204     //! 平行光源ではポジションの値は参照しません。
205     //!
206     //! OpenGL では、平行光源はポジションのパラメータを
207     //! 逆向きにしたベクトルをディレクションとして扱いますが、
208     //! ディレクションのパラメータそのまま扱うようにしてあります。
209     //!
210     //! @param[in]    light 設定するフラグメントライトです。
211     //!
SetFragmentLight(FragmentLight * light)212     void SetFragmentLight(FragmentLight* light)
213     {
214         if (this->m_ActiveFragmentLightCount == LIGHT_COUNT)
215         {
216             return;
217         }
218 
219         m_FragmentLights[m_ActiveFragmentLightCount] = (light);
220         ++m_ActiveFragmentLightCount;
221     }
222 
223     //! @brief        フラグメントライトの数を取得します。
224     //!
GetFragmentLightCount()225     s32 GetFragmentLightCount() const
226     {
227         return this->m_ActiveFragmentLightCount;
228     }
229 
230     //! @brief        設定されているフラグメントライトを取得します。
231     //!
232     //! @param[in]    index   取得するフラグメントライトのインデクスです。
233     //!
234     //! @return       フラグメントライトのポインタを返します。
GetFragmentLight(int index)235     const FragmentLight* GetFragmentLight(int index) const
236     {
237         NW_MINMAXLT_ASSERT(index, 0, this->m_ActiveFragmentLightCount);
238         return this->m_FragmentLights[ index ];
239     }
240 
241     //! @brief        頂点ライトを設定します。
242     //!
243     //! 全種類の光源はディレクションの方向をライトの向きとするように
244     //! しています。
245     //! 平行光源ではポジションの値は参照しません。
246     //!
247     //! OpenGL では、平行光源はポジションのパラメータを
248     //! 逆向きにしたベクトルをディレクションとして扱いますが、
249     //! ディレクションのパラメータそのまま扱うようにしてあります。
250     //!
251     //! @param[in]    light 設定する頂点ライトです。
252     //!
SetVertexLight(VertexLight * light)253     void SetVertexLight(VertexLight* light)
254     {
255         if (m_ActiveVertexLightCount == m_VertexLights.capacity())
256         {
257             return;
258         }
259 
260         this->m_VertexLights[m_ActiveVertexLightCount] = light;
261         ++m_ActiveVertexLightCount;
262     }
263 
264     //! @brief        設定されている頂点ライトを取得します。
265     //!
266     //! @param[in]    index   取得する頂点ライトのインデクスです。
267     //!
268     //! @return       頂点ライトのポインタを返します。
GetVertexLight(int index)269     const VertexLight* GetVertexLight(int index) const
270     {
271         NW_MINMAXLT_ASSERT(index, 0, this->m_ActiveVertexLightCount);
272         return this->m_VertexLights[ index ];
273     }
274 
275     //! @brief        頂点ライトの数を取得します。
276     //!
GetVertexLightCount()277     s32 GetVertexLightCount() const
278     {
279         return this->m_ActiveVertexLightCount;
280     }
281 
282     //! @brief        アンビエントライトを設定します。
283     //!
284     //! @param[in]    ambientLight 設定するアンビエントライトです。
285     //!
SetAmbientLight(AmbientLight * ambientLight)286     void SetAmbientLight(AmbientLight* ambientLight)
287     {
288         this->m_AmbientLight = ambientLight;
289     }
290 
291     //! @brief        設定されているアンビエントライトを取得します。
292     //!
293     //! @return       アンビエントライトのポインタを返します。
GetAmbientLight()294     const AmbientLight* GetAmbientLight() const
295     {
296         return this->m_AmbientLight;
297     }
298 
299     //! @brief        半球ライトを設定します。
300     //!
301     //! @param[in]    hemiSphereLight 設定する半球ライトです。
302     //!
SetHemiSphereLight(HemiSphereLight * hemiSphereLight)303     void SetHemiSphereLight(HemiSphereLight* hemiSphereLight)
304     {
305         this->m_HemiSphereLight = hemiSphereLight;
306     }
307 
308     //! @brief        半球ライトを取得します。
309     //!
310     //! @return       半球ライトです。
311     //!
GetHemiSphereLight()312     const HemiSphereLight* GetHemiSphereLight() const
313     {
314         return this->m_HemiSphereLight;
315     }
316 
317 
318     //! @brief        有効なライトセットを設定します。
319     //!
320     //! @return       ライトセットのインデクスです。
321     //!
322     void SetActiveLightSet(int index);
323 
324     //@}
325 
326     //----------------------------------------
327     //! @name フォグ関連
328     //@{
329 
330     //! @brief        インデックスを指定してフォグを有効にします。
331     //!
332     //! @param[in]    index 設定するフォグのインデックス番号です。
333     //!
SetActiveFog(int index)334     void SetActiveFog(int index)
335     {
336         NW_MINMAXLT_ASSERT(index, 0, m_Fogs.size());
337 
338         Fog* fog = m_Fogs[index];
339 
340         if (this->m_Fog != fog)
341         {
342             this->m_Fog = fog;
343             this->m_FogDirty = true;
344         }
345     }
346 
347     //! @brief        有効なフォグを取得します。
348     //!
349     //! @return       フォグです。
350     //!
GetActiveFog()351     Fog* GetActiveFog()
352     {
353         return this->m_Fog;
354     }
355 
356     //! @brief        有効なフォグを取得します。
357     //!
358     //! @return       フォグです。
359     //!
GetActiveFog()360     const Fog* GetActiveFog() const
361     {
362         return this->m_Fog;
363     }
364 
365     //@}
366 
367     //----------------------------------------
368     //! @name フラグ関連
369     //@{
370 
371     //! @brief        フラグメントライトを設定しなおすかどうかを表すフラグを取得します。
372     //!               暫定的な機能となります。
IsFragmentLightsDirty()373     bool IsFragmentLightsDirty() const
374     {
375         return m_FragmentLightsDirty;
376     }
377 
378     //! @brief        フラグメントライトを設定しなおすかどうかを表すフラグを設定します。
379     //!               暫定的な機能となります。
SetFragmentLightsDirty(bool fragmentLightsDirty)380     void SetFragmentLightsDirty(bool fragmentLightsDirty)
381     {
382         m_FragmentLightsDirty = fragmentLightsDirty;
383     }
384 
385     //! @brief        アンビエントライトを設定しなおすかどうかを表すフラグを取得します。
386     //!               暫定的な機能となります。
IsAmbientLightDirty()387     bool IsAmbientLightDirty() const
388     {
389         return m_AmbientLightDirty;
390     }
391 
392     //! @brief        アンビエントライトを設定しなおすかどうかを表すフラグを設定します。
393     //!               暫定的な機能となります。
SetAmbientLightDirty(bool ambientLightDirty)394     void SetAmbientLightDirty(bool ambientLightDirty)
395     {
396         m_AmbientLightDirty = ambientLightDirty;
397     }
398 
399     //! @brief        頂点ライトを設定しなおすかどうかを表すフラグを取得します。
400     //!               暫定的な機能となります。
IsVertexLightsDirty()401     bool IsVertexLightsDirty() const
402     {
403 #if defined(NW_GFX_VERTEX_LIGHT_ENABLED)
404         return m_VertexLightsDirty;
405 #else
406         return false;
407 #endif
408     }
409 
410     //! @brief        頂点ライトを設定しなおすかどうかを表すフラグを設定します。
411     //!               暫定的な機能となります。
SetVertexLightsDirty(bool vertexLightsDirty)412     void SetVertexLightsDirty(bool vertexLightsDirty)
413     {
414         m_VertexLightsDirty = vertexLightsDirty;
415     }
416 
417     //! @brief        半球ライトを設定しなおすかどうかを表すフラグを取得します。
418     //!               暫定的な機能となります。
IsHemiSphereLightDirty()419     bool IsHemiSphereLightDirty() const
420     {
421         return m_HemiSphereLightDirty;
422     }
423 
424     //! @brief        半球ライトを設定しなおすかどうかを表すフラグを設定します。
425     //!               暫定的な機能となります。
SetHemiSphereLightDirty(bool hemiSphereLightDirty)426     void SetHemiSphereLightDirty(bool hemiSphereLightDirty)
427     {
428         m_HemiSphereLightDirty = hemiSphereLightDirty;
429     }
430 
431     //! @brief        フォグを設定しなおすかどうかを表すフラグを取得します。
432     //!               暫定的な機能となります。
IsFogDirty()433     bool IsFogDirty() const
434     {
435         return m_FogDirty;
436     }
437 
438     //! @brief        フォグを設定しなおすかどうかを表すフラグを設定します。
439     //!               暫定的な機能となります。
SetFogDirty(bool fogDirty)440     void SetFogDirty(bool fogDirty)
441     {
442         m_FogDirty = fogDirty;
443     }
444 
445     //! @brief        ライトやフォグを設定しなおすかどうかを表すフラグを設定します。
446     //!               暫定的な機能となります。
SetAllFlagsDirty(bool flagsDirty)447     void SetAllFlagsDirty(bool flagsDirty)
448     {
449         m_FogDirty = flagsDirty;
450         m_AmbientLightDirty = flagsDirty;
451         m_FragmentLightsDirty = flagsDirty;
452 
453 #if defined(NW_GFX_VERTEX_LIGHT_ENABLED)
454         m_VertexLightsDirty = flagsDirty;
455 #endif
456         m_HemiSphereLightDirty = flagsDirty;
457     }
458 
459     //@}
460 
461     //----------------------------------------
462     //! @name ステート関連
463     //@{
464 
465     //! @brief        全てのステートをリセットします。
466     void Reset();
467 
468     //! @brief        フラグメントライトのステートをリセットします。
469     void ResetFragmentLights();
470 
471     //! @brief        頂点ライトのステートをリセットします。
472     void ResetVertexLights();
473 
474     //! @brief        半球ライトのステートをリセットします。
475     void ResetHemiSphereLight();
476 
477     //! @brief        アンビエントライトのステートをリセットします。
478     void ResetAmbientLight();
479 
480     //! @brief        フォグのステートをリセットします。
481     void ResetFog();
482 
483     //! @brief        ライトセットのステートをリセットします。
484     void ResetLightSet();
485 
486     //@}
487 
488 private:
489     AmbientLight* m_AmbientLight;
490     HemiSphereLight* m_HemiSphereLight;
491     VertexLightArray m_VertexLights;
492     FixedFragmentLightArray m_FragmentLights;
493     Fog* m_Fog;
494     Camera* m_Camera;
495     CameraArray m_Cameras;
496     s32 m_CameraIndex;
497     FogArray m_Fogs;
498     LightSetArray m_LightSets;
499 
500     s32 m_LightSetIndex;
501     s32 m_ActiveVertexLightCount;
502     s32 m_ActiveFragmentLightCount;
503 
504     bool m_FragmentLightsDirty;
505     bool m_AmbientLightDirty;
506     bool m_VertexLightsDirty;
507     bool m_HemiSphereLightDirty;
508     bool m_FogDirty;
509 
510     friend class RenderContext;
511 };
512 
513 //! 互換性のための定義です。
514 typedef SceneEnvironment RenderEnvironment;
515 
516 } // namespace gfx
517 } // namespace nw
518 
519 #endif // NW_GFX_SCENEENVIRONMENT_H_
520 
521