1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_SceneContext.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: 24971 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_GFX_SCENECONTEXT_H_ 17 #define NW_GFX_SCENECONTEXT_H_ 18 19 #include <nw/gfx/gfx_GfxObject.h> 20 21 namespace nw 22 { 23 namespace gfx 24 { 25 26 class SceneNode; 27 class Model; 28 class SkeletalModel; 29 class Light; 30 class FragmentLight; 31 class VertexLight; 32 class HemiSphereLight; 33 class AmbientLight; 34 class Camera; 35 class Fog; 36 class ParticleSet; 37 class ParticleEmitter; 38 class ParticleModel; 39 class LightSet; 40 41 //! @brief シーンノードの Array の定義です。 42 typedef ut::MoveArray<SceneNode*> SceneNodeArray; 43 44 //! @brief モデルの Array の定義です。 45 typedef ut::MoveArray<Model*> ModelArray; 46 47 //! @brief スケルタルモデルの Array の定義です。 48 typedef ut::MoveArray<SkeletalModel*> SkeletalModelArray; 49 50 //! @brief ライトの Array の定義です。 51 typedef ut::MoveArray<Light*> LightArray; 52 53 //! @brief フラグメントライトの Array の定義です。 54 typedef ut::MoveArray<FragmentLight*> FragmentLightArray; 55 56 //! @brief 頂点ライトの Array の定義です。 57 typedef ut::MoveArray<VertexLight*> VertexLightArray; 58 59 //! @brief 半球ライトの Array の定義です。 60 typedef ut::MoveArray<HemiSphereLight*> HemiSphereLightArray; 61 62 //! @brief アンビエントライトの Array の定義です。 63 typedef ut::MoveArray<AmbientLight*> AmbientLightArray; 64 65 //! @brief カメラの Array の定義です。 66 typedef ut::MoveArray<Camera*> CameraArray; 67 68 //! @brief フォグの Array の定義です。 69 typedef ut::MoveArray<Fog*> FogArray; 70 71 //! @brief パーティクルセットの Array の定義です。 72 typedef ut::MoveArray<ParticleSet*> ParticleSetArray; 73 74 //! @brief パーティクルエミッタの Array の定義です。 75 typedef ut::MoveArray<ParticleEmitter*> ParticleEmitterArray; 76 77 //! @brief パーティクルモデルの Array の定義です。 78 typedef ut::MoveArray<ParticleModel*> ParticleModelArray; 79 80 //! @brief ライトセットの配列です。 81 typedef ut::MoveArray<LightSet*> LightSetArray; 82 83 //! @brief アニメーションするノードの Array の定義です。 84 typedef ut::MoveArray<SceneNode*> AnimatableNodeArray; 85 86 //--------------------------------------------------------------------------- 87 //! @brief シーン解析時の内容を保持させるためのクラスです。 88 //--------------------------------------------------------------------------- 89 class SceneContext : public GfxObject 90 { 91 private: 92 NW_DISALLOW_COPY_AND_ASSIGN(SceneContext); 93 94 public: 95 96 // [非推奨] 互換性のために残してありますが、こちらの定義は用いないでください。 97 98 //! @details :private 99 typedef SceneNodeArray SceneNodeArray; 100 //! @details :private 101 typedef ModelArray ModelArray; 102 //! @details :private 103 typedef SkeletalModelArray SkeletalModelArray; 104 //! @details :private 105 typedef FragmentLightArray FragmentLightArray; 106 //! @details :private 107 typedef VertexLightArray VertexLightArray; 108 //! @details :private 109 typedef HemiSphereLightArray HemiSphereLightArray; 110 //! @details :private 111 typedef AmbientLightArray AmbientLightArray; 112 //! @details :private 113 typedef CameraArray CameraArray; 114 //! @details :private 115 typedef FogArray FogArray; 116 //! @details :private 117 typedef ParticleSetArray ParticleSetArray; 118 //! @details :private 119 typedef ParticleEmitterArray ParticleEmitterArray; 120 //! @details :private 121 typedef ParticleModelArray ParticleModelArray; 122 123 enum 124 { 125 DEFAULT_MAX_SCENE_NODES = 64, //!< シーンノードのデフォルト最大数です。 126 DEFAULT_MAX_MODELS = 64, //!< モデルのデフォルト最大数です。 127 DEFAULT_MAX_SKELETAL_MODELS = 64, //!< スケルタルモデルのデフォルト最大数です。 128 DEFAULT_MAX_CAMERAS = 4, //!< カメラのデフォルト最大数です。 129 DEFAULT_MAX_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 130 DEFAULT_MAX_FRAGMENT_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 131 DEFAULT_MAX_VERTEX_LIGHTS = 8, //!< 頂点ライトのデフォルト最大数です。 132 DEFAULT_MAX_HEMISPHERE_LIGHTS = 4, //!< 半球ライトのデフォルト最大数です。 133 DEFAULT_MAX_AMBIENT_LIGHTS = 4, //!< アンビエントライトのデフォルト最大数です。 134 DEFAULT_MAX_FOGS = 4, //!< フォグのデフォルト最大数です。 135 DEFAULT_MAX_PARTICLESETS = 64, //!< パーティクルセットのデフォルト最大数です。 136 DEFAULT_MAX_PARTICLEEMITTERS = 64, //!< パーティクルエミッタのデフォルト最大数です。 137 DEFAULT_MAX_PARTICLEMODELS = 64, //!< パーティクルモデルのデフォルト最大数です。 138 DEFAULT_MAX_ANIMATABLE_NODES = 64 //!< アニメーションを行うシーンノードのデフォルト最大数です。 139 }; 140 141 //---------------------------------------- 142 //! @name 作成 143 //@{ 144 145 //! @brief シーンコンテキストクラスを構築するためのクラスです。 146 //! 147 //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 148 class Builder 149 { 150 public: Builder()151 Builder() 152 : m_IsFixedSizeMemory(true), 153 m_MaxSceneNodes(DEFAULT_MAX_SCENE_NODES), 154 m_MaxModels(DEFAULT_MAX_MODELS), 155 m_MaxSkeletalModels(DEFAULT_MAX_SKELETAL_MODELS), 156 m_MaxCameras(DEFAULT_MAX_CAMERAS), 157 m_MaxLights(DEFAULT_MAX_LIGHTS), 158 m_MaxFragmentLights(DEFAULT_MAX_FRAGMENT_LIGHTS), 159 m_MaxVertexLights(DEFAULT_MAX_VERTEX_LIGHTS), 160 m_MaxHemiSphereLights(DEFAULT_MAX_HEMISPHERE_LIGHTS), 161 m_MaxAmbientLights(DEFAULT_MAX_AMBIENT_LIGHTS), 162 m_MaxFogs(DEFAULT_MAX_FOGS), 163 m_MaxParticleSets(DEFAULT_MAX_PARTICLESETS), 164 m_MaxParticleEmitters(DEFAULT_MAX_PARTICLEEMITTERS), 165 m_MaxParticleModels(DEFAULT_MAX_PARTICLEMODELS), 166 m_MaxAnimatableNodes(DEFAULT_MAX_ANIMATABLE_NODES) 167 {} 168 169 //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 170 //! 171 //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 172 //! 173 //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 IsFixedSizeMemory(bool isFixedSizeMemory)174 Builder& IsFixedSizeMemory(bool isFixedSizeMemory) 175 { 176 m_IsFixedSizeMemory = isFixedSizeMemory; 177 return *this; 178 } 179 180 //! @brief シーンノードの最大数を設定します。 MaxSceneNodes(s32 max)181 Builder& MaxSceneNodes(s32 max) { m_MaxSceneNodes = max; return *this; } 182 183 //! @brief モデルの最大数を設定します。 MaxModels(s32 max)184 Builder& MaxModels(s32 max) { m_MaxModels = max; return *this; } 185 186 //! @brief スケルタルモデルの最大数を設定します。 MaxSkeletalModels(s32 max)187 Builder& MaxSkeletalModels(s32 max) { m_MaxSkeletalModels = max; return *this; } 188 189 //! @brief カメラの最大数を設定します。 MaxCameras(s32 max)190 Builder& MaxCameras(s32 max) { m_MaxCameras = max; return *this; } 191 192 //! @brief ライトの最大数を設定します。 MaxLights(s32 max)193 Builder& MaxLights(s32 max) { m_MaxLights = max; return *this; } 194 195 //! @brief フラグメントライトの最大数を設定します。 MaxFragmentLights(s32 max)196 Builder& MaxFragmentLights(s32 max) { m_MaxFragmentLights = max; return *this; } 197 198 //! @brief 頂点ライトの最大数を設定します。 MaxVertexLights(s32 max)199 Builder& MaxVertexLights(s32 max) { m_MaxVertexLights = max; return *this; } 200 201 //! @brief 半球ライトの最大数を設定します。 MaxHemiSphereLights(s32 max)202 Builder& MaxHemiSphereLights(s32 max) { m_MaxHemiSphereLights = max; return *this; } 203 204 //! @brief アンビエントライトの最大数を設定します。 MaxAmbientLights(s32 max)205 Builder& MaxAmbientLights(s32 max) { m_MaxAmbientLights = max; return *this; } 206 207 //! @brief フォグの最大数を設定します。 MaxFogs(s32 max)208 Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; } 209 210 //! @brief パーティクルセットの最大数を設定します。 MaxParticleSets(s32 max)211 Builder& MaxParticleSets(s32 max) { m_MaxParticleSets = max; return *this; } 212 213 //! @brief パーティクルエミッタの最大数を設定します。 MaxParticleEmitters(s32 max)214 Builder& MaxParticleEmitters(s32 max) { m_MaxParticleEmitters = max; return *this; } 215 216 //! @brief パーティクルモデルの最大数を設定します。 MaxParticleModels(s32 max)217 Builder& MaxParticleModels(s32 max) { m_MaxParticleModels = max; return *this; } 218 219 //! @brief アニメーションを行うシーンノードの最大数を設定します。 MaxAnimatableNodes(s32 max)220 Builder& MaxAnimatableNodes(s32 max) { m_MaxAnimatableNodes = max; return *this; } 221 222 //! @brief シーンコンテキストを生成します。 223 SceneContext* Create(os::IAllocator* allocator); 224 225 private: 226 bool m_IsFixedSizeMemory; 227 s32 m_MaxSceneNodes; 228 s32 m_MaxModels; 229 s32 m_MaxSkeletalModels; 230 s32 m_MaxCameras; 231 s32 m_MaxLights; 232 s32 m_MaxFragmentLights; 233 s32 m_MaxVertexLights; 234 s32 m_MaxHemiSphereLights; 235 s32 m_MaxAmbientLights; 236 s32 m_MaxFogs; 237 s32 m_MaxParticleSets; 238 s32 m_MaxParticleEmitters; 239 s32 m_MaxParticleModels; 240 s32 m_MaxAnimatableNodes; 241 }; 242 243 //@} 244 245 //---------------------------------------- 246 //! @name 更新 247 //@{ 248 249 //! シーン解析結果をクリアします。 Clear()250 void Clear() 251 { 252 m_SceneNodes.clear(); 253 m_Models.clear(); 254 m_SkeletalModels.clear(); 255 m_Lights.clear(); 256 m_FragmentLights.clear(); 257 m_VertexLights.clear(); 258 m_HemiSphereLights.clear(); 259 m_AmbientLights.clear(); 260 m_Cameras.clear(); 261 m_Fogs.clear(); 262 m_ParticleSets.clear(); 263 m_ParticleEmitters.clear(); 264 m_ParticleModels.clear(); 265 m_AnimatableNodes.clear(); 266 } 267 268 //@} 269 270 //---------------------------------------- 271 //! @name 取得/設定 272 //@{ 273 274 //! @brief 直列化シーンノードを追加します。 275 //! 276 //! @param[in] node 追加するシーンノードです。 277 //! PushSceneNode(SceneNode * node)278 void PushSceneNode(SceneNode* node) 279 { 280 bool isPushed = m_SceneNodes.push_back(node); 281 NW_ASSERT(isPushed); 282 } 283 284 //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 285 //! 286 //! @return シーンノードの先頭を指すイテレータです。 287 //! GetSceneNodesBegin()288 SceneNodeArray::iterator GetSceneNodesBegin() 289 { 290 return m_SceneNodes.begin(); 291 } 292 293 //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 294 //! 295 //! @return シーンノードの先頭を指すイテレータです。 296 //! GetSceneNodesBegin()297 SceneNodeArray::const_iterator GetSceneNodesBegin() const 298 { 299 return m_SceneNodes.begin(); 300 } 301 302 //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 303 //! 304 //! @return シーンノードの終端を指すイテレータです。 305 //! GetSceneNodesEnd()306 SceneNodeArray::iterator GetSceneNodesEnd() 307 { 308 return m_SceneNodes.end(); 309 } 310 311 //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 312 //! 313 //! @return シーンノードの終端を指すイテレータです。 314 //! GetSceneNodesEnd()315 SceneNodeArray::const_iterator GetSceneNodesEnd() const 316 { 317 return m_SceneNodes.end(); 318 } 319 320 //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 321 //! 322 //! @return シーンノードの先頭と終端を指すイテレータです。 323 //! GetSceneNodes()324 std::pair<SceneNodeArray::iterator, SceneNodeArray::iterator> GetSceneNodes() 325 { 326 return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); 327 } 328 329 //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 330 //! 331 //! @return シーンノードの先頭と終端を指すイテレータです。 332 //! GetSceneNodes()333 std::pair<SceneNodeArray::const_iterator, SceneNodeArray::const_iterator> GetSceneNodes() const 334 { 335 return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); 336 } 337 338 //@} 339 340 //---------------------------------------- 341 //! @name モデル関連 342 //@{ 343 344 //! @brief モデルを追加します。 345 //! 「モデル」には、派生クラス(SkeletalModelなど)も含まれます。 346 //! 347 //! @param[in] model モデルです。 348 //! PushModel(Model * model)349 void PushModel(Model* model) 350 { 351 bool isPushed = m_Models.push_back(model); 352 NW_ASSERT(isPushed); 353 } 354 355 //! @brief モデルの先頭を指すイテレータを取得します。 356 //! 357 //! @return モデルの先頭を指すイテレータです。 358 //! GetModelsBegin()359 ModelArray::iterator GetModelsBegin() 360 { 361 return m_Models.begin(); 362 } 363 364 //! @brief モデルの先頭を指すイテレータを取得します。 365 //! 366 //! @return モデルの先頭を指すイテレータです。 367 //! GetModelsBegin()368 ModelArray::const_iterator GetModelsBegin() const 369 { 370 return m_Models.begin(); 371 } 372 373 //! @brief モデルの終端を指すイテレータを取得します。 374 //! 375 //! @return モデルの終端を指すイテレータです。 376 //! GetModelsEnd()377 ModelArray::iterator GetModelsEnd() 378 { 379 return m_Models.end(); 380 } 381 382 //! @brief モデルの終端を指すイテレータを取得します。 383 //! 384 //! @return モデルの終端を指すイテレータです。 385 //! GetModelsEnd()386 ModelArray::const_iterator GetModelsEnd() const 387 { 388 return m_Models.end(); 389 } 390 391 //! @brief スケルタルモデルを追加します。 392 //! 393 //! @param[in] skeletalModel スケルタルモデルです。 394 //! PushSkeletalModel(SkeletalModel * skeletalModel)395 void PushSkeletalModel(SkeletalModel* skeletalModel) 396 { 397 bool isPushed = m_SkeletalModels.push_back(skeletalModel); 398 NW_ASSERT(isPushed); 399 } 400 401 //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 402 //! 403 //! @return スケルタルモデルの先頭を指すイテレータです。 404 //! GetSkeletalModelsBegin()405 SkeletalModelArray::iterator GetSkeletalModelsBegin() 406 { 407 return m_SkeletalModels.begin(); 408 } 409 410 //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 411 //! 412 //! @return スケルタルモデルの先頭を指すイテレータです。 413 //! GetSkeletalModelsBegin()414 SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const 415 { 416 return m_SkeletalModels.begin(); 417 } 418 419 //! @brief スケルタルモデルの終端を指すイテレータを取得します。 420 //! 421 //! @return スケルタルモデルの終端を指すイテレータです。 422 //! GetSkeletalModelsEnd()423 SkeletalModelArray::iterator GetSkeletalModelsEnd() 424 { 425 return m_SkeletalModels.end(); 426 } 427 428 //! @brief スケルタルモデルの終端を指すイテレータを取得します。 429 //! 430 //! @return スケルタルモデルの終端を指すイテレータです。 431 //! GetSkeletalModelsEnd()432 SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const 433 { 434 return m_SkeletalModels.end(); 435 } 436 437 //@} 438 439 //---------------------------------------- 440 //! @name ライト関連 441 //@{ 442 443 //! @brief ライトを追加します。 444 //! 「ライト」には、派生クラス(FragmentLightなど)も含まれます。 445 //! 446 //! @param[in] light ライトです。 447 //! PushLight(Light * light)448 void PushLight(Light* light) 449 { 450 bool isPushed = m_Lights.push_back(light); 451 NW_ASSERT(isPushed); 452 } 453 454 //! @brief ライトの先頭を指すイテレータを取得します。 455 //! 456 //! @return ライトの先頭を指すイテレータです。 457 //! GetLightsBegin()458 LightArray::iterator GetLightsBegin() 459 { 460 return m_Lights.begin(); 461 } 462 463 //! @brief ライトの先頭を指すイテレータを取得します。 464 //! 465 //! @return ライトの先頭を指すイテレータです。 466 //! GetLightsBegin()467 LightArray::const_iterator GetLightsBegin() const 468 { 469 return m_Lights.begin(); 470 } 471 472 //! @brief ライトの終端を指すイテレータを取得します。 473 //! 474 //! @return ライトの終端を指すイテレータです。 475 //! GetLightsEnd()476 LightArray::iterator GetLightsEnd() 477 { 478 return m_Lights.end(); 479 } 480 481 //! @brief ライトの終端を指すイテレータを取得します。 482 //! 483 //! @return ライトの終端を指すイテレータです。 484 //! GetLightsEnd()485 LightArray::const_iterator GetLightsEnd() const 486 { 487 return m_Lights.end(); 488 } 489 490 //! @brief フラグメントライトを追加します。 491 //! 492 //! @param[in] light フラグメントライトです。 493 //! PushFragmentLight(FragmentLight * light)494 void PushFragmentLight(FragmentLight* light) 495 { 496 bool isPushed = m_FragmentLights.push_back(light); 497 NW_ASSERT(isPushed); 498 } 499 500 //! @brief フラグメントライトの先頭を指すイテレータを取得します。 501 //! 502 //! @return フラグメントライトの先頭を指すイテレータです。 503 //! GetFragmentLightsBegin()504 FragmentLightArray::iterator GetFragmentLightsBegin() 505 { 506 return m_FragmentLights.begin(); 507 } 508 509 //! @brief フラグメントライトの先頭を指すイテレータを取得します。 510 //! 511 //! @return フラグメントライトの先頭を指すイテレータです。 512 //! GetFragmentLightsBegin()513 FragmentLightArray::const_iterator GetFragmentLightsBegin() const 514 { 515 return m_FragmentLights.begin(); 516 } 517 518 //! @brief フラグメントライトの終端を指すイテレータを取得します。 519 //! 520 //! @return フラグメントライトの終端を指すイテレータです。 521 //! GetFragmentLightsEnd()522 FragmentLightArray::iterator GetFragmentLightsEnd() 523 { 524 return m_FragmentLights.end(); 525 } 526 527 //! @brief フラグメントライトの終端を指すイテレータを取得します。 528 //! 529 //! @return フラグメントライトの終端を指すイテレータです。 530 //! GetFragmentLightsEnd()531 FragmentLightArray::const_iterator GetFragmentLightsEnd() const 532 { 533 return m_FragmentLights.end(); 534 } 535 536 //! @brief 頂点ライトを追加します。 537 //! 538 //! @param[in] light 頂点ライトです。 539 //! PushVertexLight(VertexLight * light)540 void PushVertexLight(VertexLight* light) 541 { 542 bool isPushed = m_VertexLights.push_back(light); 543 NW_ASSERT(isPushed); 544 } 545 546 //! @brief 頂点ライトの先頭を指すイテレータを取得します。 547 //! 548 //! @return 頂点ライトの先頭を指すイテレータです。 549 //! GetVertexLightsBegin()550 VertexLightArray::iterator GetVertexLightsBegin() 551 { 552 return m_VertexLights.begin(); 553 } 554 555 //! @brief 頂点ライトの先頭を指すイテレータを取得します。 556 //! 557 //! @return 頂点ライトの先頭を指すイテレータです。 558 //! GetVertexLightsBegin()559 VertexLightArray::const_iterator GetVertexLightsBegin() const 560 { 561 return m_VertexLights.begin(); 562 } 563 564 //! @brief 頂点ライトの終端を指すイテレータを取得します。 565 //! 566 //! @return 頂点ライトの終端を指すイテレータです。 567 //! GetVertexLightsEnd()568 VertexLightArray::iterator GetVertexLightsEnd() 569 { 570 return m_VertexLights.end(); 571 } 572 573 //! @brief 頂点ライトの終端を指すイテレータを取得します。 574 //! 575 //! @return 頂点ライトの終端を指すイテレータです。 576 //! GetVertexLightsEnd()577 VertexLightArray::const_iterator GetVertexLightsEnd() const 578 { 579 return m_VertexLights.end(); 580 } 581 582 //! @brief 半球ライトを追加します。 583 //! 584 //! @param[in] light 半球ライトです。 585 //! PushHemiSphereLight(HemiSphereLight * light)586 void PushHemiSphereLight(HemiSphereLight* light) 587 { 588 bool isPushed = m_HemiSphereLights.push_back(light); 589 NW_ASSERT(isPushed); 590 } 591 592 //! @brief 半球ライトの先頭を指すイテレータを取得します。 593 //! 594 //! @return 半球ライトの先頭を指すイテレータです。 595 //! GetHemiSphereLightsBegin()596 HemiSphereLightArray::iterator GetHemiSphereLightsBegin() 597 { 598 return m_HemiSphereLights.begin(); 599 } 600 601 //! @brief 半球ライトの先頭を指すイテレータを取得します。 602 //! 603 //! @return 半球ライトの先頭を指すイテレータです。 604 //! GetHemiSphereLightsBegin()605 HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const 606 { 607 return m_HemiSphereLights.begin(); 608 } 609 610 //! @brief 半球ライトの終端を指すイテレータを取得します。 611 //! 612 //! @return 半球ライトの終端を指すイテレータです。 613 //! GetHemiSphereLightsEnd()614 HemiSphereLightArray::iterator GetHemiSphereLightsEnd() 615 { 616 return m_HemiSphereLights.end(); 617 } 618 619 //! @brief 半球ライトの終端を指すイテレータを取得します。 620 //! 621 //! @return 半球ライトの終端を指すイテレータです。 622 //! GetHemiSphereLightsEnd()623 HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const 624 { 625 return m_HemiSphereLights.end(); 626 } 627 628 //! @brief アンビエントライトを追加します。 629 //! 630 //! @param[in] light アンビエントライトです。 631 //! PushAmbientLight(AmbientLight * light)632 void PushAmbientLight(AmbientLight* light) 633 { 634 bool isPushed = m_AmbientLights.push_back(light); 635 NW_ASSERT(isPushed); 636 } 637 638 //! @brief アンビエントライトの先頭を指すイテレータを取得します。 639 //! 640 //! @return アンビエントライトの先頭を指すイテレータです。 641 //! GetAmbientLightsBegin()642 AmbientLightArray::iterator GetAmbientLightsBegin() 643 { 644 return m_AmbientLights.begin(); 645 } 646 647 //! @brief アンビエントライトの先頭を指すイテレータを取得します。 648 //! 649 //! @return アンビエントライトの先頭を指すイテレータです。 650 //! GetAmbientLightsBegin()651 AmbientLightArray::const_iterator GetAmbientLightsBegin() const 652 { 653 return m_AmbientLights.begin(); 654 } 655 656 //! @brief アンビエントライトの終端を指すイテレータを取得します。 657 //! 658 //! @return アンビエントライトの終端を指すイテレータです。 659 //! GetAmbientLightsEnd()660 AmbientLightArray::iterator GetAmbientLightsEnd() 661 { 662 return m_AmbientLights.end(); 663 } 664 665 //! @brief アンビエントライトの終端を指すイテレータを取得します。 666 //! 667 //! @return アンビエントライトの終端を指すイテレータです。 668 //! GetAmbientLightsEnd()669 AmbientLightArray::const_iterator GetAmbientLightsEnd() const 670 { 671 return m_AmbientLights.end(); 672 } 673 674 //@} 675 676 //---------------------------------------- 677 //! @name カメラ関連 678 //@{ 679 680 //! @brief カメラを追加します。 681 //! 682 //! @param[in] camera カメラです。 683 //! PushCamera(Camera * camera)684 void PushCamera(Camera* camera) 685 { 686 bool isPushed = m_Cameras.push_back(camera); 687 NW_ASSERT(isPushed); 688 } 689 690 //! @brief カメラの先頭を指すイテレータを取得します。 691 //! 692 //! @return カメラの先頭を指すイテレータです。 693 //! GetCameraBegin()694 CameraArray::iterator GetCameraBegin() 695 { 696 return m_Cameras.begin(); 697 } 698 699 //! @brief カメラの先頭を指すイテレータを取得します。 700 //! 701 //! @return カメラの先頭を指すイテレータです。 702 //! GetCameraBegin()703 CameraArray::const_iterator GetCameraBegin() const 704 { 705 return m_Cameras.begin(); 706 } 707 708 //! @brief カメラの終端を指すイテレータを取得します。 709 //! 710 //! @return カメラの終端を指すイテレータです。 711 //! GetCameraEnd()712 CameraArray::iterator GetCameraEnd() 713 { 714 return m_Cameras.end(); 715 } 716 717 //! @brief カメラの終端を指すイテレータを取得します。 718 //! 719 //! @return カメラの終端を指すイテレータです。 720 //! GetCameraEnd()721 CameraArray::const_iterator GetCameraEnd() const 722 { 723 return m_Cameras.end(); 724 } 725 726 //@} 727 728 //---------------------------------------- 729 //! @name フォグ関連 730 //@{ 731 732 //! @brief フォグを追加します。 733 //! 734 //! @param[in] fog フォグです。 735 //! PushFog(Fog * fog)736 void PushFog(Fog* fog) 737 { 738 bool isPushed = m_Fogs.push_back(fog); 739 NW_ASSERT(isPushed); 740 } 741 742 //! @brief フォグの先頭を指すイテレータを取得します。 743 //! 744 //! @return フォグの先頭を指すイテレータです。 745 //! GetFogBegin()746 FogArray::iterator GetFogBegin() 747 { 748 return m_Fogs.begin(); 749 } 750 751 //! @brief フォグの先頭を指すイテレータを取得します。 752 //! 753 //! @return フォグの先頭を指すイテレータです。 754 //! GetFogBegin()755 FogArray::const_iterator GetFogBegin() const 756 { 757 return m_Fogs.begin(); 758 } 759 760 //! @brief フォグの終端を指すイテレータを取得します。 761 //! 762 //! @return フォグの終端を指すイテレータです。 763 //! GetFogEnd()764 FogArray::iterator GetFogEnd() 765 { 766 return m_Fogs.end(); 767 } 768 769 //! @brief フォグの終端を指すイテレータを取得します。 770 //! 771 //! @return フォグの終端を指すイテレータです。 772 //! GetFogEnd()773 FogArray::const_iterator GetFogEnd() const 774 { 775 return m_Fogs.end(); 776 } 777 778 //@} 779 780 //---------------------------------------- 781 //! @name パーティクルセット関連 782 //@{ 783 784 //! @brief パーティクルセットを追加します。 785 //! 786 //! @param[in] particleSet パーティクルセットです。 787 //! PushParticleSet(ParticleSet * particleSet)788 void PushParticleSet(ParticleSet* particleSet) 789 { 790 bool isPushed = m_ParticleSets.push_back(particleSet); 791 NW_ASSERT(isPushed); 792 } 793 794 //! @brief パーティクルセットの先頭を指すイテレータを取得します。 795 //! 796 //! @return パーティクルセットの先頭を指すイテレータです。 797 //! GetParticleSetBegin()798 ParticleSetArray::iterator GetParticleSetBegin() 799 { 800 return m_ParticleSets.begin(); 801 } 802 803 //! @brief パーティクルセットの先頭を指すイテレータを取得します。 804 //! 805 //! @return パーティクルセットの先頭を指すイテレータです。 806 //! GetParticleSetBegin()807 ParticleSetArray::const_iterator GetParticleSetBegin() const 808 { 809 return m_ParticleSets.begin(); 810 } 811 812 //! @brief パーティクルセットの終端を指すイテレータを取得します。 813 //! 814 //! @return パーティクルセットの終端を指すイテレータです。 815 //! GetParticleSetEnd()816 ParticleSetArray::iterator GetParticleSetEnd() 817 { 818 return m_ParticleSets.end(); 819 } 820 821 //! @brief パーティクルセットの終端を指すイテレータを取得します。 822 //! 823 //! @return パーティクルセットの終端を指すイテレータです。 824 //! GetParticleSetEnd()825 ParticleSetArray::const_iterator GetParticleSetEnd() const 826 { 827 return m_ParticleSets.end(); 828 } 829 830 //@} 831 832 //---------------------------------------- 833 //! @name パーティクルエミッタ関連 834 //@{ 835 836 //! @brief パーティクルエミッタを追加します。 837 //! 838 //! @param[in] particleEmitter パーティクルエミッタです。 839 //! PushParticleEmitter(ParticleEmitter * particleEmitter)840 void PushParticleEmitter(ParticleEmitter* particleEmitter) 841 { 842 bool isPushed = m_ParticleEmitters.push_back(particleEmitter); 843 NW_ASSERT(isPushed); 844 } 845 846 //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 847 //! 848 //! @return パーティクルエミッタの先頭を指すイテレータです。 849 //! GetParticleEmitterBegin()850 ParticleEmitterArray::iterator GetParticleEmitterBegin() 851 { 852 return m_ParticleEmitters.begin(); 853 } 854 855 //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 856 //! 857 //! @return パーティクルエミッタの先頭を指すイテレータです。 858 //! GetParticleEmitterBegin()859 ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const 860 { 861 return m_ParticleEmitters.begin(); 862 } 863 864 //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 865 //! 866 //! @return パーティクルエミッタの終端を指すイテレータです。 867 //! GetParticleEmitterEnd()868 ParticleEmitterArray::iterator GetParticleEmitterEnd() 869 { 870 return m_ParticleEmitters.end(); 871 } 872 873 //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 874 //! 875 //! @return パーティクルエミッタの終端を指すイテレータです。 876 //! GetParticleEmitterEnd()877 ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const 878 { 879 return m_ParticleEmitters.end(); 880 } 881 882 //@} 883 884 //---------------------------------------- 885 //! @name パーティクルモデル関連 886 //@{ 887 888 //! @brief パーティクルモデルを追加します。 889 //! 890 //! @param[in] particleModel パーティクルモデルです。 891 //! PushParticleModel(ParticleModel * particleModel)892 void PushParticleModel(ParticleModel* particleModel) 893 { 894 bool isPushed = m_ParticleModels.push_back(particleModel); 895 NW_ASSERT(isPushed); 896 } 897 898 //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 899 //! 900 //! @return パーティクルモデルの先頭を指すイテレータです。 901 //! GetParticleModelBegin()902 ParticleModelArray::iterator GetParticleModelBegin() 903 { 904 return m_ParticleModels.begin(); 905 } 906 907 //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 908 //! 909 //! @return パーティクルモデルの先頭を指すイテレータです。 910 //! GetParticleModelBegin()911 ParticleModelArray::const_iterator GetParticleModelBegin() const 912 { 913 return m_ParticleModels.begin(); 914 } 915 916 //! @brief パーティクルモデルの終端を指すイテレータを取得します。 917 //! 918 //! @return パーティクルモデルの終端を指すイテレータです。 919 //! GetParticleModelEnd()920 ParticleModelArray::iterator GetParticleModelEnd() 921 { 922 return m_ParticleModels.end(); 923 } 924 925 //! @brief パーティクルモデルの終端を指すイテレータを取得します。 926 //! 927 //! @return パーティクルモデルの終端を指すイテレータです。 928 //! GetParticleModelEnd()929 ParticleModelArray::const_iterator GetParticleModelEnd() const 930 { 931 return m_ParticleModels.end(); 932 } 933 934 //@} 935 936 //! @name アニメーション関連 937 //@{ 938 939 //! @brief アニメーションを行うノードを追加します。 940 //! 941 //! アニメーションを行わないノードについては、引数に渡されても無視します。 942 //! 943 //! @param[in] sceneNode アニメーションを行うノードです。 944 //! PushAnimatableNode(SceneNode * sceneNode)945 void PushAnimatableNode(SceneNode* sceneNode) 946 { 947 if (sceneNode->GetAnimBinding() != NULL) 948 { 949 bool isPushed = m_AnimatableNodes.push_back(sceneNode); 950 NW_ASSERT(isPushed); 951 } 952 } 953 954 //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 955 //! 956 //! @return アニメーションを行うノードの先頭を指すイテレータです。 957 //! GetAnimatableNodesBegin()958 AnimatableNodeArray::iterator GetAnimatableNodesBegin() 959 { 960 return m_AnimatableNodes.begin(); 961 } 962 963 //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 964 //! 965 //! @return アニメーションを行うノードの先頭を指すイテレータです。 966 //! GetAnimatableNodesBegin()967 AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const 968 { 969 return m_AnimatableNodes.begin(); 970 } 971 972 //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 973 //! 974 //! @return アニメーションを行うノードの終端を指すイテレータです。 975 //! GetAnimatableNodesEnd()976 AnimatableNodeArray::iterator GetAnimatableNodesEnd() 977 { 978 return m_AnimatableNodes.end(); 979 } 980 981 //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 982 //! 983 //! @return アニメーションを行うノードの終端を指すイテレータです。 984 //! GetAnimatableNodesEnd()985 AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const 986 { 987 return m_AnimatableNodes.end(); 988 } 989 990 //@} 991 992 private: SceneContext(os::IAllocator * allocator,SceneNodeArray sceneNodes,ModelArray models,SkeletalModelArray skeletalModels,CameraArray cameras,FogArray fogs,LightArray lights,FragmentLightArray fragmentLights,VertexLightArray vertexLights,HemiSphereLightArray hemiSphereLights,AmbientLightArray ambientLights,ParticleSetArray particleSets,ParticleEmitterArray particleEmitters,ParticleModelArray particleModels,AnimatableNodeArray animatableNodes)993 SceneContext( 994 os::IAllocator* allocator, 995 SceneNodeArray sceneNodes, 996 ModelArray models, 997 SkeletalModelArray skeletalModels, 998 CameraArray cameras, 999 FogArray fogs, 1000 LightArray lights, 1001 FragmentLightArray fragmentLights, 1002 VertexLightArray vertexLights, 1003 HemiSphereLightArray hemiSphereLights, 1004 AmbientLightArray ambientLights, 1005 ParticleSetArray particleSets, 1006 ParticleEmitterArray particleEmitters, 1007 ParticleModelArray particleModels, 1008 AnimatableNodeArray animatableNodes) 1009 : GfxObject(allocator), 1010 m_SceneNodes(sceneNodes), 1011 m_Models(models), 1012 m_SkeletalModels(skeletalModels), 1013 m_Cameras(cameras), 1014 m_Fogs(fogs), 1015 m_Lights(lights), 1016 m_FragmentLights(fragmentLights), 1017 m_VertexLights(vertexLights), 1018 m_HemiSphereLights(hemiSphereLights), 1019 m_AmbientLights(ambientLights), 1020 m_ParticleSets(particleSets), 1021 m_ParticleEmitters(particleEmitters), 1022 m_ParticleModels(particleModels), 1023 m_AnimatableNodes(animatableNodes) 1024 {} ~SceneContext()1025 virtual ~SceneContext() {} 1026 1027 SceneNodeArray m_SceneNodes; 1028 ModelArray m_Models; 1029 SkeletalModelArray m_SkeletalModels; 1030 CameraArray m_Cameras; 1031 FogArray m_Fogs; 1032 LightArray m_Lights; 1033 FragmentLightArray m_FragmentLights; 1034 VertexLightArray m_VertexLights; 1035 HemiSphereLightArray m_HemiSphereLights; 1036 AmbientLightArray m_AmbientLights; 1037 ParticleSetArray m_ParticleSets; 1038 ParticleEmitterArray m_ParticleEmitters; 1039 ParticleModelArray m_ParticleModels; 1040 AnimatableNodeArray m_AnimatableNodes; 1041 }; 1042 1043 } // namespace gfx 1044 } // namespace nw 1045 1046 #endif // NW_GFX_SCENECONTEXT_H_ 1047