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