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