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